MD5 加密
MD5 算法源码(Java版):public class MD5 {/* * Convert a 32-bit number to a hex string with ls-byte first */String hex_chr = "0123456789abcdef";private String rhex(int num) {String str = "";for (int j = 0; j <= 3; j++)str = str + hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F)+ hex_chr.charAt((num >> (j * 8)) & 0x0F);return str;}/* * Convert a string to a sequence of 16-word blocks, stored as an array. * Append padding bits and the length, as described in the MD5 standard. */private int[] str2blks_MD5(String str) {int nblk = ((str.length() + 8) >> 6) + 1;int[] blks = new int;int i = 0;for (i = 0; i < nblk * 16; i++) {blks = 0;}for (i = 0; i < str.length(); i++) {blks |= str.charAt(i) << ((i % 4) * 8);}blks |= 0x80 << ((i % 4) * 8);blks = str.length() * 8;return blks;}/* * Add integers, wrapping at 2^32 */private int add(int x, int y) {return ((x & 0x7FFFFFFF) + (y & 0x7FFFFFFF)) ^ (x & 0x80000000)^ (y & 0x80000000);}/* * Bitwise rotate a 32-bit number to the left */private int rol(int num, int cnt) {return (num << cnt) | (num >>> (32 - cnt));}/* * These functions implement the basic operation for each round of the * algorithm. */private int cmn(int q, int a, int b, int x, int s, int t) {return add(rol(add(add(a, q), add(x, t)), s), b);}private int ff(int a, int b, int c, int d, int x, int s, int t) {return cmn((b & c) | ((~b) & d), a, b, x, s, t);}private int gg(int a, int b, int c, int d, int x, int s, int t) {return cmn((b & d) | (c & (~d)), a, b, x, s, t);}private int hh(int a, int b, int c, int d, int x, int s, int t) {return cmn(b ^ c ^ d, a, b, x, s, t);}private int ii(int a, int b, int c, int d, int x, int s, int t) {return cmn(c ^ (b | (~d)), a, b, x, s, t);}/* * Take a string and return the hex representation of its MD5. */public String calcMD5(String str) {int[] x = str2blks_MD5(str);int a = 0x67452301;int b = 0xEFCDAB89;int c = 0x98BADCFE;int d = 0x10325476;for (int i = 0; i < x.length; i += 16) {int olda = a;int oldb = b;int oldc = c;int oldd = d;a = ff(a, b, c, d, x, 7, 0xD76AA478);d = ff(d, a, b, c, x, 12, 0xE8C7B756);c = ff(c, d, a, b, x, 17, 0x242070DB);b = ff(b, c, d, a, x, 22, 0xC1BDCEEE);a = ff(a, b, c, d, x, 7, 0xF57C0FAF);d = ff(d, a, b, c, x, 12, 0x4787C62A);c = ff(c, d, a, b, x, 17, 0xA8304613);b = ff(b, c, d, a, x, 22, 0xFD469501);a = ff(a, b, c, d, x, 7, 0x698098D8);d = ff(d, a, b, c, x, 12, 0x8B44F7AF);c = ff(c, d, a, b, x, 17, 0xFFFF5BB1);b = ff(b, c, d, a, x, 22, 0x895CD7BE);a = ff(a, b, c, d, x, 7, 0x6B901122);d = ff(d, a, b, c, x, 12, 0xFD987193);c = ff(c, d, a, b, x, 17, 0xA679438E);b = ff(b, c, d, a, x, 22, 0x49B40821);a = gg(a, b, c, d, x, 5, 0xF61E2562);d = gg(d, a, b, c, x, 9, 0xC040B340);c = gg(c, d, a, b, x, 14, 0x265E5A51);b = gg(b, c, d, a, x, 20, 0xE9B6C7AA);a = gg(a, b, c, d, x, 5, 0xD62F105D);d = gg(d, a, b, c, x, 9, 0x02441453);c = gg(c, d, a, b, x, 14, 0xD8A1E681);b = gg(b, c, d, a, x, 20, 0xE7D3FBC8);a = gg(a, b, c, d, x, 5, 0x21E1CDE6);d = gg(d, a, b, c, x, 9, 0xC33707D6);c = gg(c, d, a, b, x, 14, 0xF4D50D87);b = gg(b, c, d, a, x, 20, 0x455A14ED);a = gg(a, b, c, d, x, 5, 0xA9E3E905);d = gg(d, a, b, c, x, 9, 0xFCEFA3F8);c = gg(c, d, a, b, x, 14, 0x676F02D9);b = gg(b, c, d, a, x, 20, 0x8D2A4C8A);a = hh(a, b, c, d, x, 4, 0xFFFA3942);d = hh(d, a, b, c, x, 11, 0x8771F681);c = hh(c, d, a, b, x, 16, 0x6D9D6122);b = hh(b, c, d, a, x, 23, 0xFDE5380C);a = hh(a, b, c, d, x, 4, 0xA4BEEA44);d = hh(d, a, b, c, x, 11, 0x4BDECFA9);c = hh(c, d, a, b, x, 16, 0xF6BB4B60);b = hh(b, c, d, a, x, 23, 0xBEBFBC70);a = hh(a, b, c, d, x, 4, 0x289B7EC6);d = hh(d, a, b, c, x, 11, 0xEAA127FA);c = hh(c, d, a, b, x, 16, 0xD4EF3085);b = hh(b, c, d, a, x, 23, 0x04881D05);a = hh(a, b, c, d, x, 4, 0xD9D4D039);d = hh(d, a, b, c, x, 11, 0xE6DB99E5);c = hh(c, d, a, b, x, 16, 0x1FA27CF8);b = hh(b, c, d, a, x, 23, 0xC4AC5665);a = ii(a, b, c, d, x, 6, 0xF4292244);d = ii(d, a, b, c, x, 10, 0x432AFF97);c = ii(c, d, a, b, x, 15, 0xAB9423A7);b = ii(b, c, d, a, x, 21, 0xFC93A039);a = ii(a, b, c, d, x, 6, 0x655B59C3);d = ii(d, a, b, c, x, 10, 0x8F0CCC92);c = ii(c, d, a, b, x, 15, 0xFFEFF47D);b = ii(b, c, d, a, x, 21, 0x85845DD1);a = ii(a, b, c, d, x, 6, 0x6FA87E4F);d = ii(d, a, b, c, x, 10, 0xFE2CE6E0);c = ii(c, d, a, b, x, 15, 0xA3014314);b = ii(b, c, d, a, x, 21, 0x4E0811A1);a = ii(a, b, c, d, x, 6, 0xF7537E82);d = ii(d, a, b, c, x, 10, 0xBD3AF235);c = ii(c, d, a, b, x, 15, 0x2AD7D2BB);b = ii(b, c, d, a, x, 21, 0xEB86D391);a = add(a, olda);b = add(b, oldb);c = add(c, oldc);d = add(d, oldd);}return rhex(a) + rhex(b) + rhex(c) + rhex(d);}}
测试类:
public class MD5_Test {public static void main(String[] args) {MD5 m = new MD5();System.out.println(m.calcMD5("123456"));}}
MD5 算法源码(Flex版):
package com.my.commons {import flash.utils.Endian;/** * Contains reusable methods for operations pertaining * to int values. */public class IntUtil {/** * Rotates x left n bits * * @langversion ActionScript 3.0 * @playerversion Flash 9.0 * @tiptext */public static function rol(x : int, n : int) : int {return (x << n) | (x >>> (32 - n));}/** * Rotates x right n bits * * @langversion ActionScript 3.0 * @playerversion Flash 9.0 * @tiptext */public static function ror(x : int, n : int) : uint {var nn : int = 32 - n;return (x << nn) | (x >>> (32 - nn));}/** String for quick lookup of a hex character based on index */private static var hexChars : String = "0123456789abcdef";/** * Outputs the hex value of a int, allowing the developer to specify * the endinaness in the process.Hex output is lowercase. * * @param n The int value to output as hex * @param bigEndian Flag to output the int as big or little endian * @return A string of length 8 corresponding to the *hex representation of n ( minus the leading "0x" ) * @langversion ActionScript 3.0 * @playerversion Flash 9.0 * @tiptext */public static function toHex(n : int, bigEndian : Boolean = false) : String {var s : String = "";if (bigEndian) {for (var i : int = 0; i < 4; i++) {s += hexChars.charAt((n >> ((3 - i) * 8 + 4)) & 0xF) + hexChars.charAt((n >> ((3 - i) * 8)) & 0xF);}} else {for (var x : int = 0; x < 4; x++) {s += hexChars.charAt((n >> (x * 8 + 4)) & 0xF) + hexChars.charAt((n >> (x * 8)) & 0xF);}}return s;}}}
package com.my.commons {import flash.utils.ByteArray;/** * The MD5 Message-Digest Algorithm * * Implementation based on algorithm description at* http://www.faqs.org/rfcs/rfc1321.html */public class MD5 {public static var digest:ByteArray;/** * Performs the MD5 hash algorithm on a string. * * @param s The string to hash * @return A string containing the hash value of s * @langversion ActionScript 3.0 * @playerversion Flash 8.5 * @tiptext */public static function hash(s:String) :String{//Convert to byteArray and send through hashBinary function// so as to only have complex code in one locationvar ba:ByteArray = new ByteArray();ba.writeUTFBytes(s);return hashBinary(ba);}public static function hashBytes(s:ByteArray) :String{return hashBinary(s);}/** * Performs the MD5 hash algorithm on a ByteArray. * * @param s The string to hash * @return A string containing the hash value of s * @langversion ActionScript 3.0 * @playerversion Flash 8.5 * @tiptext */ public static function hashBinary( s:ByteArray ):String {// initialize the md buffersvar a:int = 1732584193;var b:int = -271733879;var c:int = -1732584194;var d:int = 271733878;// variables to store previous valuesvar aa:int;var bb:int;var cc:int;var dd:int;// create the blocks from the string and// save the length as a local var to reduce// lookup in the loop belowvar x:Array = createBlocks( s );var len:int = x.length;// loop over all of the blocksfor ( var i:int = 0; i < len; i += 16) {// save previous valuesaa = a;bb = b;cc = c;dd = d;// Round 1a = ff( a, b, c, d, x,7, -680876936 ); // 1d = ff( d, a, b, c, x, 12, -389564586 );// 2c = ff( c, d, a, b, x, 17, 606105819 ); // 3b = ff( b, c, d, a, x, 22, -1044525330 );// 4a = ff( a, b, c, d, x,7, -176418897 ); // 5d = ff( d, a, b, c, x, 12, 1200080426 ); // 6c = ff( c, d, a, b, x, 17, -1473231341 );// 7b = ff( b, c, d, a, x, 22, -45705983 ); // 8a = ff( a, b, c, d, x,7, 1770035416 ); // 9d = ff( d, a, b, c, x, 12, -1958414417 );// 10c = ff( c, d, a, b, x, 17, -42063 ); // 11b = ff( b, c, d, a, x, 22, -1990404162 );// 12a = ff( a, b, c, d, x,7, 1804603682 ); // 13d = ff( d, a, b, c, x, 12, -40341101 ); // 14c = ff( c, d, a, b, x, 17, -1502002290 );// 15b = ff( b, c, d, a, x, 22, 1236535329 ); // 16// Round 2a = gg( a, b, c, d, x,5, -165796510 ); // 17d = gg( d, a, b, c, x,9, -1069501632 );// 18c = gg( c, d, a, b, x, 14, 643717713 ); // 19b = gg( b, c, d, a, x, 20, -373897302 ); // 20a = gg( a, b, c, d, x,5, -701558691 ); // 21d = gg( d, a, b, c, x,9, 38016083 ); // 22c = gg( c, d, a, b, x, 14, -660478335 ); // 23b = gg( b, c, d, a, x, 20, -405537848 ); // 24a = gg( a, b, c, d, x,5, 568446438 ); // 25d = gg( d, a, b, c, x,9, -1019803690 );// 26c = gg( c, d, a, b, x, 14, -187363961 ); // 27b = gg( b, c, d, a, x, 20, 1163531501 ); // 28a = gg( a, b, c, d, x,5, -1444681467 );// 29d = gg( d, a, b, c, x,9, -51403784 ); // 30c = gg( c, d, a, b, x, 14, 1735328473 ); // 31b = gg( b, c, d, a, x, 20, -1926607734 );// 32// Round 3a = hh( a, b, c, d, x,4, -378558 ); // 33d = hh( d, a, b, c, x, 11, -2022574463 );// 34c = hh( c, d, a, b, x, 16, 1839030562 ); // 35b = hh( b, c, d, a, x, 23, -35309556 ); // 36a = hh( a, b, c, d, x,4, -1530992060 );// 37d = hh( d, a, b, c, x, 11, 1272893353 ); // 38c = hh( c, d, a, b, x, 16, -155497632 ); // 39b = hh( b, c, d, a, x, 23, -1094730640 );// 40a = hh( a, b, c, d, x,4, 681279174 ); // 41d = hh( d, a, b, c, x, 11, -358537222 ); // 42c = hh( c, d, a, b, x, 16, -722521979 ); // 43b = hh( b, c, d, a, x, 23, 76029189 ); // 44a = hh( a, b, c, d, x,4, -640364487 ); // 45d = hh( d, a, b, c, x, 11, -421815835 ); // 46c = hh( c, d, a, b, x, 16, 530742520 ); // 47b = hh( b, c, d, a, x, 23, -995338651 ); // 48// Round 4a = ii( a, b, c, d, x,6, -198630844 ); // 49d = ii( d, a, b, c, x, 10, 1126891415 ); // 50c = ii( c, d, a, b, x, 15, -1416354905 );// 51b = ii( b, c, d, a, x, 21, -57434055 ); // 52a = ii( a, b, c, d, x,6, 1700485571 ); // 53d = ii( d, a, b, c, x, 10, -1894986606 );// 54c = ii( c, d, a, b, x, 15, -1051523 ); // 55b = ii( b, c, d, a, x, 21, -2054922799 );// 56a = ii( a, b, c, d, x,6, 1873313359 ); // 57d = ii( d, a, b, c, x, 10, -30611744 ); // 58c = ii( c, d, a, b, x, 15, -1560198380 );// 59b = ii( b, c, d, a, x, 21, 1309151649 ); // 60a = ii( a, b, c, d, x,6, -145523070 ); // 61d = ii( d, a, b, c, x, 10, -1120210379 );// 62c = ii( c, d, a, b, x, 15, 718787259 ); // 63b = ii( b, c, d, a, x, 21, -343485551 ); // 64a += aa;b += bb;c += cc;d += dd;}digest = new ByteArray()digest.writeInt(a);digest.writeInt(b);digest.writeInt(c);digest.writeInt(d);digest.position = 0;// Finish up by concatening the buffers with their hex outputreturn IntUtil.toHex( a ) + IntUtil.toHex( b ) + IntUtil.toHex( c ) + IntUtil.toHex( d );}/** * Auxiliary function f as defined in RFC */private static function f( x:int, y:int, z:int ):int {return ( x & y ) | ( (~x) & z );}/** * Auxiliary function g as defined in RFC */private static function g( x:int, y:int, z:int ):int {return ( x & z ) | ( y & (~z) );}/** * Auxiliary function h as defined in RFC */private static function h( x:int, y:int, z:int ):int {return x ^ y ^ z;}/** * Auxiliary function i as defined in RFC */private static function i( x:int, y:int, z:int ):int {return y ^ ( x | (~z) );}/** * A generic transformation function.The logic of ff, gg, hh, and * ii are all the same, minus the function used, so pull that logic * out and simplify the method bodies for the transoformation functions. */private static function transform( func:Function, a:int, b:int, c:int, d:int, x:int, s:int, t:int):int {var tmp:int = a + int( func( b, c, d ) ) + x + t;return IntUtil.rol( tmp, s ) +b;}/** * ff transformation function */private static function ff ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {return transform( f, a, b, c, d, x, s, t );}/** * gg transformation function */private static function gg ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {return transform( g, a, b, c, d, x, s, t );}/** * hh transformation function */private static function hh ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {return transform( h, a, b, c, d, x, s, t );}/** * ii transformation function */private static function ii ( a:int, b:int, c:int, d:int, x:int, s:int, t:int ):int {return transform( i, a, b, c, d, x, s, t );}/** * Converts a string to a sequence of 16-word blocks * that we'll do the processing on.Appends padding * and length in the process. * * @param s The string to split into blocks * @return An array containing the blocks that s was *split into. */private static function createBlocks( s:ByteArray ):Array {var blocks:Array = new Array();var len:int = s.length * 8;var mask:int = 0xFF; // ignore hi byte of characters > 0xFFfor( var i:int = 0; i < len; i += 8 ) {blocks[ int(i >> 5) ] |= ( s[ i / 8 ] & mask ) << ( i % 32 );}// append padding and lengthblocks[ int(len >> 5) ] |= 0x80 << ( len % 32 );blocks[ int(( ( ( len + 64 ) >>> 9 ) << 4 ) + 14) ] = len;return blocks;}}}
测试类:
public function init():void{Alert.show(MD5.hash("123456"));}
页:
[1]