RNCryptor IOS + Javascript加密/解密AES 256

问题描述:

我是新来加密,我想通过websockets从一个移动应用程序到一个网页获得一些对称加密使用AES256。RNCryptor IOS + Javascript加密/解密AES 256

我使用RNCryptor默认设置

IOS代码

NSString* message = @"testmessage"; 
    NSData* pubData = [message dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *encryptedData = [RNEncryptor encryptData:pubData 
             withSettings:kRNCryptorAES256Settings 
              password:@"test" 
               error:&error]; 
    if(error) { 
     NSLog(@"Error encrypting %@", [error localizedDescription]); 
    } 

    NSString* encryptedString = [encryptedData base64Encoding]; 
    NSLog(@"Sending message %@", encryptedString); 
    [self.session publishData:[encryptedString dataUsingEncoding:NSUTF8StringEncoding] onTopic:@"test12345"]; 

这里是输出出去过的WebSockets AgEBnXPPvAkJb7YVapwCVNd5SQw4JwqU7BfLsEXNZyKy9SazfJT8w16Y/hYY7aKxuz3Kuy2tAXXX/cHCc3PMhvG + fzSfrslRVMKvD6L + oWvXLg ==

JAVASCRIPT加密数据代码 - 我收到消息,我尝试解析并显示它

function onMessageArrived(message) { 

    var rawData = base64.decode(message.payloadString); 
    var encryptionSalt = rawData.substr(2,8); 
    var hmacSalt = rawData.substr(10,8); 
    var iv = rawData.substr(18, 16); 
    var ciphertext = rawData.substr(34, rawData.length-34-32); 
    var hmac = rawData.substr(rawData.length-32, 32); 
    var password = "test"; 

    var key = CryptoJS.PBKDF2(password, encryptionSalt, { keySize: 256/32, iterations: 10000}); 

    var plaintextArray = CryptoJS.AES.decrypt(
    { ciphertext: CryptoJS.enc.Utf8.parse(ciphertext) }, 
    CryptoJS.enc.Hex.parse(key), 
    { iv: CryptoJS.enc.Latin1.parse(iv) } 
); 

    showScreen('<span style="color: blue;">User: ' + CryptoJS.enc.Latin1.stringify(plaintextArray) + '</span>'); 
}; 

由于某些原因,代码被卡在生成密钥上(也许10k迭代对于CryptoJS来说太多了?多数民众赞成在iOS上使用的迭代)

我已经尝试了一堆不同的东西,这与输出是垃圾im实际上并没有得到解密消息。任何帮助将不胜感激。如果您打算推荐SJCL,请提供一些代码。 RNCryptor使用它自己的消息格式。我使用它,因为它提供了随机iv。如果你知道任何一个,请推荐一个不同的库。

谢谢阅读。

+0

我有类似的问题。你知道如何使用JavaScript中的RNCryptor相同的数据格式吗? – freshking

+0

我也对JavaScript中的加密数据格式非常感兴趣。你也管理过吗? – freshking

+0

因为要求改变,我并没有放弃这条路线。 –

请遵守RNCryptor文件格式的文档:https://github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3.md

您应该能够从文件中获得所有必要的数据,并添加您的共享的秘密......

规范RNCryptor数据格式版本3

Byte:  | 0 | 1 |  2-9  | 10-17 | 18-33 | <-  ...  -> | n-32 - n | 
Contents: | version | options | encryptionSalt | HMACSalt | IV | ... ciphertext ... | HMAC | 
  • 版本(1个字节):数据格式版本。目前3.
  • 选项(1个字节): 位0 - 使用密码
  • encryptionSalt(8个字节):当且仅当选项包含 “使用密码”
  • HMACSalt(8个字节):当且仅当选项包括“使用 密码”
  • IV(16个字节)的密文(可变) - 在CBC模式 HMAC加密(32个字节)

所有数据是网络顺序(大端)。