javascript - 使用 Javascript 从 utf8 转换为十六进制并返回

标签 javascript webcrypto-api

我正在尝试使用 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/

相关文章:

javascript - 如何使用 Web Crypto 生成 key 对并在 Firefox AddOn 中访问其 key ?

javascript - 网络密码 : Promise return Permission denied on Edge

javascript - 我想创建对象类型数组,for循环只压入最后一个值,为什么?

javascript - WebGL - 绘制元素 : The texture is a non-power-of-two texture or not mipmap complete

javascript - 在 jQuery 中循环 JSON 数据并使用正确的数组值

javascript - 使用 Chrome JavaScript 调试器/如何中断页面加载事件

encryption - 使用 WebCrypto 生成对加密和签名有用的 key 对

javascript - 在 Web 应用程序中使用客户端加密时, key 应该存储在哪里?

javascript - 使用 WebCrypto API 包装和解开 key

javascript - Firestore - 监听特定字段的变化?