2017-02-22 133 views
0

我试图使用加密文本WebCrypto。我将结果转换为utf8字符串,然后将其转换为十六进制。加密/解密工作。但是,我想将数据转换为十六进制。当我尝试转换为十六进制并返回时,结果不同。从UTF8转换为十六进制和背部使用Javascript

这里的小提琴(使用铬):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,希望它等于原来的结果。但是,事实并非如此。

谁能告诉我这到底我做错了吗?

回答

3

我没有深入到小提琴中用来做转换的调用链,但它似乎尝试将UTF-16/UCS-2转换为字节大小,而不是实际的十六进制表示形式的缓冲区内容本身。

下面是字节缓冲器的内容为十六进制字符串表示形式转换的一个方法,和从十六进制字符串回二进制数据。

它需要在缓冲区中的每个字节产生和其值的两位十六进制表示,并将它加到一个字符串。

反向需要从字符串表示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

+0

感谢,没有测试但尚未看起来不错。 – Snowman

相关问题