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

时间:2015-08-05 20:10:37

标签: javascript biginteger cryptojs

我想知道具有整数数据的字符串是否可以正确转换为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;
}

即使这段代码也无法正常工作,因为非常大的整数(超过数字2 ^ 53 - 1的javascript限制)会四舍五入。因此,我想要一个可以将整数值作为字符串并将其正确转换为字数组的解决方案。

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

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

1 个答案:

答案 0 :(得分:1)

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

&#13;
&#13;
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();
&#13;
<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>
&#13;
&#13;
&#13;

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