【发布时间】:2021-06-27 03:41:44
【问题描述】:
我正在尝试使用 AES-CTR 算法解密浏览器上的数据。 WebCrypto API 要求将计数器作为BufferSource 传递。如何将计数器(一个数字)转换为预期的输入(一个字节数组)?
我使用的是全零 IV,因此计数器从 0 开始。假设我正在尝试解密计数器 = 445566 的数据。如何将 445566 转换为 ArrayBuffer?
const key = // retrieve decryption key
const encrypted = // retrieve encrypted data
const iv = new ArrayBuffer(16)
// iv is all zeros. I need it to represent 445566, how?
const algo = {
name: 'AES-CTR',
counter: iv,
length: 128
}
const decrypted = await crypto.subtle.decrypt(algo, key, encrypted)
编辑:在挖掘了一些加密库之后,我最终使用了这个。它似乎做我想做的事,但不知道正确性、性能等。
function numberToArrayBuffer(value) {
const view = new DataView(new ArrayBuffer(16))
for (var index = 15; index >= 0; --index) {
view.setUint8(index, value % 256)
value = value >> 8;
}
return view.buffer
}
【问题讨论】:
-
加密期间如何创建整数计数器?
-
像这样,在节点中:
const iv = Buffer.alloc(16)。有人告诉我,如果密钥仅用于加密单个消息,则可以使用全零 iv。 -
在客户端,我希望解密给定字节范围的数据,例如 243-695。所以我需要从字节范围的第一个值中派生一个计数器 ArrayBuffer。
标签: javascript cryptography aes webcrypto-api