이 기사에서는 JavaScript에서 SHA-1 암호화 알고리즘을 구현하는 방법에 대해 설명합니다. 참조를 위해 공유하십시오. 특정 구현 방법은 다음과 같습니다.
호출 방법 : hex_sha1.
다음과 같이 코드를 복사하십시오 :/*
*
* 정의 된대로 보안 해시 알고리즘 SHA-1의 JavaScript 구현
* FIPS Pub 180-1
*
* Lizq
*
* 2006-11-11
*
*/
/*
*
* 구성 가능한 변수.
*
*/
var hexcase = 0; /* 육각 출력 형식. 0- 소문자; 1- 대문자 */
var chrsz = 8; /* 입력 문자 당 비트. 8 -ASCII; 16- 유니 코드 */
/*
*
* 메시지 다이제스트를 계산하는 주요 함수
*
*/
함수 hex_sha1 (s) {
return binb2hex (Core_sha1 (alignsha1 (s)));
}
/*
*
* VM이 작동하는지 확인하기 위해 간단한 자기 테스트를 수행합니다.
*
*/
함수 SHA1_VM_TEST () {
return hex_sha1 ( "ABC") == "A9993E364706816ABA3E25717850C26C9CD0D89D";
}
/*
*
* 빅 엔디 안 단어 배열의 SHA-1을 계산하고 약간 길이를 계산합니다.
*
*/
함수 core_sha1 (blockarray) {
var x = blockarray; // 패딩을 추가하십시오
var w = 배열 (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];
또 다른
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);
}
새로운 배열 (a, b, c, d, e)을 반환합니다.
}
/*
*
* 현재에 적합한 트리플렛 조합 기능을 수행하십시오.
* 반복
*
* 해당 F 함수의 값을 반환합니다
*
*/
함수 sha1_ft (t, b, c, d) {
if (t <20)
반환 (B & C) | ((~ b) & d);
if (t <40)
반환 b ^ c ^ d;
if (t <60)
반환 (B & C) | (B & D) | (CD);
반환 b ^ c ^ d; // t <80
}
/*
*
* 현재 반복에 적합한 추가 상수를 결정하십시오.
*
* 해당 KT 값을 반환하십시오
*
*/
함수 sha1_kt (t) {
반환 (t <20)? 1518500249 : (T <40)? 1859775393 : (t <60)? -1894007588 : -899497514;
}
/*
*
* 정수를 추가하고 2^32로 감싸십시오. 이는 내부적으로 16 비트 작업을 사용합니다
*
* 일부 JS 통역사의 버그를 해결하기 위해.
*
* 32 비트 번호를 상단 16 비트와 하한 16 비트로 분할하여 Mod 2^32의 추가를 실현합니다.
*
*/
함수 safe_add (x, y) {
var lsw = (x & 0xffff) + (y & 0xfff);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
반환 (MSW << 16) | (LSW & 0xffff);
}
/*
*
* 비트 와이드 32 비트 번호를 왼쪽으로 회전시킵니다.
*
* 32 비트 이진 번호 루프 왼쪽 시프트
*
*/
함수 rol (num, cnt) {
return (num << cnt) | (num >>> (32 -cnt));
}
/*
*
* 표준 SHA1은 블록에 맞게 입력 문자열이 필요합니다.
*
*이 함수는 요구 사항을 충족하도록 입력 문자열을 정렬합니다.
*
*/
함수 alignsha1 (str) {
var nblk = ((str.length + 8) >> 6) + 1, blks = 새로운 배열 (nblk * 16);
for (var i = 0; i <nblk * 16; i ++)
blks [i] = 0;
for (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;
반환 blks;
}
/*
*
* 빅 엔디 언어 단어 배열을 16 진수로 변환하십시오.
*
*/
함수 BINB2HEX (binarray) {
var hex_tab = hexcase? "0123456789ABCDEF": "0123456789ABCDEF";
var str = "";
for (var i = 0; i <binary.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;
}
/*
*
* 입력 한 소스 메시지에 따라 MessageDigest를 계산하십시오
*
*/
함수 calcdigest () {
var digestm = hex_sha1 (document.shaform.sourcemessage.value);
document.shaform.messageDigest.value = digestm;
}
이 기사가 모든 사람의 JavaScript 프로그래밍에 도움이되기를 바랍니다.