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:
Spring Cloud AWS – S3
Spring Boot - Database Handling
Spring WebClient Requests with Parameters
Java Program to Find the Longest Subsequence Common to All Sequences in a Set of Sequences
Guide to the Java ArrayList
Quick Intro to Spring Cloud Configuration
Java Program to implement Bit Set
Spring Boot Annotations
Java Program to Implement ConcurrentHashMap API
Java Program to Implement Graph Structured Stack
Spring Security 5 – OAuth2 Login
Java Program to Generate All Subsets of a Given Set in the Gray Code Order
Java Program to Perform Finite State Automaton based Search
Spring Boot - Bootstrapping
Phương thức forEach() trong java 8
Java Program to Find kth Smallest Element by the Method of Partitioning the Array
Using Spring @ResponseStatus to Set HTTP Status Code
Overview of Spring Boot Dev Tools
Custom Error Pages with Spring MVC
Java Program to Implement Sorting of Less than 100 Numbers in O(n) Complexity
The Thread.join() Method in Java
Java Program to Implement LinkedBlockingDeque API
Java Program to Implement Interpolation Search Algorithm
Handling URL Encoded Form Data in Spring REST
Get the workstation name or IP
Hướng dẫn Java Design Pattern – Iterator
Convert XML to JSON Using Jackson
Setting a Request Timeout for a Spring REST API
Comparing Two HashMaps in Java
Hướng dẫn tạo và sử dụng ThreadPool trong Java
Show Hibernate/JPA SQL Statements from Spring Boot
Spring @RequestMapping New Shortcut Annotations