RNCryptor JS 简单案例失败

RNCryptor JS simple case fails

我已在 Objective-C 中成功使用 RNCryptor,现在需要从 Javascript 为我的 iOS 应用程序加密数据。但是,这个简单的测试失败了...

<script type="text/javascript" src="js/utils/sjcl.js"></script>
<script type="text/javascript" src="js/utils/rncryptor.js"></script>

function testEncodeEncrypt_RN(plaintext) {
    var secret = "rosebud";
    var encrypted = RNCryptor.Encrypt(secret, plaintext);
    var decrypted = RNCryptor.Decrypt(secret, encrypted);
    console.log("decrypted to " + decrypted);
}

...sjcl.js.

抛出错误“Uncaught CORRUPT: pkcs#5 padding corrupt

我已经尝试了各种选项对象,但我认为没有选项应该同时适用于加密和解密。改变输入字符串和密码也没有好处。有什么想法吗?

/*
  Takes password string and plaintext bitArray
  options:
    iv
    encryption_salt
    html_salt
  Returns ciphertext bitArray
*/
RNCryptor.Encrypt = function(password, plaintext, options) {

plaintext是位数组吗?如果您传递的是 UTF-8 字符串,则需要使用 sjcl.codec.utf8String.toBits 对其进行转换。还有用于十六进制和 base64 编码的编解码器。请参阅 SJCL 文档。

最新版本的 SJCL 将接受字符串并将它们自动转换为 bitArrays,但在我完成 v4 格式的工作(应该在 2015 年底之前)之前,我可能不会自己再次接触 JS 实现。我很乐意接受拉取请求。

请注意,RNCryptor-js 与任何其他实现(包括 ObjC 实现)都不完全兼容。 JavaScript 处理 v3 格式所需的 10,000 次 PBKDF2 迭代太慢,因此默认使用 1,000 次。这意味着你必须修改另一边的代码来匹配(或者配置 JS 使用 10,000,但处理密码需要 10 倍的时间)。在 RNCryptor.h.

中查找两个 .rounds 配置设置

v4 格式的主要目标之一是使迭代计数可配置,使 JavaScript 能够互操作(不幸的是,通过显着降低加密的安全性,但这都是 JavaScript 可以今天处理)。