1 、 java 版
pacote com.lyz.utils.common; importar java.io.unsupportEnCodingException; importar java.Security.Messagedigest; importar java.security.nosuchalgorithMexception; / ** * md5 加密 * @author liuyazhuang */ public class md5hash {public static string md5java (string message) {string diger = null; tente {Messagedigest md = Messagedigest.getInstance ("md5"); byte [] hash = md.digest (message.getBytes ("utf-8")); // Convertendo matriz de bytes em string string hexadecimal sb = new StringBuilder (2 * hash.length); para (byte b: hash) {sb.append (string.format ("%02x", b & 0xff)); } digest = sb.toString (); } Catch (UnsupportEdEncodingException Ex) {//Logger.getLogger(StringReplace.class.getName()).Log(Level.severe, null, ex); } catch (nosuchalgorithMexception ex) {//logger.getLogger(StringReplace.class.getName()).Log(level.severe, null, ex); } retornar digestão; } public static void main (string [] args) {System.out.println (md5java ("admin"). touppercase ()); }}2 、 C ++ 代码
(1) md5.h
#include <stdio.h> #include <stdlib.h> #include <lee.h> #include <string.h> void md5Digest (char *pszinput, ninputsize longo não assinado, char *pszOutput);
(2) MD5.CPP
#include <stdio.h> #include <stdlib.h> #include <lee.h> #include <string.h> #include "md5.h" typedef não assinado char *pointer; typedef não assinado short int uint2; typedef não assinado Long Int Uint4; typedef struct {uint4 estado [4]; Uint4 contagem [2]; buffer de char não assinado [64]; } Md5_ctx; void md5init (md5_ctx *); Void md5Update (md5_ctx *, char não assinado *, Int não assinado); Void md5final (char não assinado [16], md5_ctx *); #Define S11 7 #Define S12 12 #Define S13 17 #Define S14 22 #Define S21 5 #Define S22 9 #Define S23 14 #Define S24 20 #Define S31 4 #Define S32 11 #DEFINE S33 16 #Define S34433 #Define 15 #define S44 21 static unsigned char PADDING[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; #Define F (x, y, z) (((x) & (y)) | ((~ x) & (z))) #Define g (x, y, z) (((x) & (z)) | ((y) e (~ z))) #Define H (x, z) (x,, (y) e (~ z))) #Defin (~ z))) #define girate_left (x, n) (((x) << (n)) | ((x) >> (32- (n)))) #define ff (a, b, c, d, x, s, ac) {(a) + = f (b), (c), (d)) + (x) (x) (a) (a) (a) (b), (c), (d)) + (s, x) {(a) + = f (b), (c), (d)) + (x) (x) (a) (a) (a) (a), (b), (d, d, x, s, ac) {(a) + = f (b), (c), (d)) + (x) (x) (a) (a) (a) (a), (b), (d, d, x, s, ac) {(a). (a) = girate_left ((a), (s)); (a) += (b); } #define gg (a, b, c, d, x, s, ac) {(a) + = g ((b), (c), (d)) + (x) + (uint4) (ac); (a) = girate_left ((a), (s)); (a) += (b); } #Define hh (a, b, c, d, x, s, ac) {(a) + = h ((b), (c), (d)) + (x) + (uint4) (ac); (a) = girate_left ((a), (s)); (a) += (b); } #Define II (a, b, c, d, x, s, ac) {(a) + = i ((b), (c), (d)) + (x) + (uint4) (ac); (a) = girate_left ((a), (s)); (a) += (b); } codificação void inline (saída de char *não assinada, entrada uint4 *, não assinada int len) {não assinada int i, j; for (i = 0, j = 0; j <len; i ++, j+= 4) {output [j] = (char não assinado) (entrada [i] e 0xff); saída [j+1] = (char não assinado) ((entrada [i] >> 8) e 0xff); saída [j+2] = (char não assinado) ((entrada [i] >> 16) e 0xff); saída [j+3] = (char não assinado) ((entrada [i] >> 24) e 0xff); }} INLINE VOID decode (UINT4 *saída, entrada de char não assinada *, não assinada int len) {não assinada int i, j; for (i = 0, j = 0; j <len; i ++, j+= 4) saída [i] = ((uint4) entrada [j]) | (((Uint4) entrada [j+1]) << 8) | (((Uint4) entrada [j+2]) << 16) | (((Uint4) entrada [j+3]) << 24); } void em linha md5transform (estado uint4 [4], bloqueio de char não assinado [64]) {uint4 a = estado [0], b = estado [1], c = estado [2], d = estado [3], x [16]; Decodificar (x, bloco, 64); Ff (a, b, c, d, x [0], s11, 0xd76aa478); Ff (d, a, b, c, x [1], s12, 0xe8c7b756); Ff (c, d, a, b, x [2], s13, 0x242070db); Ff (b, c, d, a, x [3], s14, 0xc1bdceee); Ff (a, b, c, d, x [4], s11, 0xf57c0faf); Ff (d, a, b, c, x [5], s12, 0x4787c62a); Ff (C, D, A, B, X [6], S13, 0XA8304613); Ff (b, c, d, a, x [7], s14, 0xfd469501); Ff (a, b, c, d, x [8], s11, 0x698098d8); Ff (d, a, b, c, x [9], s12, 0x8b44f7af); Ff (c, d, a, b, x [10], s13, 0xffff5bb1); Ff (b, c, d, a, x [11], s14, 0x895cd7be); Ff (a, b, c, d, x [12], s11, 0x6b901122); Ff (d, a, b, c, x [13], s12, 0xfd987193); Ff (C, D, A, B, X [14], S13, 0XA679438E); FF (B, C, D, A, X [15], S14, 0x49b40821); Gg (a, b, c, d, x [1], s21, 0xf61e2562); Gg (d, a, b, c, x [6], s22, 0xc040b340); Gg (c, d, a, b, x [11], s23, 0x265e5a51); Gg (b, c, d, a, x [0], s24, 0xe9b6c7aa); Gg (a, b, c, d, x [5], s21, 0xd62f105d); Gg (d, a, b, c, x [10], s22, 0x2441453); Gg (c, d, a, b, x [15], s23, 0xd8a1e681); Gg (b, c, d, a, x [4], s24, 0xe7d3fbc8); Gg (a, b, c, d, x [9], s21, 0x21e1cde6); Gg (d, a, b, c, x [14], s22, 0xc33707d6); Gg (c, d, a, b, x [3], s23, 0xf4d50d87); Gg (b, c, d, a, x [8], s24, 0x455a14ed); GG (A, B, C, D, X [13], S21, 0XA9E3E905); Gg (d, a, b, c, x [2], s22, 0xfcefa3f8); Gg (c, d, a, b, x [7], s23, 0x676f02d9); Gg (b, c, d, a, x [12], s24, 0x8d2a4c8a); Hh (a, b, c, d, x [5], s31, 0xfffa3942); Hh (d, a, b, c, x [8], s32, 0x8771f681); Hh (c, d, a, b, x [11], s33, 0x6d9d6122); Hh (b, c, d, a, x [14], s34, 0xfde5380c); Hh (a, b, c, d, x [1], s31, 0xa4beea44); Hh (d, a, b, c, x [4], s32, 0x4bdecfa9); Hh (c, d, a, b, x [7], s33, 0xf6bb4b60); HH (B, C, D, A, X [10], S34, 0xBeBfbc70); Hh (a, b, c, d, x [13], s31, 0x289b7ec6); Hh (d, a, b, c, x [0], s32, 0Xeaa127fa); Hh (c, d, a, b, x [3], s33, 0xd4ef3085); HH (B, C, D, A, X [6], S34, 0x4881d05); Hh (a, b, c, d, x [9], s31, 0xd9d4d039); Hh (d, a, b, c, x [12], s32, 0xe6db99e5); HH (C, D, A, B, X [15], S33, 0x1fa27cf8); Hh (b, c, d, a, x [2], s34, 0xc4ac5665); Ii (A, B, C, D, X [0], S41, 0xf4292244); Ii (d, a, b, c, x [7], s42, 0x432aff97); Ii (c, d, a, b, x [14], s43, 0xab9423a7); II (B, C, D, A, X [5], S44, 0xfc93a039); Ii (A, B, C, D, X [12], S41, 0x655b59c3); Ii (d, a, b, c, x [3], s42, 0x8f0ccc92); Ii (c, d, a, b, x [10], s43, 0xffeff47d); II (B, C, D, A, X [1], S44, 0x85845dd1); Ii (a, b, c, d, x [8], s41, 0x6fa87e4f); Ii (d, a, b, c, x [15], s42, 0xfe2ce6e0); Ii (C, D, A, B, X [6], S43, 0XA3014314); Ii (b, c, d, a, x [13], s44, 0x4e0811a1); Ii (a, b, c, d, x [4], s41, 0xf7537e82); Ii (d, a, b, c, x [11], s42, 0xbd3af235); Ii (c, d, a, b, x [2], s43, 0x2ad7d2bb); Ii (B, C, D, A, X [9], S44, 0XEB86D391); estado [0] += a; estado [1] += b; estado [2] += c; estado [3] += d; MEMSET ((POINTER) x, 0, sizeof (x)); } Inline void md5init (md5_ctx *context) {context-> count [0] = context-> count [1] = 0; contexto-> estado [0] = 0x67452301; context-> estado [1] = 0xefcdab89; contexto-> estado [2] = 0x98badcfe; contexto-> estado [3] = 0x10325476; } Inline void md5update (MD5_CTX *contexto, entrada de char não assinada *, não assinada int inputlen) {não assinado int i, index, Partlen; índice = (não assinado int) ((contexto-> contagem [0] >> 3) e 0x3f); if ((context-> count [0]+= ((uint4) inputlen << 3)) <((uint4) inputlen << 3)) context-> count [1] ++; context-> contagem [1] += ((uint4) inputlen >> 29); Partlen = 64 - índice; if (inputlen> = Partlen) {memcpy ((ponteiro) & context-> buffer [index], (ponteiro) entrada, Partlen); Md5transform (context-> estado, contexto-> buffer); para (i = Partlen; i + 63 <inputlen; i + = 64) md5transform (context-> state, & input [i]); índice = 0; } else i = 0; memcpy ((ponteiro) e contexto-> buffer [index], (ponteiro) e entrada [i], inputlen-i); } void md5final (não assinado Digest [16], md5_ctx *context) {bits de char não assinado [8]; Índice int não assinado, Padlen; Codificar (bits, context-> count, 8); índice = (não assinado int) ((contexto-> contagem [0] >> 3) e 0x3f); padlen = (índice <56)? (56 - índice): (120 - índice); Md5Update (contexto, preenchimento, padlen); Md5update (contexto, bits, 8); Codificar (Digest, context-> State, 16); Memset (((ponteiro) contexto, 0, sizeof (*context)); } void md5Digest (char *pszinput, ninputsize longo não assinado, char *pszOutput) {md5_ctx context; não assinado int len = strlen (pszinput); Md5init (& context); Md5update (& context, (não assinado char *) pszinput, len); Md5final (((não assinado char *) pszOutput, & context); } main () {char szdigest [16]; Char Encrypt [200]; printf ("请输入要计算 md5 值的字符串:"); recebe (criptografar); printf ("/n 加密结果:"); Md5digest (criptografado, strlen (criptografia), szdigest); int i; for (i = 0; i <16; i ++) printf ("%02x", (char não assinado) szdigest [i]); getchar ();}3 、运行效果
123456 为例
(1) Java 输出结果如下:
(2) C ++ 输出结果如下:
Java 与 c ++ 实现相同的 md5 加密算法简单实例的全部内容了 , 希望对大家有所帮助 , 多多支持武林网 ~