Heim  >  Artikel  >  Web-Frontend  >  So implementieren Sie den SHA-1-Verschlüsselungsalgorithmus in JavaScript_Javascript-Kenntnissen

So implementieren Sie den SHA-1-Verschlüsselungsalgorithmus in JavaScript_Javascript-Kenntnissen

WBOY
WBOYOriginal
2016-05-16 16:10:201745Durchsuche

Das Beispiel in diesem Artikel beschreibt, wie der SHA-1-Verschlüsselungsalgorithmus in JavaScript implementiert wird. Teilen Sie es als Referenz mit allen. Die spezifische Implementierungsmethode lautet wie folgt:

Rufen Sie einfach die Methode auf: hex_sha1.

Code kopieren Der Code lautet wie folgt:
/*
 *
 * Eine JavaScript-Implementierung des Secure Hash-Algorithmus, SHA-1, wie definiert
 * in FIPS PUB 180-1
 *
 * Von lizq
 *
 * 11.11.2006
 *
 */
/*
 *
 * Konfigurierbare Variablen.
 *
 */
var hexcase = 0; /* Hex-Ausgabeformat. 0 – Kleinbuchstabe; 1 – Großbuchstabe */
var chrsz = 8; /* Bits pro Eingabezeichen. 8 - ASCII; 16 – Unicode */
/*
 *
 * Die Hauptfunktion zur Berechnung des Message Digest
 *
 */
Funktion hex_sha1(s){
    return binb2hex(core_sha1(AlignSHA1(s)));
}
/*
 *
 * Führen Sie einen einfachen Selbsttest durch, um zu sehen, ob die VM funktioniert
 *
 */
Funktion sha1_vm_test(){
    return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
}
/*
 *
 * Berechnen Sie den SHA-1 eines Arrays von Big-Endian-Wörtern und eine Bitlänge
 *
 */
Funktion core_sha1(blockArray){
    var x = blockArray; // Polsterung anhängen
    var w = Array(80);
    var a = 1732584193;
    var b = -271733879;
    var c = -1732584194;
    var d = 271733878;
    var e = -1009589776;
    for (var i = 0; i < x.length; i = 16) // 每次处理512位 16*32
    {
        var olda = a;
        var oldb = b;
        var oldc = c;
        var oldd = d;
        var olde = e;
        for (var j = 0; j < 80; j ) // 对每个512位进行80步操作
        {
            if (j < 16)
                w[j] = x[i j];
            sonst
                w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
            var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
            e = d;
            d = c;
            c = rol(b, 30);
            b = a;
            a = t;
        }
        a = safe_add(a, olda);
        b = safe_add(b, oldb);
        c = safe_add(c, oldc);
        d = safe_add(d, oldd);
        e = safe_add(e, olde);
    }
    neues Array(a, b, c, d, e) zurückgeben;
}
/*
 *
 * Führen Sie die entsprechende Triplett-Kombinationsfunktion für den Strom aus
 * Iteration
 *
 * 返回对应F函数的值
 *
 */
Funktion sha1_ft(t, b, c, d){
    wenn (t < 20)
        Rückkehr (b & c) | ((~ b) & d);
    if (t < 40)
        Rückkehr b ^ c ^ d;
    wenn (t < 60)
        Rückkehr (b & c) | (F & T) | (c & d);
    Rückkehr b ^ c ^ d; // t<80
}
/*
 *
 * Bestimmen Sie die entsprechende additive Konstante für die aktuelle Iteration
 *
 * 返回对应的Kt值
 *
 */
Funktion sha1_kt(t){
    return (t < 20)? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;
}
/*
 *
 * Ganzzahlen hinzufügen und bei 2^32 umbrechen. Dabei werden intern 16-Bit-Operationen verwendet
 *
 * um Fehler in einigen JS-Interpretern zu umgehen.
 *
 * 将32位数拆成高16位和低16位分别进行相加, 从而实现 MOD 2^32 的加法
 *
 */
Funktion safe_add(x, y){
    var lsw = (x & 0xFFFF) (y & 0xFFFF);
    var msw = (x >> 16) (y >> 16) (lsw >> 16);
    return (msw << 16) | (lsw & 0xFFFF);
}
/*
 *
 * Eine 32-Bit-Zahl bitweise nach links drehen.
 *
 * 32位二进制数循环左移
 *
 */
Funktion rol(num, cnt){
    return (num << cnt) | (num >>> (32 - cnt));
}
/*
 *
 * Der Standard-SHA1 benötigt die Eingabezeichenfolge, um in einen Block zu passen
 *
 * Diese Funktion richtet die Eingabezeichenfolge so aus, dass sie die Anforderung erfüllt
 *
 */
Funktion AlignSHA1(str){
    var nblk = ((str.length 8) >> 6) 1, blks = new Array(nblk * 16);
    für (var i = 0; i < nblk * 16; i )
        blks[i] = 0;
    für (i = 0; i < str.length; i )
        blks[i >> 2] |= str.charCodeAt(i) << (24 - (i & 3) * 8);
    blks[i >> 2] |= 0x80 << (24 - (i & 3) * 8);
    blks[nblk * 16 - 1] = str.length * 8;
    return blks;
}
/*
 *
 * Konvertieren Sie ein Array von Big-Endian-Wörtern in eine Hex-Zeichenfolge.
 *
 */
Funktion binb2hex(binarray){
    var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    var str = "";
    for (var i = 0; i < binarray.length * 4; i ) {
        str = hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 4)) & 0xF)
        hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);
    }
    return str;
}
/*
 *
 * Berechnen Sie MessageDigest entsprechend der eingegebenen Quellnachricht
 *
 */
Funktion calcDigest(){
    varDigestM = hex_sha1(document.SHAForm.SourceMessage.value);
    document.SHAForm.MessageDigest.value = summaryM;
}

希望本文所述对大家的javascript程序设计有所帮助.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn