В этой статье описывается метод реализации алгоритма SHA-1 в Java. Поделитесь этим для вашей ссылки. Конкретный метод реализации следующим образом:
Скопируйте код следующим образом: Public Class Sha1util {
Частный статический финальный логический шестигран = false;
Частная статическая конечная строка B64PAD = "=";
Частный статический финал int chrsz = 8;
// метод получения значения SHA-1 строки
public Static String hex_sha1 (String S) {
S = (S == NULL)?
return binb2Hex (core_sha1 (str2binb (s), s.length () * chrsz));
}
Общественная статическая строка B64_HMAC_SHA1 (String Key, String Data) {
вернуть binb2b64 (core_hmac_sha1 (ключ, данные));
}
Public Static String B64_SHA1 (String S) {
S = (S == NULL)?
return binb2b64 (core_sha1 (str2binb (s), s.length () * chrsz));
}
частная статическая строка Binb2b64 (int [] binarray) {
String tab = "AbcDefghijklmnopqrStuvwxyzabcdefghijklmnopqrstuvwxyz0123456789+/";
String str = "";
binarray = strechbinarray (binarray, binarray.length * 4);
для (int i = 0; i <binary.length * 4; i += 3) {
int triplet = (((binarray [i >> 2] >> 8 * (3 - i % 4)) и 0xff) << 16)
|.
|.
for (int j = 0; j <4; j ++) {
if (i * 8 + j * 6> binary.length * 32) {
str += b64pad;
} еще {
str += tab.charat ((триплет >> 6 * (3 - J)) & 0x3f);
}
}
}
return cleanb64str (str);
}
частная статическая строка Binb2Hex (int [] binarray) {
String hex_tab = hexcase?
String 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 () + новый символ (b) .toString ());
}
вернуть Str;
}
частная статическая строка Binb2str (int [] bin) {
String str = "";
int mask = (1 << Chrsz) - 1;
for (int i = 0; i <bin.length * 32; i += chrsz) {
str += (char) ((bin [i >> 5] >>> (24 - i % 32)) и маска);
}
вернуть 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)?
int len = str.length ();
if (len <= 1) {
вернуть Str;
}
char trailchar = str.charat (len - 1);
String trailstr = "";
for (int i = len-1; i> = 0 && str.charat (i) == trailchar; i--) {
trailstr += str.charat (i);
}
вернуть str.substring (0, str.indexof (trailstr));
}
Private Static Int [] reflect216 (int [] oldbin) {
if (oldbin.length> = 16) {
вернуть Oldbin;
}
int [] newbin = new int [16 - oldbin.length];
для (int i = 0; i <newbin.length; newbin [i] = 0, i ++)
;
вернуть Concat (Oldbin, Newbin);
}
Частный статический 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 (String Key, String Data) {
key = (key == null)?
data = (data == null)?
int [] bkey = reflect216 (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 ++)
;
для (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);
}
Частный статический int [] core_sha1 (int [] x, int len) {
int size = (len >> 5);
x = strectbinarray (x, размер);
x [len >> 5] | = 0x80 << (24 - len % 32);
size = ((len + 64 >> 9) << 4) + 15;
x = strectbinarray (x, размер);
x [((Len + 64 >> 9) << 4) + 15] = len;
int [] w = new int [80];
int a = 1732584193;
int b = -271733879;
int c = -1732584194;
int d = 271733878;
int e = -1009589776;
для (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;
возврат возврата;
}
Частный статический 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));
}
public Static String hex_hmac_sha1 (String Key, String Data) {
вернуть binb2Hex (core_hmac_sha1 (ключ, данные));
}
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) |
}
Частный статический int sha1_ft (int t, int b, int c, int d) {
if (t <20)
return (b & c) |
if (t <40)
возврат b ^ c ^ d;
if (t <60)
возврат (B & C) | (B & D) |
возврат b ^ c ^ d;
}
private static int sha1_kt (int t) {
Возврат (T <20)?
}
Private Static Boolean SHA1_VM_TEST () {
вернуть Hexcase hexcase hex_sha1 ("ABC").
"A9993E364706816ABA3E25717850C26C9CD0D89D");
}
public Static String str_hmac_sha1 (String Key, String Data) {
вернуть binb2str (core_hmac_sha1 (ключ, данные));
}
public Static String Str_sha1 (String S) {
S = (S == NULL)?
return binb2str (core_sha1 (str2binb (s), s.length () * chrsz));
}
private static int [] str2binb (string str) {
str = (str == null)?
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)) и маска) << (24 - i % 32);
}
int len = 0;
for (int i = 0; i <tmp.length && tmp [i]! = 0; i ++, len ++)
;
int [] bin = new int [len];
для (int i = 0; i <len; i ++) {
bin [i] = tmp [i];
}
вернуть корзину;
}
Частный статический int [] streptbinarray (int [] oldbin, int size) {
int currlen = oldbin.length;
if (curlen> = size + 1) {
вернуть Oldbin;
}
int [] newbin = new int [size + 1];
для (int i = 0; i <size; newbin [i] = 0, i ++)
;
для (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 Programming.