简体   繁体   English

RNCryptor IOS + Javascript加密/解密AES 256

[英]RNCryptor IOS + Javascript encryption / decryption AES 256

I am new to encryption and i am trying to get some symmetric encryption usign AES256 going from a mobile app to a webpage through websockets. 我是加密的新手,我正在尝试通过websockets从移动应用程序到网页的AES256进行对称加密。

I Encrypt the data using RNCryptor default settings 我使用RNCryptor默认设置加密数据

IOS CODE 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"];

Here is the output going out over websockets AgEBnXPPvAkJb7YVapwCVNd5SQw4JwqU7BfLsEXNZyKy9SazfJT8w16Y/hYY7aKxuz3Kuy2tAXXX/cHCc3PMhvG+fzSfrslRVMKvD6L+oWvXLg== 这是通过websockets输出的输出AgEBnXPPvAkJb7YVapwCVNd5SQw4JwqU7BfLsEXNZyKy9SazfJT8w16Y / hYY7aKxuz3Kuy2tAXXX / cHCc3PMhvG + fzSfrslRVMKvD6L + oWvXLg ==

JAVASCRIPT CODE - I receive the message and i try to parse it and display it 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>');
};

For some reason the code gets stuck on generating the key (maybe 10k iterations are too much for CryptoJS??? thats the iterations used on IOS ) 由于某种原因,代码在生成密钥时停滞不前(对于CryptoJS来说可能是10k次迭代太多了,那就是在IOS上使用的迭代)

I have tried a bunch of different things with this and the output is garbage im not actually getting the message decrypted. 我已经尝试了很多不同的东西,输出是垃圾我实际上没有得到消息解密。 Any help would be greatly appreciated. 任何帮助将不胜感激。 If you are going to recommend SJCL please provide some code . 如果您打算推荐SJCL,请提供一些代码。 RNCryptor uses its own message format. RNCryptor使用自己的消息格式。 I use it because of the randomized iv it provides . 我使用它是因为它提供的随机iv。 Please recommend a different library if you know of any as well. 如果您也知道,请推荐其他图书馆。

THanks for reading. 谢谢阅读。

Please follow the documentation for the RNCryptor file format: https://github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3.md 请按照RNCryptor文件格式的文档: https//github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3.md

You should be able to derive all the necessary data from file and add your shared secret... 您应该能够从文件中获取所有必要的数据并添加您的共享密钥......

Specification for RNCryptor data format version 3 RNCryptor数据格式版本3的规范

Byte:     |    0    |    1    |      2-9       |  10-17   | 18-33 | <-      ...     -> | n-32 - n |
Contents: | version | options | encryptionSalt | HMACSalt |  IV   | ... ciphertext ... |   HMAC   |
  • version (1 byte): Data format version. version(1字节):数据格式版本。 Currently 3. 目前3。
  • options (1 byte): bit 0 - uses password options(1字节):bit 0 - 使用密码
  • encryptionSalt (8 bytes): iff option includes "uses password" encryptionSalt(8字节):iff选项包含“使用密码”
  • HMACSalt (8 bytes): iff options includes "uses password" HMACSalt(8字节):iff选项包括“使用密码”
  • IV (16 bytes) ciphertext (variable) -- Encrypted in CBC mode HMAC (32 bytes) IV(16字节)密文(变量) - 在CBC模式下加密HMAC(32字节)

All data is in network order (big-endian). 所有数据均按网络顺序排列(big-endian)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM