我在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);
}
...错误&#34; 未捕获的CORRUPT:pkcs#5 padding corrupt &#34;由sjcl.js抛出。
我尝试了各种选项对象,但我认为加密和解密都不应该有任何选项。改变输入字符串和秘密也没有好处。有什么想法吗?
答案 0 :(得分: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都可以处理)。