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

Converting a 64 bit number string to word array using CryptoJS

我想知道是否可以将带有整数数据的字符串正确转换为 CryptoJS 字数组? 例子。我能否将“175950736337895418”转换为字数组,就像我可以从 175950736337895418(整数值)创建字数组一样。

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

 // 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)会四舍五入。因此我想要一个可以将整数值作为字符串并将其正确转换为单词数组的解决方案。

PS。我需要这个字数组来使用以下代码计算 HMAC 值

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

你想要的是从字符串中解析大数字。由于这是 RSA 所必需的,您可以使用 Tom Wu 的 JSBN 来获得该功能。请务必包含 jsbn.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>

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