RNCryptor IOS + Javascript加密/解密AES 256

4

我是一个新手,想要通过Websockets从移动应用程序到网页传输一些对称加密使用AES256的内容。

我使用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>');
};

由于某种原因,代码在生成密钥时卡住了(也许CryptoJS的10k次迭代对IOS来说太多了?)

我已经尝试了很多不同的方法,但输出都是垃圾,我实际上没有得到解密的消息。非常感谢您的帮助。如果您要推荐SJCL,请提供一些代码。RNCryptor使用自己的消息格式。我使用它是因为它提供了随机的iv。如果您知道其他库,请推荐一下。

感谢您的阅读。


我也遇到了类似的问题。你解决了如何在Javascript中使用与RNCryptor相同的数据格式的问题吗? - freshking
我也对 JavaScript 中的数据格式加密非常感兴趣。你也处理过这个吗? - freshking
我并没有放弃这条路线,而是因为需求变化而放弃了。 - adrian.coroian
1个回答

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 - 使用密码
  • 加密盐(8字节):如果选项包括“使用密码”
  • HMAC盐(8字节):如果选项包括“使用密码”
  • IV(16字节)密文(可变长度) - 在CBC模式下加密HMAC(32字节)

所有数据均采用网络顺序(大端序)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接