Este artículo describe el método para implementar el algoritmo de cifrado SHA-1 en JavaScript. Compártelo para su referencia. El método de implementación específico es el siguiente:
Solo llame al método: hex_sha1.
Copie el código de la siguiente manera:/*
*
* Una implementación de JavaScript del algoritmo de hash seguro, SHA-1, como se define
* En FIPS PUB 180-1
*
* Por Lizq
*
* 2006-11-11
*
*/
/*
*
* Variables configurables.
*
*/
var hexcase = 0; /* Formato de salida hexadecimal. 0 - minúsculas; 1 - mayúscula */
var chrsz = 8; /* bits por carácter de entrada. 8 - ASCII; 16 - Unicode */
/*
*
* La función principal para calcular el resumen de mensajes
*
*/
función hex_sha1 (s) {
return binb2hex (core_sha1 (alignsha1 (s)));
}
/*
*
* Realice una autoevaluación simple para ver si la VM está funcionando
*
*/
función sha1_vm_test () {
return hex_sha1 ("ABC") == "A9993E364706816ABA3E25717850C26C9CD0D89D";
}
/*
*
* Calcule el SHA-1 de una matriz de palabras grandes y finales, y un poco de longitud
*
*/
función core_sha1 (blockarray) {
var x = blockarray; // Agregar relleno
var w = matriz (80);
var a = 1732584193;
var b = -2717333879;
var c = -1732584194;
var d = 2717333878;
var e = -1009589776;
para (var i = 0; i <x.length; i += 16) // 512-bit 16*32 procesamiento cada vez
{
var OldA = a;
var Oldb = b;
var OldC = C;
var Oldd = D;
var Olde = E;
para (var j = 0; j <80; j ++) // realizar 80 pasos para cada 512 bits
{
if (j <16)
w [j] = x [i + j];
demás
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);
}
devolver una nueva matriz (a, b, c, d, e);
}
/*
*
* Realice la función de combinación de triplete apropiada para la corriente
* iteración
*
* Devuelve el valor de la función F correspondiente
*
*/
función sha1_ft (t, b, c, d) {
if (t <20)
Return (B&C) | ((~ b) & d);
if (t <40)
regreso b ^ c ^ d;
if (t <60)
Return (B&C) | (B&D) | (cd);
regreso b ^ c ^ d; // t <80
}
/*
*
* Determine la constante adicional apropiada para la iteración actual
*
* Devolver el valor KT correspondiente
*
*/
función sha1_kt (t) {
return (t <20)? 1518500249: (t <40)? 1859775393: (t <60)? -1894007588: -899497514;
}
/*
*
* Agregue enteros, envolviendo a 2^32. Esto usa operaciones de 16 bits internamente
*
* Trabajar alrededor de errores en algunos intérpretes JS.
*
* Divida el número de 32 bits en el superior de 16 bits y el inferior de 16 bits respectivamente para su adición, dando así la adición de Mod 2^32
*
*/
función safe_add (x, y) {
var lsw = (x & 0xffff) + (y & 0xfff);
var msw = (x >> 16) + (y >> 16) + (LSW >> 16);
Return (MSW << 16) | (LSW y 0xffff);
}
/*
*
* Gire bit a bits un número de 32 bits a la izquierda.
*
* Bucle de número binario de 32 bits desplazamiento a la izquierda
*
*/
function rol (num, cnt) {
return (num << cnt) | (num >>> (32 - CNT));
}
/*
*
* El SHA1 estándar necesita la cadena de entrada para caber en un bloque
*
* Esta función alinee la cadena de entrada para cumplir con el requisito
*
*/
función alignsha1 (str) {
var nblk = ((str.length + 8) >> 6) + 1, blks = nueva matriz (nblk * 16);
para (var i = 0; i <nblk * 16; i ++)
blks [i] = 0;
para (i = 0; i <str.length; i ++)
blks [i >> 2] | = str.charcodeat (i) << (24 - (i y 3) * 8);
blks [i >> 2] | = 0x80 << (24 - (i y 3) * 8);
Blks [nblk * 16 - 1] = str.length * 8;
regresar blks;
}
/*
*
* Convierta una matriz de palabras endianas a una cadena hexadecimal.
*
*/
función binb2hex (binarray) {
var hex_tab = hexcase? "0123456789ABCDEF": "0123456789ABCDEF";
var str = "";
para (var i = 0; i <binary.length * 4; i ++) {
str + = hex_tab.charat ((binarray [i >> 2] >> ((3 - i % 4) * 8 + 4)) y 0xf) +
hex_tab.charat ((binarray [i >> 2] >> ((3 - i % 4) * 8)) y 0xf);
}
regresar str;
}
/*
*
* Calcule MessageDigest de acuerdo con el mensaje fuente que ingresó
*
*/
función calcDigest () {
var digestm = hex_sha1 (document.shaform.sourcemessage.value);
document.shaform.messagedigest.value = digestm;
}
Espero que este artículo sea útil para la programación de JavaScript de todos.