تصف هذه المقالة طريقة تنفيذ خوارزمية SHA-1 في Java. شاركه للرجوع إليه. طريقة التنفيذ المحددة هي كما يلي:
انسخ الرمز على النحو التالي: الفئة العامة sha1util {
سداسي بولان نهائي خاص = خطأ ؛
Static Final String B64PAD = "=" ؛
استاتيكي خاص int int chrsz = 8 ؛
// طريقة للحصول على قيمة SHA-1 للسلسلة
السلسلة الثابتة العامة HEX_SHA1 (سلسلة S) {
S = (S == NULL)؟ "
return binb2Hex (core_sha1 (str2binb (s) ، s.length () * chrsz)) ؛
}
السلسلة الثابتة العامة B64_HMAC_SHA1 (مفتاح السلسلة ، بيانات السلسلة) {
إرجاع binb2b64 (core_hmac_sha1 (المفتاح ، البيانات)) ؛
}
السلسلة الثابتة العامة B64_SHA1 (سلسلة S) {
S = (S == NULL)؟ "
return binb2b64 (core_sha1 (str2binb (s) ، s.length () * chrsz)) ؛
}
سلسلة ثابتة خاصة binb2b64 (int [] binarray) {
سلسلة التبويب = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/" ؛
سلسلة 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)
|
|
لـ (int j = 0 ؛ j <4 ؛ j ++) {
if (i * 8 + j * 6> binary.length * 32) {
str += b64pad ؛
} آخر {
str += tab.charat ((Triplet >> 6 * (3 - j)) & 0x3f) ؛
}
}
}
إرجاع cleanb64str (str) ؛
}
سلسلة ثابتة خاصة binb2Hex (int [] binarray) {
String hex_tab = hexcase؟
سلسلة str = "" ؛
لـ (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 ()) ؛
}
إرجاع شارع
}
سلسلة ثابتة خاصة binb2str (int [] bin) {
سلسلة str = "" ؛
int mask = (1 << chrsz) - 1 ؛
لـ (int i = 0 ؛ i <bin.length * 32 ؛ i += chrsz) {
str += (char) ((bin [i >> 5] >>> (24 - i ٪ 32)) & Mask) ؛
}
إرجاع شارع
}
ثابت int bit_rol (int num ، int cnt) {
العودة (num << cnt) | (num >>> (32 - cnt)) ؛
}
سلسلة ثابتة خاصة cleanb64str (String str) {
str = (str == null)؟ "
int len = str.length () ؛
إذا (len <= 1) {
إرجاع شارع
}
char trailchar = str.charat (len - 1) ؛
سلسلة trailstr = "" ؛
لـ (int i = len-1 ؛ i> = 0 && str.charat (i) == trailchar ؛ i--) {
trailstr += str.charat (i) ؛
}
return str.substring (0 ، str.indexof (trailster)) ؛
}
int static int [] complete216 (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 static int [] concat (int [] oldbin ، int [] newbin) {
int [] Retval = new int [oldbin.length + newbin.length] ؛
لـ (int i = 0 ؛ i <(oldbin.length+newbin.length) ؛ i ++) {
if (i <oldbin.length) {
Retval [i] = Oldbin [i] ؛
} آخر {
Retval [i] = newbin [i - oldbin.length] ؛
}
}
إرجاع العودة ؛
}
int static int [] core_hmac_sha1 (مفتاح السلسلة ، بيانات السلسلة) {
المفتاح = (مفتاح == فارغ)؟ "
البيانات = (البيانات == فارغة)؟ "
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] ؛
لـ (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 static int [] core_sha1 (int [] x ، int len) {
حجم int = (len >> 5) ؛
x = stretchbinarray (x ، size) ؛
x [len >> 5] | = 0x80 << (24 - Len ٪ 32) ؛
Size = ((Len + 64 >> 9) << 4) + 15 ؛
x = stretchbinarray (x ، size) ؛
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 ؛
لـ (int j = 0 ؛ j <80 ؛ j ++) {
إذا (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))) ؛
ه = د ؛
د = ج ؛
ج = رول (ب ، 30) ؛
ب = أ ؛
أ = ر ؛
}
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 ؛
إرجاع العودة ؛
}
private static void dotest () {
مفتاح السلسلة = "المفتاح" ؛
سلسلة البيانات = "البيانات" ؛
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 (المفتاح ، البيانات)) ؛
System.out.println ("B64_HMAC_SHA1 (" + KEY + "،" + Data + ") =" + B64_HMAC_SHA1 (مفتاح ، البيانات)) ؛
System.out.println ("str_hmac_sha1 (" + key + "،" + data + ") =" + str_hmac_sha1 (مفتاح ، البيانات)) ؛
}
السلسلة الثابتة العامة HEX_HMAC_SHA1 (مفتاح السلسلة ، بيانات السلسلة) {
إرجاع binb2Hex (core_hmac_sha1 (المفتاح ، البيانات)) ؛
}
ثابت ثابت int rol (int num ، int cnt) {
العودة (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) |
}
ثابت خاص int sha1_ft (int t ، int b ، int c ، int d) {
إذا (T <20)
العودة (b & c) | ((~ b) & d) ؛
إذا (T <40)
العودة b ^ c ^ d ؛
إذا (T <60)
العودة (B & C) |
العودة b ^ c ^ d ؛
}
static int sha1_kt (int t) {
عودة (T <20)؟
}
خاص ثابت منطقي SHA1_VM_TEST () {
إرجاع hexcase؟
"A9993E364706816ABA3E25717850C26C9CD0D89D") ؛
}
السلسلة الثابتة العامة str_hmac_sha1 (مفتاح السلسلة ، بيانات السلسلة) {
إرجاع binb2str (core_hmac_sha1 (المفتاح ، البيانات)) ؛
}
السلسلة الثابتة العامة str_sha1 (سلسلة S) {
S = (S == NULL)؟ "
return binb2str (core_sha1 (str2binb (s) ، s.length () * chrsz)) ؛
}
int static int [] str2binb (String str) {
str = (str == null)؟ "
int [] tmp = new int [str.length () * chrsz] ؛
int mask = (1 << chrsz) - 1 ؛
لـ (int i = 0 ؛ i <str.length () * chrsz ؛ i += chrsz) {
TMP [i >> 5] | = ((int) (str.charat (i / chrsz)) & mask) << (24 - i ٪ 32) ؛
}
int len = 0 ؛
لـ (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 static int [] stretchbinarray (int [] oldbin ، حجم int) {
int currlen = oldbin.length ؛
if (currlen> = 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] ؛
}
إرجاع Newbin ؛
}
الفراغ الثابت العام (سلسلة args []) {
System.out.println ("admin's sha1 قيمة:" + Hex_sha1 ("admin") + "، length =" + hex_sha1 ("admin"). length ()) ؛
}
}
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.