1、 Java 版
แพ็คเกจ com.lyz.utils.Common; นำเข้า java.io.unsupportencodingexception; นำเข้า Java.security.MessageDigest; นำเข้า java.security.nosuchalgorithmexception; / ** * md5 加密 * @author liuyazhuang */ คลาสสาธารณะ md5hash {สตริงคงที่สาธารณะ md5java (ข้อความสตริง) {สตริง digest = null; ลอง {messageGeSest md = messageGeSt.getInstance ("MD5"); ไบต์ [] hash = md.digest (message.getBytes ("UTF-8")); // การแปลงอาร์เรย์ไบต์เป็น hexadecimal string Stringbuilder sb = new StringBuilder (2 * hash.length); สำหรับ (byte b: hash) {sb.append (string.format ("%02x", b & 0xff)); } digest = sb.toString (); } catch (unsupportencodingexception ex) {//logger.getLogger(stringreplace.class.getName()).log(level.severe, Null, Ex); } catch (nosuchalgorithmexception ex) {//logger.getLogger(stringreplace.class.getName()).log(level.severe, Null, Ex); } return digest; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {system.out.println (md5java ("ผู้ดูแลระบบ"). touppercase ()); -2、 C ++ 代码
(1) MD5.H
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> void md5digest (ถ่าน *pszinput, ninputsize ยาวที่ไม่ได้ลงชื่อ, ถ่าน *pszOutput);
(2) MD5.CPP
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include "md5.h" typedef char unsigned *pointer; Typedef สั้น ๆ ที่ไม่ได้ลงนาม Uint2; Typedef unint4 ที่ไม่ได้ลงชื่อ uint4; typedef struct {uint4 state [4]; uint4 นับ [2]; บัฟเฟอร์ถ่านที่ไม่ได้ลงนาม [64]; } md5_ctx; เป็นโมฆะ md5init (md5_ctx *); เป็นโมฆะ MD5UPDATE (MD5_CTX *, ถ่านที่ไม่ได้ลงชื่อ *, int ที่ไม่ได้ลงนาม); เป็นโมฆะ MD5FINAL (ถ่านที่ไม่ได้ลงนาม [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 15 #Define S44 21 ถ่านถ่านที่ไม่ได้ลงชื่อคงที่ [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}; #define f (x, y, z) (((x) & (y)) | ((~ x) & (z))) #define g (x, y, z) (((x) & (z)) | (y) & (~ z)) #define h (x, y, z) (~ z))) #define rotate_left (x, n) (((x) << (n)) | ((x) >> (32- (n)))) #define ff (a, b, c, d, x, s, ac) {(a) + = f (b) (a) = rotate_left ((a), (s)); (a) += (b); } #Define GG (A, B, C, D, X, S, AC) {(A) + = G ((B), (C), (D)) + (X) + (UINT4) (AC); (a) = rotate_left ((a), (s)); (a) += (b); } #Define HH (A, B, C, D, X, S, AC) {(A) + = H ((B), (C), (D)) + (X) + (UINT4) (AC); (a) = rotate_left ((a), (s)); (a) += (b); } #Define II (a, b, c, d, x, s, ac) {(a) + = i ((b), (c), (d)) + (x) + (uint4) (ac); (a) = rotate_left ((a), (s)); (a) += (b); } Inline Void Encode (เอาต์พุตถ่าน *ที่ไม่ได้ลงชื่อ, UINT4 *อินพุต, int len ที่ไม่ได้ลงชื่อ) {int ที่ไม่ได้ลงชื่อ I, J, J; สำหรับ (i = 0, j = 0; j <len; i ++, j+= 4) {output [j] = (ถ่านที่ไม่ได้ลงชื่อ) (อินพุต [i] & 0xff); เอาต์พุต [j+1] = (ถ่านที่ไม่ได้ลงชื่อ) ((อินพุต [i] >> 8) & 0xff); เอาต์พุต [j+2] = (ถ่านที่ไม่ได้ลงชื่อ) ((อินพุต [i] >> 16) & 0xff); เอาต์พุต [j+3] = (ถ่านที่ไม่ได้ลงชื่อ) ((อินพุต [i] >> 24) & 0xff); }} Inline Void Decode (UINT4 *เอาต์พุต, ตัวถ่านที่ไม่ได้ลงชื่อ *อินพุต, int len ที่ไม่ได้ลงชื่อ) {int ที่ไม่ได้ลงชื่อ I, J; สำหรับ (i = 0, j = 0; j <len; i ++, j+= 4) เอาต์พุต [i] = ((uint4) อินพุต [j]) | (((UINT4) อินพุต [J+1]) << 8) | (((UINT4) อินพุต [J+2]) << 16) | (((UINT4) อินพุต [J+3]) << 24); } อินไลน์โมฆะ MD5Transform (UINT4 State [4], บล็อกถ่านที่ไม่ได้ลงนาม [64]) {UINT4 A = สถานะ [0], B = สถานะ [1], C = สถานะ [2], D = State [3], X [16]; ถอดรหัส (x, บล็อก, 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); สถานะ [0] += a; สถานะ [1] += B; สถานะ [2] += C; สถานะ [3] += d; memset ((ตัวชี้) x, 0, sizeof (x)); } Inline Void Md5Init (MD5_CTX *บริบท) {บริบท-> นับ [0] = บริบท-> นับ [1] = 0; บริบท-> สถานะ [0] = 0x67452301; บริบท-> สถานะ [1] = 0xefcDab89; บริบท-> สถานะ [2] = 0x98badcfe; บริบท-> สถานะ [3] = 0x10325476; } Inline Void MD5UPDATE (MD5_CTX *บริบท, ถ่านที่ไม่ได้ลงชื่อ *อินพุต, อินพุต int ที่ไม่ได้ลงนาม) {int ที่ไม่ได้ลงชื่อ IN, INDEX, Partlen; index = (int ที่ไม่ได้ลงนาม) ((บริบท-> นับ [0] >> 3) & 0x3f); if ((บริบท-> นับ [0]+= ((uint4) inputlen << 3)) <((uint4) inputlen << 3)) บริบท-> นับ [1] ++; บริบท-> นับ [1] += ((uint4) inputlen >> 29); partlen = 64 - ดัชนี; if (inputlen> = partlen) {memcpy ((ตัวชี้) & บริบท-> บัฟเฟอร์ [ดัชนี], (ตัวชี้) อินพุต, partlen); md5transform (บริบท-> state, บริบท-> บัฟเฟอร์); สำหรับ (i = partlen; i + 63 <อินพุต; i + = 64) md5transform (บริบท-> สถานะ, & อินพุต [i]); ดัชนี = 0; } else i = 0; memcpy ((ตัวชี้) & บริบท-> บัฟเฟอร์ [ดัชนี], (ตัวชี้) & อินพุต [i], inputlen-i); } อินไลน์โมฆะ MD5FINAL (Char Digest ที่ไม่ได้ลงชื่อ [16], MD5_CTX *บริบท) {บิตถ่านที่ไม่ได้ลงชื่อ [8]; ดัชนี int ที่ไม่ได้ลงชื่อ, พาย; เข้ารหัส (บิต, บริบท-> นับ, 8); index = (int ที่ไม่ได้ลงนาม) ((บริบท-> นับ [0] >> 3) & 0x3f); Padlen = (ดัชนี <56)? (56 - ดัชนี): (120 - ดัชนี); MD5UPDATE (บริบท, พาย, พาย); MD5UPDATE (บริบท, บิต, 8); เข้ารหัส (Digest, บริบท-> สถานะ, 16); memset ((ตัวชี้) บริบท, 0, sizeof (*บริบท)); } void md5digest (ถ่าน *pszinput, ninputsize ยาวที่ไม่ได้ลงชื่อ, ถ่าน *pszOutput) {บริบท MD5_CTX; int ที่ไม่ได้ลงชื่อ LEN = strlen (pszinput); MD5INIT (& บริบท); MD5UPDATE (& บริบท, (ถ่านที่ไม่ได้ลงชื่อ *) PSZINPUT, LEN); md5final ((char *char *) pszoutput, & บริบท); } main () {char szdigest [16]; Char ENCRYPT [200]; printf ("请输入要计算 md5 值的字符串:"); ได้รับ (เข้ารหัส); printf ("/n 加密结果:"); md5digest (เข้ารหัส, strlen (เข้ารหัส), szdigest); int i; สำหรับ (i = 0; i <16; i ++) printf ("%02x", (ถ่านที่ไม่ได้ลงชื่อ) szdigest [i]); getchar ();}3 、运行效果
这里我们都以输入 123456 为例
(1) Java 输出结果如下:
(2) C ++ 输出结果如下:
以上就是小编为大家带来的 Java 与 C ++ 实现相同的 MD5 加密算法简单实例的全部内容了, 希望对大家有所帮助,, 多多支持武林网 ~