This is a java program to implement MD5 algorithm. The MD5 message-digest algorithm is a widely used cryptographic hash function producing a 128-bit (16-byte) hash value, typically expressed in text format as a 32 digit hexadecimal number. MD5 has been utilized in a wide variety of cryptographic applications, and is also commonly used to verify data integrity.
Here is the source code of the Java Program to Implement the MD5 Algorithm. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.
package com.maixuanviet.setandstring; public class MD5 { private static final int INIT_A = 0x67452301; private static final int INIT_B = (int) 0xEFCDAB89L; private static final int INIT_C = (int) 0x98BADCFEL; private static final int INIT_D = 0x10325476; private static final int[] SHIFT_AMTS = { 7, 12, 17, 22, 5, 9, 14, 20, 4, 11, 16, 23, 6, 10, 15, 21 }; private static final int[] TABLE_T = new int[64]; static { for (int i = 0; i < 64; i++) TABLE_T[i] = (int) (long) ((1L << 32) * Math.abs(Math.sin(i + 1))); } public static byte[] computeMD5(byte[] message) { int messageLenBytes = message.length; int numBlocks = ((messageLenBytes + 8) >>> 6) + 1; int totalLen = numBlocks << 6; byte[] paddingBytes = new byte[totalLen - messageLenBytes]; paddingBytes[0] = (byte) 0x80; long messageLenBits = (long) messageLenBytes << 3; for (int i = 0; i < 8; i++) { paddingBytes[paddingBytes.length - 8 + i] = (byte) messageLenBits; messageLenBits >>>= 8; } int a = INIT_A; int b = INIT_B; int c = INIT_C; int d = INIT_D; int[] buffer = new int[16]; for (int i = 0; i < numBlocks; i++) { int index = i << 6; for (int j = 0; j < 64; j++, index++) buffer[j >>> 2] = ((int) ((index < messageLenBytes) ? message[index] : paddingBytes[index - messageLenBytes]) << 24) | (buffer[j >>> 2] >>> 8); int originalA = a; int originalB = b; int originalC = c; int originalD = d; for (int j = 0; j < 64; j++) { int div16 = j >>> 4; int f = 0; int bufferIndex = j; switch (div16) { case 0: f = (b & c) | (~b & d); break; case 1: f = (b & d) | (c & ~d); bufferIndex = (bufferIndex * 5 + 1) & 0x0F; break; case 2: f = b ^ c ^ d; bufferIndex = (bufferIndex * 3 + 5) & 0x0F; break; case 3: f = c ^ (b | ~d); bufferIndex = (bufferIndex * 7) & 0x0F; break; } int temp = b + Integer.rotateLeft(a + f + buffer[bufferIndex] + TABLE_T[j], SHIFT_AMTS[(div16 << 2) | (j & 3)]); a = d; d = c; c = b; b = temp; } a += originalA; b += originalB; c += originalC; d += originalD; } byte[] md5 = new byte[16]; int count = 0; for (int i = 0; i < 4; i++) { int n = (i == 0) ? a : ((i == 1) ? b : ((i == 2) ? c : d)); for (int j = 0; j < 4; j++) { md5[count++] = (byte) n; n >>>= 8; } } return md5; } public static String toHexString(byte[] b) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < b.length; i++) { sb.append(String.format("%02X", b[i] & 0xFF)); } return sb.toString(); } public static void main(String[] args) { String[] testStrings = { "", "Sanfoundry", "Message Digest", "abcdefghijklmnopqrstuvwxyz" }; for (String s : testStrings) System.out.println("0x" + toHexString(computeMD5(s.getBytes())) + " <== \"" + s + "\""); return; } }
Output:
$ javac MD5.java $ java MD5 0xD41D8CD98F00B204E9800998ECF8427E <== "" 0x123EC1617559F98A4C86AF629FEF21E6 <== "MaiXuanViet" 0xBBD9D8CC4AD8AD2599DBF623E7E5282E <== "Message Digest" 0xC3FCD3D76192E4007DFB496CCA67E13B <== "abcdefghijklmnopqrstuvwxyz"
Related posts:
Java Program to Implement Euler Circuit Problem
HTTP Authentification and CGI/Servlet
The Difference Between Collection.stream().forEach() and Collection.forEach()
Java Program to Permute All Letters of an Input String
Java Program to Implement TreeSet API
Converting a Stack Trace to a String in Java
OAuth2 for a Spring REST API – Handle the Refresh Token in AngularJS
Configure a RestTemplate with RestTemplateBuilder
Deploy a Spring Boot WAR into a Tomcat Server
Phương thức tham chiếu trong Java 8 – Method References
Refactoring Design Pattern với tính năng mới trong Java 8
Java Program to Delete a Particular Node in a Tree Without Using Recursion
Java Program to Implement Sieve Of Eratosthenes
RegEx for matching Date Pattern in Java
Tổng quan về ngôn ngữ lập trình java
Sử dụng CyclicBarrier trong Java
Java TreeMap vs HashMap
Java Program to Implement Gabow Algorithm
Guide to java.util.concurrent.Future
Java Program to Solve any Linear Equations
Java Program to Generate a Sequence of N Characters for a Given Specific Case
Java Program to Implement Ternary Heap
A Guide to Spring Cloud Netflix – Hystrix
Java 8 StringJoiner
Spring WebFlux Filters
Java Program to Implement Hash Tables with Linear Probing
Create a Custom Exception in Java
Lập trình đa luồng với Callable và Future trong Java
Spring Cloud – Adding Angular
Converting String to Stream of chars
Function trong Java 8
Custom JUnit 4 Test Runners