我正在尝试使用 WebCrypto 加密文本。我将结果转换为 utf8 字符串,然后将其转换为十六进制。加密/解密有效。但是,我想将数据转换为十六进制。当我尝试转换为十六进制并返回时,结果是不同的。
这是 fiddle (使用 Chrome):https://jsfiddle.net/yxp01v5g/
测试代码在这里:
var text = "hello world";
var key = App.crypto.generateKey(16);
App.crypto.encrypt(text, key, function(encryptedText, iv){
console.log("encrypted text:", encryptedText, "iv", iv);
var encryptedTextHex = convertUtf8StringToHex(encryptedText);
console.log("encrypted text hex", encryptedTextHex);
var backToUtf8 = convertHexToUtf8(encryptedTextHex);
console.log("Back to utf8", backToUtf8);
console.assert(encryptedText == backToUtf8);
})
如您所见,我正在获取结果,将其转换为十六进制,然后将其转换回 utf8,希望它与原始结果相同。然而,事实并非如此。
谁能告诉我我到底做错了什么?
最佳答案
我没有深入研究 fiddle 中使用的调用链来进行转换,但它似乎尝试将 UTF-16/UCS-2 转换为字节大小,而不是缓冲区内容的实际十六进制表示形式本身。
这是一种将字节缓冲区内容转换为十六进制字符串表示形式,以及从十六进制字符串转换回二进制数据的方法。
它获取缓冲区中的每个字节并生成其值的两位数十六进制表示形式,并将其连接到字符串。
反向操作从字符串表示形式中获取两个字符,并将其转换回字节值表示形式。
// some bytes as Uint8Array
var random = crypto.getRandomValues(new Uint8Array(16)), i, str = "", allOK = true;
// convert to HEX string representation
for(i = 0; i < random.length; i++) str += pad2(random[i].toString(16));
console.log(str);
// convert back to byte buffer
var buffer = new Uint8Array(random.length);
for(i = 0; i < buffer.length; i++) buffer[i] = parseInt(str.substr(i<<1, 2), 16);
// check if same content
for(i = 0; i < buffer.length; i++) if (buffer[i] !== random[i]) allOK = false;
console.log("All OK?", allOK)
function pad2(s) {return s.length < 2 ? "0" + s : s}; // helper: pad to 2 digits
关于javascript - 使用 Javascript 从 utf8 转换为十六进制并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42404534/