تصف هذه المقالة طريقة تنفيذ خوارزمية تشفير SHA-1 في JavaScript. شاركه للرجوع إليه. طريقة التنفيذ المحددة هي كما يلي:
فقط طريقة الاتصال: HEX_SHA1.
انسخ الرمز كما يلي:/*
*
* تطبيق JavaScript لخوارزمية التجزئة الآمنة ، SHA-1 ، على النحو المحدد
* في FIPS PUB 180-1
*
* بواسطة Lizq
*
* 2006-11-11
*
*/
/*
*
* المتغيرات القابلة للتكوين.
*
*/
var hexcase = 0 ؛ /* تنسيق الإخراج HEX. 0 - أحرف صغيرة ؛ 1 - الأحرف الكبيرة */
var chrsz = 8 ؛ /* بت لكل حرف إدخال. 8 - ASCII ؛ 16 - يونيكود */
/*
*
* الوظيفة الرئيسية لحساب هضم الرسالة
*
*/
وظيفة hex_sha1 (s) {
إرجاع Binb2Hex (Core_sha1 (Alignsha1 (s))) ؛
}
/*
*
* قم بإجراء اختبار ذاتي بسيط لمعرفة ما إذا كان VM يعمل
*
*/
دالة sha1_vm_test () {
إرجاع HEX_SHA1 ("ABC") == "A9993E364706816ABA3E25717850C26C9CD0D89D" ؛
}
/*
*
* احسب SHA-1 لمجموعة من الكلمات الكبيرة ، وطول قليلاً
*
*/
وظيفة core_sha1 (blockarray) {
var x = blockarray ؛ // إلحاق الحشو
var w = Array (80) ؛
var a = 1732584193 ؛
var b = -271733879 ؛
var c = -1732584194 ؛
var d = 271733878 ؛
var e = -1009589776 ؛
لـ (var i = 0 ؛ i <x.length ؛ i += 16) // 512-bit 16*32 المعالجة في كل مرة
{
var olda = a ؛
var oldb = b ؛
var oldc = c ؛
var oldd = d ؛
var olde = e ؛
لـ (var j = 0 ؛ j <80 ؛ j ++) // قم بتنفيذ 80 خطوة لكل 512 بت
{
إذا (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))) ؛
ه = د ؛
د = ج ؛
ج = رول (ب ، 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) ؛
}
إرجاع مجموعة جديدة (A ، B ، C ، D ، E) ؛
}
/*
*
* قم بإجراء وظيفة الجمع الثلاثي المناسبة للتيار
* التكرار
*
* إرجاع قيمة وظيفة F المقابلة
*
*/
وظيفة sha1_ft (t ، b ، c ، d) {
إذا (T <20)
العودة (b & c) | ((~ b) & d) ؛
إذا (T <40)
العودة b ^ c ^ d ؛
إذا (T <60)
العودة (b & c) | (B&D) | (C & D) ؛
العودة 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) ؛
}
/*
*
* تدوير bitwise رقم 32 بت إلى اليسار.
*
* 32 بت حلقة الرقم الثنائي اليسرى التحول اليسرى
*
*/
وظيفة ROL (num ، cnt) {
العودة (num << cnt) | (num >>> (32 - CNT)) ؛
}
/*
*
* يحتاج SHA1 القياسي إلى سلسلة الإدخال لتتناسب مع كتلة
*
* هذه الوظيفة تعمل على مواءمة سلسلة الإدخال لتلبية المتطلبات
*
*/
وظيفة alignsha1 (str) {
var nblk = ((str.length + 8) >> 6) + 1 ، blks = صفيف جديد (nblk * 16) ؛
لـ (var i = 0 ؛ i <nblk * 16 ؛ i ++)
blks [i] = 0 ؛
لـ (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 ؛
العودة.
}
/*
*
* تحويل مجموعة من الكلمات الكبرى إلى سلسلة سداسية.
*
*/
وظيفة binb2Hex (binarray) {
var hex_tab = hexcase؟ "0123456789ABCDEF": "0123456789ABCDEF" ؛
var str = "" ؛
لـ (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) ؛
}
إرجاع شارع
}
/*
*
* حساب MessagedIgest وفقًا لرسالة المصدر التي تم إدخالها
*
*/
وظيفة calcdigest () {
var digestm = hex_sha1 (document.shaform.SourCemessage.value) ؛
document.shaform.messagedigest.value = digestm ؛
}
آمل أن تكون هذه المقالة مفيدة لبرمجة JavaScript للجميع.