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 the Program Used in grep/egrep/fgrep
Guide to Selenium with JUnit / TestNG
New Features in Java 12
Reactive Flow with MongoDB, Kotlin, and Spring WebFlux
Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8?
Encode/Decode to/from Base64
A Guide to WatchService in Java NIO2
Format ZonedDateTime to String
Tìm hiểu về Web Service
Java Program to Implement Fibonacci Heap
Java program to Implement Tree Set
Hướng dẫn Java Design Pattern – Decorator
REST Web service: HTTP Status Code và xử lý ngoại lệ RESTful web service với Jersey 2.x
How to Count Duplicate Elements in Arraylist
HashMap trong Java hoạt động như thế nào?
Removing all Nulls from a List in Java
Java – Reader to InputStream
Integer Constant Pool trong Java
Setting the Java Version in Maven
Java Program to Find SSSP (Single Source Shortest Path) in DAG (Directed Acyclic Graphs)
How to Set TLS Version in Apache HttpClient
Spring Boot Actuator
How to Remove the Last Character of a String?
Java Program to Implement Bucket Sort
Guide to PriorityBlockingQueue in Java
Running Spring Boot Applications With Minikube
Ignore Null Fields with Jackson
Java Program to Implement Graph Coloring Algorithm
How to Kill a Java Thread
Java Program to Implement a Binary Search Algorithm for a Specific Search Sequence
Java Program to Check whether Graph is a Bipartite using 2 Color Algorithm
Xây dựng ứng dụng Client-Server với Socket trong Java