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:
A Guide to Java SynchronousQueue
Send an email using the SMTP protocol
ArrayList trong java
ETL with Spring Cloud Data Flow
Spring Boot - Bootstrapping
Lớp Collectors trong Java 8
Java Program to find the number of occurrences of a given number using Binary Search approach
Java 8 Predicate Chain
Java Program to Implement Fisher-Yates Algorithm for Array Shuffling
Java Program to Implement Binary Heap
Java Program to Perform Left Rotation on a Binary Search Tree
Using JWT with Spring Security OAuth
Simple Single Sign-On with Spring Security OAuth2
String Joiner trong Java 8
Ways to Iterate Over a List in Java
Java Program to Implement LinkedHashSet API
Java Program to Implement VList
Java Program to Implement ArrayList API
Java Program to Implement Queue
Java Program to Perform the Shaker Sort
Java Program to Implement Sorted Circular Doubly Linked List
Adding Parameters to HttpClient Requests
Java Program to Perform Postorder Recursive Traversal of a Given Binary Tree
Java Program to Check Whether it is Weakly Connected or Strongly Connected for a Directed Graph
Java IO vs NIO
Java Program to Implement Wagner and Fisher Algorithm for online String Matching
Java Program to Implement Treap
Java Program to Implement Fenwick Tree
Java Program to Find Minimum Number of Edges to Cut to make the Graph Disconnected
Debug a JavaMail Program
Guide to java.util.concurrent.BlockingQueue
Spring NoSuchBeanDefinitionException