1

我在 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引发的错误“未捕获的损坏:pkcs#5 填充损坏”。

我尝试了各种选项对象,但我认为没有选项应该对 Encrypt 和 Decrypt 都有效。改变输入字符串和秘密也没有好处。有任何想法吗?

4

1 回答 1

1
/*
  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. 还有用于 hex 和 base64 编码的编解码器。请参阅SJCL文档。

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

请注意,RNCryptor-js 与任何其他实现(包括 ObjC 实现)都不完全兼容。JavaScript 太慢了,无法处理 v3 格式所需的 10,000 次 PBKDF2 迭代,因此它默认使用 1,000 次。这意味着您必须修改另一端的代码以匹配(或将 JS 配置为使用 10,000,但处理密码需要 10 倍的时间)。在 中查找两个.rounds配置设置RNCryptor.h

v4 格式的主要目标之一是使迭代计数可配置,以使 JavaScript 能够互操作(不幸的是,它大大降低了加密的安全性,但它是当今 JavaScript 可以处理的全部)。

于 2015-06-30T13:10:11.717 回答