使用CryptoJS将64位数字字符串转换为字数组



我想知道整数数据的字符串是否可以正确转换为CryptoJS单词数组?的例子。我可以将"175950736337895418"转换成一个单词数组,就像我可以从175950736337895418 (int值)中创建一个单词数组一样。

我有一些代码将整数值转换为字数组

 // Converts integer to byte array
 function getInt64Bytes( x ){
    var bytes = [];
    for(var i = 7;i>=0;i--){
        bytes[i] = x & 0xff;
        x = x>>8;
    }
    return bytes;
}
//converts the byte array to hex string
function bytesToHexStr(bytes) {
    for (var hex = [], i = 0; i < bytes.length; i++) {
        hex.push((bytes[i] >>> 4).toString(16));
        hex.push((bytes[i] & 0xF).toString(16));
    }
    return hex.join("");
}
// Main function to convert integer values to word array
function intToWords(counter){
    var bytes = getInt64Bytes(counter);
    var hexstr = bytesToHexStr(bytes);
    var words = CryptoJS.enc.Hex.parse(hexstr);
    return words;
}

即使这段代码也不能正确工作,因为非常大的整数(超过javascript的数字限制2^53 - 1)被舍入。因此,我需要一种解决方案,可以将整数值作为字符串,并将其正确转换为单词数组。

p。我需要这个单词数组来计算HMAC值,使用以下代码

CryptoJS.HmacSHA512(intToWords(counter), CryptoJS.enc.Hex.parse(key))

您需要的是从字符串中解析大数。由于这对于RSA是必需的,因此可以使用Tom Wu的JSBN来获得该功能。确保包含jsbn2.js jsbn2.js。然后你可以这样使用:

function intToWords(num, lengthInBytes) {
    var bigInt = new BigInteger();
    bigInt.fromString(num, 10); // radix is 10
    var hexNum = bigInt.toString(16); // radix is 16
    
    if (lengthInBytes && lengthInBytes * 2 >= hexNum.length) {
        hexNum = Array(lengthInBytes * 2 - hexNum.length + 1).join("0") + hexNum;
    }
    return CryptoJS.enc.Hex.parse(hexNum);
}
var num = "175950736337895418";
numWords = intToWords(num);
document.querySelector("#hexInt").innerHTML = "hexNum: " + numWords.toString();
document.querySelector("#hexIntShort").innerHTML = "hexNumShort: " + intToWords("15646513", 8).toString();
var key = CryptoJS.enc.Hex.parse("11223344ff");
document.querySelector("#result").innerHTML = "hexHMAC: " + 
        CryptoJS.HmacSHA512(numWords, key).toString();
<script src="https://cdn.rawgit.com/jasondavies/jsbn/master/jsbn.js"></script>
<script src="https://cdn.rawgit.com/jasondavies/jsbn/master/jsbn2.js"></script>
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/hmac-sha512.js"></script>
<div id="hexInt"></div>
<div id="hexIntShort"></div>
<div id="result"></div>

如果需要特定长度的结果,则可以将所需的字节数作为第二个参数传递。

最新更新