SHA-1 in JS

JavaScript, SHA-1, hashing

Jump to: navigation, search

Хеширование SHA-1.

String.prototype.SHA1 = function() {
    var message = this.serialize(), data = [];
    for (var i = 0; i < message.length - 3; i += 4) {
        data.push(message.charCodeAt(i) << 24
                | message.charCodeAt(i + 1) << 16
                | message.charCodeAt(i + 2) << 8
                | message.charCodeAt(i + 3));
    }
    switch(message.length % 4) {
        case 0:
            data.push(0x80000000);
            break;
        case 1:
            data.push(message.charCodeAt(message.length - 1) << 24
                    | 0x800000);
            break;
        case 2:
            data.push(message.charCodeAt(message.length - 2) << 24
                    | message.charCodeAt(message.length - 1) << 16
                    | 0x8000);
            break;
        case 3:
            data.push(message.charCodeAt(message.length - 3) << 24
                    | message.charCodeAt(message.length - 2) << 16
                    | message.charCodeAt(message.length - 1) << 8
                    | 0x80);
    }
    while(data.length % 16 != 14) {
        data.push(0);
    }
    data.push(message.length >>> 29);
    data.push(message.length << 3 & 0xffffffff);
    var h = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];
    for (var i = 0; i < data.length; i += 16) {
        var words = [];
        for (var j = 0; j < 16; ++j) {
            words[j] = data[i + j];
        }
        for (var j = 16; j < 80; ++j) {
            words[j] = (words[j - 3] ^ words[j - 8] ^
                words[j - 14] ^ words[j - 16]).rotl();
        }
        var a = h[0], b = h[1], c = h[2], d = h[3], e = h[4];
        for (var j = 0; j < 20; ++j) {
            var f = (a.rotl(5) + (b & c | ~b & d) + e +
                words[j] + 0x5a827999);
            e = d; d = c; c = b.rotl(30); b = a; a = f;
        }
        for (var j = 20; j < 40; ++j) {
            var f = (a.rotl(5) + (b ^ c ^ d) + e +
                words[j] + 0x6ed9eba1);
            e = d; d = c; c = b.rotl(30); b = a; a = f;
        }
        for (var j = 40; j < 60; ++j) {
            var f = (a.rotl(5) + (b & c | b & d | c & d) + e +
                words[j] + 0x8f1bbcdc);
            e = d; d = c; c = b.rotl(30); b = a; a = f;
        }
        for (var j = 60; j < 80; ++j) {
            var f = (a.rotl(5) + (b ^ c ^ d) + e +
                words[j] + 0xca62c1d6);
            e = d; d = c; c = b.rotl(30); b = a; a = f;
        }
        h[0] += a; h[1] += b; h[2] += c; h[3] += d; h[4] += e;
    }
    var digest = '';
    for (var i = 0; i < 5; ++i) {
        for (var j = 7; j > -1; --j) {
            digest += (h[i] >>> j * 4 & 0xf).toString(16);
        }
    }
    return digest;
};

Personal tools
ссылка