引用上文:
CSDNhttps://mp.csdn.net/mp_blog/creation/editor/134857857
剖析:
var bitsPerDigit=16; // 每個數組元素可以表示的二進制位數// 數組復制函數,將源數組部分復制到目標數組的指定位置
function arrayCopy(src, srcStart, dest, destStart, n) {var m = Math.min(srcStart + n, src.length);for (var i = srcStart, j = destStart; i < m; ++i, ++j) {dest[j] = src[i];}
}var maxDigitVal = 65535; // 數字最大值(16位,即2的16次方減一)
var biRadixBits = 16; // 基數位數(二進制)// 多個函數與算法中用到的變量和計算方式,例如乘法、乘方、左移等,略去具體說明// 返回大整數的十六進制字符串
function biToHex(x) {var result = "";var n = biHighIndex(x); // 獲取有效位for (var i = biHighIndex(x); i > -1; --i) {result += digitToHex(x.digits[i]);}return result;
}// RSA公鑰對的構造函數
function RSAKeyPair(encryptionExponent, decryptionExponent, modulus, keylen) {// 設置公鑰、私鑰和模數為大整數BigIntthis.e = biFromHex(encryptionExponent);this.d = biFromHex(decryptionExponent);this.m = biFromHex(modulus);// 如果沒有提供密鑰長度,則通過模數的位數計算,每個chunk的大小(二進制字節單位)this.chunkSize = (keylen) ? keylen / 8 : 2 * biHighIndex(this.m);this.radix = 16; // 設置輸出的基數(十六進制)this.barrett = new BarrettMu(this.m); // 用于優化模逆計算的BarrettMu對象
}// 大整數BigInt的構造函數,如果傳入true,則digits不初始化,否則初始化為零數組
function BigInt(flag) {if (typeof flag == "boolean" && flag == true) {this.digits = null;} else {this.digits = ZERO_ARRAY.slice(0);}this.isNeg = false; // 表示數字的符號,默認為非負
}// 設置全局的最大數字位數和相應的零數組、bigZero、bigOne等的初始化
function setMaxDigits(value) {maxDigits = value;ZERO_ARRAY = new Array(maxDigits);for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0;bigZero = new BigInt();bigOne = new BigInt();bigOne.digits[0] = 1;
}// 被RSA加密函數使用的內部函數,略去具體說明// RSA加密的實現函數
function encryptedString(key, s, pad, encoding) {// ...詳細的加密處理...// 使用公鑰中的指數e對數據進行加密,最終返回加密字符串
}// rsa函數封裝了創建密鑰、設置位數和執行加密操作
function rsa(arg) {setMaxDigits(130); // 設置最大位數var PublicExponent = "10001"; // 公開指數部分,一般為65537var modulus = "..."; // 模數,這里因篇幅而縮略var key = new RSAKeyPair(PublicExponent, "", modulus); // 生成RSA公鑰對return encryptedString(key, arg); // 返回加密后的字符串
}console.log(rsa("輸入你的密碼")) // 執行RSA加密,并打印加密后的結果