2017-02-22 138 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

相關問題