이 기사에서는 Java에서 SHA-1 알고리즘을 구현하는 방법에 대해 설명합니다. 참조를 위해 공유하십시오. 특정 구현 방법은 다음과 같습니다.
다음과 같이 코드를 복사하십시오 : 공개 클래스 sha1util {
개인 정적 최종 부울 헥스 케이스 = 거짓;
개인 정적 최종 문자열 b64pad = "=";
개인 정적 최종 int chrsz = 8;
// 문자열의 SHA-1 값을 얻는 메소드
public static String hex_sha1 (문자열 s) {
s = (s == null) ": s;
return binb2hex (core_sha1 (str2binb (s), s.length () * chrsz);
}
공개 정적 문자열 b64_hmac_sha1 (문자열 키, 문자열 데이터) {
return binb2b64 (core_hmac_sha1 (키, 데이터));
}
공개 정적 문자열 b64_sha1 (문자열 s) {
s = (s == null) ": s;
return binb2b64 (core_sha1 (str2binb (s), s.length () * chrsz);
}
개인 정적 문자열 binb2b64 (int [] binarray) {
문자열 tab = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/";
문자열 str = "";
binarray = strechbinarray (binarray, binarray.length * 4);
for (int i = 0; i <binary.length * 4; i += 3) {
int triplet = ((Binarray [i >> 2] >> 8 * (3- i % 4)) & 0xff) << 16)
| (((binarray [i + 1 >> 2] >> 8 * (3- (i + 1) % 4)) & 0xff) << 8)
((Binarray [i + 2 >> 2] >> 8 * (3- (i + 2) % 4)) & 0xff);
for (int j = 0; j <4; j ++) {
if (i * 8 + j * 6> binary.length * 32) {
str += b64pad;
} 또 다른 {
str += tab.charat ((트리플렛 >> 6 * (3 -J)) & 0x3f);
}
}
}
CleanB64St (str)를 반환합니다.
}
개인 정적 문자열 binb2Hex (int [] binarray) {
문자열 hex_tab = hexcase? "0123456789ABCDEF": "0123456789ABCDEF";
문자열 str = "";
for (int i = 0; i <binary.length * 4; i ++) {
char a = (char) hex_tab.charat ((binarray [i >> 2] >> ((3 -i % 4) * 8 + 4)) & 0xf);
char b = (char) hex_tab.charat ((binarray [i >> 2] >> ((3- i % 4) * 8)) & 0xf);
str + = (새로운 문자 (a) .toString () + new 문자 (b) .toString ());
}
Return str;
}
개인 정적 문자열 binb2str (int [] bin) {
문자열 str = "";
int mask = (1 << chrsz) -1;
for (int i = 0; i <bin.length * 32; i += chrsz) {
str += (char) (bin [i >> 5] >>> (24 -i % 32)) & 마스크);
}
Return str;
}
개인 정적 int bit_rol (int num, int cnt) {
return (num << cnt) | (num >>> (32 -cnt);
}
개인 정적 문자열 cleanb64str (String str) {
str = (str == null) ": str;
int len = str.length ();
if (len <= 1) {
Return str;
}
char trailchar = str.charat (len -1);
문자열 trailstr = "";
for (int i = len-1; i> = 0 && str.charat (i) == trailchar; i-) {
trailstr += str.charat (i);
}
return str.substring (0, str.indexof (trailstr));
}
개인 정적 int [] complete216 (int [] oldbin) {
if (oldbin.length> = 16) {
Oldbin을 반환합니다.
}
int [] newbin = new int [16 -Oldbin.length];
for (int i = 0; i <newbin.length; newbin [i] = 0, i ++)
;
반환 콘 Accat (Oldbin, Newbin);
}
private static int [] concat (int [] oldbin, int [] newbin) {
int [] retval = new int [Oldbin.length + newbin.length];
for (int i = 0; i <(oldbin.length+newbin.length); i ++) {
if (i <oldbin.length) {
retval [i] = Oldbin [i];
} 또 다른 {
retval [i] = newbin [i -Oldbin.length];
}
}
반환 반환 리턴;
}
private static int [] core_hmac_sha1 (문자열 키, 문자열 데이터) {
key = (key == null) ": 키;
data = (data == null) ": 데이터;
int [] bkey = complete216 (str2binb (key));
if (bkey.length> 16) {
bkey = core_sha1 (bkey, key.length () * chrsz);
}
int [] iPad = new int [16];
int [] opad = new int [16];
for (int i = 0; i <16; iPad [i] = 0, opad [i] = 0, i ++)
;
for (int i = 0; i <16; i ++) {
iPad [i] = bkey [i] ^ 0x36363636;
opad [i] = bkey [i] ^ 0x5c5c5c5c;
}
int [] hash = core_sha1 (concat (iPad, str2binb (data)), 512 + data.length () * chrsz);
return core_sha1 (CONCAT (OPAD, HASH), 512 + 160);
}
private static int [] core_sha1 (int [] x, int len) {
int size = (len >> 5);
x = StretchbinArray (x, size);
x [len >> 5] | = 0x80 << (24 -Len % 32);
크기 = ((Len + 64 >> 9) << 4) + 15;
x = StretchbinArray (x, size);
x [((Len + 64 >> 9) << 4) + 15] = Len;
int [] w = 새로운 int [80];
int a = 1732584193;
int b = -271733879;
int c = -1732584194;
int d = 271733878;
int e = -1009589776;
for (int i = 0; i <x.length; i += 16) {
int olda = a;
int oldb = b;
int oldc = c;
int oldd = d;
int olde = e;
for (int j = 0; j <80; j ++) {
if (j <16) {
w [j] = x [i + j];
} 또 다른 {
w [j] = rol (w [j -3] ^ w [j -8] ^ w [j -14] ^ w [j -16], 1);
}
int 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);
}
int [] retval = new int [5];
retval [0] = a;
retval [1] = b;
retval [2] = C;
retval [3] = d;
retval [4] = e;
반환 반환 리턴;
}
개인 정적 무효 DOTEST () {
문자열 키 = "키";
문자열 data = "data";
System.out.println ( "hex_sha1 (" + data + ") =" + hex_sha1 (data));
System.out.println ( "b64_sha1 (" + data + ") =" + b64_sha1 (data));
System.out.println ( "str_sha1 (" + data + ") =" + str_sha1 (data));
system.out.println ( "hex_hmac_sha1 (" + key + "," + data + ") =" + hex_hmac_sha1 (key, data));
System.out.println ( "B64_HMAC_SHA1 (" + key + "," + data + ") =" + B64_HMAC_SHA1 (key, data));
System.out.println ( "str_hmac_sha1 (" + key + "," + data + ") =" + str_hmac_sha1 (key, data));
}
public static string hex_hmac_sha1 (문자열 키, 문자열 데이터) {
return binb2hex (Core_hmac_sha1 (키, 데이터));
}
개인 정적 int rol (int num, int cnt) {
return (num << cnt) | (num >>> (32 -cnt);
}
개인 정적 int safe_add (int x, int y) {
int lsw = (int) (x & 0xffff) + (int) (y & 0xffff);
int msw = (x >> 16) + (y >> 16) + (lsw >> 16);
반환 (MSW << 16) | (LSW & 0xffff);
}
개인 정적 int sha1_ft (int t, int b, int c, int d) {
if (t <20)
반환 (b & c) | ((~ b) & d);
if (t <40)
반환 b ^ c ^ d;
if (t <60)
반환 (B & C) | (B & D);
반환 b ^ c ^ d;
}
개인 정적 int sha1_kt (int t) {
반환 (T <20)? 1518500249 : (T <40)?
}
개인 정적 부울 SHA1_VM_TEST () {
hexcase? hex_sha1 ( "abc"). equals ( "a9993E364706816ABA3E25717850C26C9CD0D89D") : HEX_SHA1 ( "ABC").
"A9993E364706816ABA3E25717850C26C9CD0D89D");
}
공개 정적 문자열 str_hmac_sha1 (문자열 키, 문자열 데이터) {
return binb2str (core_hmac_sha1 (키, 데이터));
}
공개 정적 문자열 str_sha1 (문자열 s) {
s = (s == null) ": s;
return binb2str (core_sha1 (str2binb (s), s.length () * chrsz);
}
private static int [] str2binb (String str) {
str = (str == null) ": str;
int [] tmp = new int [str.length () * chrsz];
int mask = (1 << chrsz) -1;
for (int i = 0; i <str.length () * chrsz; i += chrsz) {
tmp [i >> 5] | = ((int) (str.charat (i / chrsz)) & mask) << (24 -i % 32);
}
int len = 0;
for (int i = 0; i <tmp.length && tmp [i]! = 0; i ++, len ++)
;
int [] bin = new int [len];
for (int i = 0; i <len; i ++) {
빈 [i] = tmp [i];
}
반환 빈;
}
개인 정적 int [] StretchBinarray (int [] Oldbin, int size) {
int currlen = Oldbin.length;
if (currlen> = size + 1) {
Oldbin을 반환합니다.
}
int [] newbin = new int [size + 1];
for (int i = 0; i <size; newbin [i] = 0, i ++)
;
for (int i = 0; i <currlen; i ++) {
Newbin [i] = Oldbin [i];
}
신생아를 반환하십시오.
}
public static void main (String args []) {
System.out.println ( "admin 's SHA1 값은" + hex_sha1 ( "admin") + ", length =" + hex_sha1 ( "admin"). length ());
}
}
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.