1

我正在尝试使用 sjcl 加密然后解密数组缓冲区。我可以在源代码中看到 sjcl 有一个用于 arraybuffer 的编解码器,但我就是不知道如何使用它:

const buffer = new ArrayBuffer(64);
const view = new Uint8Array(buffer);
console.log(view.length)
var encrypted = sjcl.encrypt("password", buffer)
console.log(encrypted.length)
var decrypted = sjcl.decrypt("password", encrypted)
console.log(decrypted.length)    

第一个 console.log() 打印 64 (这是有道理的)。第二个 console.log() 打印 150(加密结果的大小)......但第三个 console.log 总是打印 0。

4

1 回答 1

2

sjcl 的用法和文档与其目的一样神秘,但您想要实现的目标当然是可能的。

首先,您必须使用arrayBufferCodec编解码器将您的 ArrayBuffer 转换为 sjcl 自己的内部 bitArray 表示。之后,这需要再次转换为可以馈送到sjcl.encrypt()方法的 Base64 字符串。此过程的逆过程将返回您原来的 ArrayBuffer。

这是一个例子:

var buffer = new ArrayBuffer(64);
var view = new Uint8Array(buffer);

for (var i = 0; i < view.length; i++) {
  view[i] = i;
}

var arrayBufferBits = sjcl.codec.arrayBuffer.toBits(buffer);
var base64String = sjcl.codec.base64.fromBits(arrayBufferBits);
var encrypted = sjcl.encrypt("password", base64String);

var decrypted = sjcl.decrypt("password", encrypted);
var base64Bits = sjcl.codec.base64.toBits(decrypted);
var buffer2 = sjcl.codec.arrayBuffer.fromBits(base64Bits);

view = new Uint8Array(buffer2);
console.log(view);
<script type="text/javascript" src="https://bitwiseshiftleft.github.io/sjcl/sjcl.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/sjcl@1.0.8/core/codecArrayBuffer.js"></script>

于 2020-07-22T20:42:47.423 回答