2015-06-30 60 views
0

我在Objective-C中成功使用了RNCryptor,現在需要從Javascript中爲我的iOS應用加密數據。但是,這個簡單的測試失敗......RNCryptor JS簡單案例失敗

<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); 
} 

...出現錯誤 「未捕獲的損壞:PKCS#5填充腐敗」 由sjcl.js.拋出

我已經嘗試了各種選項對象,但我認爲沒有選項應該適用於加密和解密。改變輸入字符串和祕密也不好。有任何想法嗎?

回答

0
/* 
    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,但我可能不會再自己觸及JS實現,直到完成v4格式的工作(應該在2015年底之前)。我很高興接受拉請求。

請注意,RNCryptor-js與任何其他實現(包括ObjC實現)都不完全兼容。 JavaScript處理v3格式所需的10,000個PBKDF2迭代太慢,因此它默認使用1,000。這意味着你必須修改另一端的代碼來匹配(或配置JS使用10,000,但它需要10倍的時間才能處理密碼)。查找RNCryptor.h中的兩個.rounds配置設置。

v4格式的主要目標之一是使迭代次數可配置,以使JavaScript能夠互操作(不幸的是,通過顯着降低加密的安全性,但它是所有JavaScript今天可以處理的)。

+0

好的。感謝您的回答,並非常感謝偉大的圖書館!我正在傳遞一個字符串(只是在評論中的位置數組中簡單地吹響)。我的外賣是轉換爲JS中的位,並將這兩個**的iOS中的'.rounds'設置修改爲1000.我完全不擔心減少加密的晦澀難懂。我有這個權利嗎? – user1272965

+0

你已經掌握了。這應該工作。 –

+0

抱歉打擾 - 它看起來好像github上的當前rncryptor.js使用10K迭代。第15行表示'返回sjcl.misc.pbkdf2(密碼,salt,10000,32 * 8,hmacSHA1);'我應該將其更改爲1k? – user1272965