Artikel ini menjelaskan metode penerapan algoritma SHA-1 di Java. Bagikan untuk referensi Anda. Metode implementasi spesifik adalah sebagai berikut:
Salin kode sebagai berikut: kelas publik sha1util {
Private Static Final Boolean Hexcase = false;
string final statis privat b64pad = "=";
private static final int chrsz = 8;
// Metode untuk mendapatkan nilai SHA-1 dari string
String statis publik hex_sha1 (string s) {
s = (s == null) "": s;
return binb2hex (core_sha1 (str2binb (s), s.length () * chrsz));
}
String statis public b64_hmac_sha1 (tombol string, data string) {
return binb2b64 (core_hmac_sha1 (kunci, data));
}
string statis publik b64_sha1 (string s) {
s = (s == null) "": s;
return binb2b64 (core_sha1 (str2binb (s), s.length () * chrsz));
}
Private Static String binB2B64 (int [] binarray) {
String tab = "ABCDEFGHIJKLMNOPQRSUVWXYZABCDEFGHIJKLMNOPQRSUVWXYZ0123456789+/";
String str = "";
binarray = strechbinarray (binarray, binarray.length * 4);
untuk (int i = 0; i <binery.length * 4; i += 3) {
int triplet = (((binarray [i >> 2] >> 8 * (3 - i % 4)) & 0xff) << 16)
|.
|.
untuk (int j = 0; j <4; j ++) {
if (i * 8 + j * 6> Binary.length * 32) {
str += b64pad;
} kalau tidak {
str += tab.charat ((triplet >> 6 * (3 - j)) & 0x3f);
}
}
}
return cleanb64str (str);
}
Private Static String binb2Hex (int [] binarray) {
String hex_tab = hexcase? "
String str = "";
untuk (int i = 0; i <binery.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 + = (karakter baru (a) .toString () + karakter baru (b) .toString ());
}
mengembalikan str;
}
Private static string binb2str (int [] bin) {
String str = "";
int mask = (1 << chrsz) - 1;
untuk (int i = 0; i <bin.length * 32; i += chrsz) {
str += (char) ((bin [i >> 5] >>> (24 - i % 32)) & mask);
}
mengembalikan str;
}
private static int bit_rol (int num, int cnt) {
return (num << cnt) | (num >>> (32 - cnt));
}
Private Static String cleanB64str (string str) {
str = (str == null) "": str;
int len = str.length ();
if (len <= 1) {
mengembalikan str;
}
char trailchar = str.charat (len - 1);
String trailstr = "";
untuk (int i = len-1; i> = 0 && str.charat (i) == trailchar; i--) {
trailstr += str.charat (i);
}
return str.substring (0, str.indexof (trailstr));
}
private static int [] complete216 (int [] oldbin) {
if (oldbin.length> = 16) {
kembali oldbin;
}
int [] newbin = int int [16 - oldbin.length];
untuk (int i = 0; i <newbin.length; newbin [i] = 0, i ++)
;
return concat (oldbin, newbin);
}
private static int [] concat (int [] oldbin, int [] newbin) {
int [] retval = int baru [oldbin.length + newbin.length];
untuk (int i = 0; i <(oldbin.length+newbin.length); i ++) {
if (i <oldbin.length) {
retval [i] = oldbin [i];
} kalau tidak {
retval [i] = newbin [i - oldbin.length];
}
}
pengembalian kembali kembali;
}
private static int [] core_hmac_sha1 (tombol string, data string) {
key = (key == null) "": Key;
data = (data == null) "": data;
int [] bkey = complete216 (str2binb (key));
if (bkey.length> 16) {
bkey = core_sha1 (bkey, key.length () * chrsz);
}
int [] ipad = int baru [16];
int [] opad = int new [16];
untuk (int i = 0; i <16; iPad [i] = 0, opad [i] = 0, i ++)
;
untuk (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, ukuran);
x [len >> 5] | = 0x80 << (24 - len % 32);
size = ((len + 64 >> 9) << 4) + 15;
x = StretchbinArray (x, ukuran);
x [((len + 64 >> 9) << 4) + 15] = len;
int [] w = int new [80];
int a = 1732584193;
int b = -271733879;
int c = -1732584194;
int d = 271733878;
int e = -1009589776;
untuk (int i = 0; i <x.length; i += 16) {
int olda = a;
int oldb = b;
int oldc = c;
int oldd = d;
int olde = e;
untuk (int j = 0; j <80; j ++) {
if (j <16) {
w [j] = x [i + j];
} kalau tidak {
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 = int int [5];
retval [0] = a;
retval [1] = b;
retval [2] = c;
retval [3] = D;
retval [4] = e;
pengembalian kembali kembali;
}
private static void dotest () {
String key = "key";
String 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));
}
String statis publik hex_hmac_sha1 (tombol string, data string) {
return binb2hex (core_hmac_sha1 (kunci, data));
}
private static int rol (int num, int cnt) {
return (num << cnt) | (num >>> (32 - cnt));
}
private static int safe_add (int x, int y) {
int lsw = (int) (x & 0xffff) + (int) (y & 0xffff);
int msw = (x >> 16) + (y >> 16) + (lsw >> 16);
Return (MSW << 16) |
}
private static int sha1_ft (int t, int b, int c, int d) {
if (t <20)
Return (B&C) | (~ b) & d);
if (t <40)
kembali b ^ c ^ d;
if (t <60)
Return (B&C) |
kembali b ^ c ^ d;
}
private static int sha1_kt (int t) {
Return (T <20)?
}
private static boolean sha1_vm_test () {
return hexcase?
"A9993E364706816ABA3E25717850C26C9CD0D89D");
}
String statis public str_hmac_sha1 (tombol string, data string) {
return binb2str (core_hmac_sha1 (key, data));
}
string statis publik str_sha1 (string 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 = int int [str.length () * chrsz];
int mask = (1 << chrsz) - 1;
untuk (int i = 0; i <str.length () * chrsz; i += chrsz) {
tmp [i >> 5] | = ((int) (str.charat (i / chrsz)) & mask) << (24 - i % 32);
}
int len = 0;
untuk (int i = 0; i <tmp.length && tmp [i]! = 0; i ++, len ++)
;
int [] bin = int [len] baru;
untuk (int i = 0; i <len; i ++) {
bin [i] = tmp [i];
}
Return Bin;
}
private static int [] StretchBinArray (int [] oldbin, int ukuran) {
int currlen = oldbin.length;
if (Currlen> = size + 1) {
kembali oldbin;
}
int [] newbin = int int [ukuran + 1];
untuk (int i = 0; i <size; newbin [i] = 0, i ++)
;
untuk (int i = 0; i <Currlen; i ++) {
Newbin [i] = oldbin [i];
}
Return Newbin;
}
public static void main (string args []) {
System.out.println ("Nilai SHA1 Admin adalah:" + hex_sha1 ("admin") + ", panjang =" + hex_sha1 ("admin"). Panjang ());
}
}
Saya harap artikel ini akan membantu pemrograman Java semua orang.