我目前正在尝试使用SJCL,但我遇到加密/解密问题。由于缺乏好的例子,我想出了你在下面看到的内容,但它没有用。谁能指出我做错了什么?提前谢谢。
<html>
<!-- sjcl made with: ./configure --with-all -compress=none && make -->
<script type="text/javascript" src="sjcl.js"></script>
<body>
<script>
var p = {
"iv": "PnWtrKCP2DKcLyNC18RKAw==",
"ts": 128,
"mode": "gcm",
"adata": "You can read me",
"cipher": "aes",
"key": "QiJysyALRxUESl18XKl0FcpXQJvFB2Z3Q3A61tdNNM0=" // pbkdf2 key
};
var prp = new sjcl.cipher[p.cipher](sjcl.codec.base64.toBits(p.key));
var plain = "My plaintext";
var ct = sjcl.codec.base64.fromBits(sjcl.mode[p.mode].encrypt(prp, sjcl.codec.bytes.toBits(plain), p.iv, p.adata, p.ts));
var pt = sjcl.codec.base64.fromBits(sjcl.mode[p.mode].decrypt(prp, sjcl.codec.base64.toBits(ct), p.iv, p.adata, p.ts));
document.writeln("ct: " + ct + "<br>");
document.writeln("pt: " + pt + "<br>");
</script>
<hr><pre>
Results in:
encrypted: 5Z2QQ9s6gfORlr6qLvlwjO/J+/TbfSbOs79c4w==
decrypted: AAAAAAAAAAAAAAAA
</pre></body></html>
答案 0 :(得分:1)
我认为您的问题是sjcl.codec.bytes.toBits(plaintext)
。如果你自己运行它,你得到[0,0,0]
。我想你想要sjcl.codec.utf8String.toBits(plaintext)
。
如果你有一个实际的字节(八位字节)数组(如bytes.toBits
),你会使用[255, 34, 12, 16]
,但在这种情况下你使用的是一个字符串,因此需要以不同的方式进行转换。
另外,我在使用字符串进行IV时遇到了问题,你可能希望在传递它之前通过与键相同的转换来运行它(base64.toBits(iv)
)。