Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function md5(str, rawOutput){
- // Algorithmus aus http://de.wikipedia.org/wiki/Message-Digest_Algorithm_5
- var btes;
- if (typeof str === "string" || str instanceof String){
- // Byteweises einlesen des Eingabestrings
- btes = [];
- for (var i = 0; i < str.length; i++){
- var chr = str.charCodeAt(i);
- while (chr > 255){
- var helpChr = chr;
- var rot = 0;
- while (helpChr > 255){
- helpChr >>= 8;
- rot++;
- }
- btes.push(helpChr);
- chr = chr & ((1<<(rot*8)) - 1);
- }
- btes.push(chr);
- }
- }
- else {
- btes = Array.prototype.slice.call(str);
- }
- var r = [
- 7, 12, 17, 22, 7, 12, 17, 22, 7, 12,
- 17, 22, 7, 12, 17, 22, 5, 9, 14, 20,
- 5, 9, 14, 20, 5, 9, 14, 20, 5, 9,
- 14, 20, 4, 11, 16, 23, 4, 11, 16, 23,
- 4, 11, 16, 23, 4, 11, 16, 23, 6, 10,
- 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,
- 6, 10, 15, 21
- ];
- /*
- var bitLength = 0xFFFFFFFF + 1;
- var k = new Array(64);
- for (var i = 0; i < 64; i++){
- k[i] = int32(Math.floor(Math.abs(Math.sin(i + 1) * bitLength)));
- }
- /* Nachfolgende Zeile koennte vielleicht etwas performanter sein, da nichts berechnet werden muss - das Ergebnis ist das selbe.*/
- var k = [
- 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf,
- 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af,
- 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e,
- 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
- 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6,
- 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8,
- 0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122,
- 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
- 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039,
- 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97,
- 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d,
- 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
- 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
- ];
- var h0 = 0x67452301;
- var h1 = 0xEFCDAB89;
- var h2 = 0x98BADCFE;
- var h3 = 0x10325476;
- var messageBitLength = btes.length * 8;
- btes.push(0x80);
- while(btes.length % 64 !== 56){
- btes.push(0);
- }
- for (var i = 0; i < 8; i++){
- var bte = messageBitLength & 255;
- btes.push(bte);
- messageBitLength >>>= 8;
- }
- for (var i = 0; i < btes.length; i += 64){
- var w = new Array(16);
- for (var j = 0; j < 16; j++){
- w[j] = int32(
- int32(btes[i + 3 + (j*4)] << 24) |
- int32(btes[i + 2 + (j*4)] << 16) |
- int32(btes[i + 1 + (j*4)] << 8 ) |
- int32(btes[i + 0 + (j*4)] << 0 )
- );
- }
- var a = h0;
- var b = h1;
- var c = h2;
- var d = h3;
- var f, g;
- for (var j = 0; j < 64; j++){
- if (j < 16){
- //f = int32(int32(b & c) | int32(int32(~b) & d)); // Originalverarbeitung
- f = int32(d ^ int32(b & int32(c ^ d)));
- g = j;
- }
- else if (j < 32){
- //f = int32(int32(b & d) | int32(c & int32(~d))); // Originalverarbeitung
- f = int32(c ^ int32(d & int32(b ^ c)));
- g = (5*j + 1) % 16;
- }
- else if (j < 48){
- f = int32(int32(b ^ c) ^ d);
- g = (3*j + 5) % 16;
- }
- else {
- f = int32(c ^ int32(b | int32(~ d)));
- g = (7*j) % 16;
- }
- var temp = d;
- d = c;
- c = b;
- b = int32(leftRotate(a + f + k[j] + w[g], r[j]) + b);
- a = temp;
- }
- h0 = int32(h0 + a);
- h1 = int32(h1 + b);
- h2 = int32(h2 + c);
- h3 = int32(h3 + d);
- }
- if (rawOutput){
- return toLittleEndian(h0) +
- toLittleEndian(h1) +
- toLittleEndian(h2) +
- toLittleEndian(h3);
- }
- else {
- return reverse(toHex(h0, 8), 2) + reverse(toHex(h1, 8), 2) + reverse(toHex(h2, 8), 2) + reverse(toHex(h3, 8), 2);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement