Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RNCryptor IOS+;Javascript加密/解密AES 256_Javascript_Ios_Cryptojs_Rncryptor_Sjcl - Fatal编程技术网

RNCryptor IOS+;Javascript加密/解密AES 256

RNCryptor IOS+;Javascript加密/解密AES 256,javascript,ios,cryptojs,rncryptor,sjcl,Javascript,Ios,Cryptojs,Rncryptor,Sjcl,我是加密新手,我正在尝试通过WebSocket使用AES256从移动应用程序到网页进行对称加密 我使用RNCryptor默认设置加密数据 IOS代码 NSString* message = @"testmessage"; NSData* pubData = [message dataUsingEncoding:NSUTF8StringEncoding]; NSData *encryptedData = [RNEncryptor encryptData:pubData

我是加密新手,我正在尝试通过WebSocket使用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"];
下面是通过WebSocket输出的输出 AGEBNxppVAKJB7YVAPWCvnd5SQW4JWQU7BFLSENZYKY9SAZFJT8W16Y/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>');
};
消息驱动的函数(消息){ var rawData=base64.decode(message.payloadString); var encryptionSalt=rawData.substr(2,8); var hmacSalt=rawData.substr(10,8); var iv=原始数据。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(密码,encryptionSalt,{keySize:256/32,迭代次数:10000}); var plaintextArray=CryptoJS.AES.decrypt( {ciphertext:CryptoJS.enc.Utf8.parse(ciphertext)}, CryptoJS.enc.Hex.parse(密钥), {iv:CryptoJS.enc.Latin1.parse(iv)} ); 显示屏幕('User:'+CryptoJS.enc.Latin1.stringify(plaintextArray)+''; }; 出于某种原因,代码在生成密钥时遇到了问题(可能对于CryptoJS来说,10k迭代次数太多了???这是IOS上使用的迭代次数)

我尝试了很多不同的方法,结果都是垃圾,我并没有对消息进行解密。任何帮助都将不胜感激。如果您打算推荐SJCL,请提供一些代码。RNCryptor使用自己的消息格式。我使用它是因为它提供了随机化的静脉注射。如果您知道其他图书馆,请推荐其他图书馆


感谢阅读。

请遵循RNCryptor文件格式的文档:

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

RNCryptor数据格式第3版规范

Byte:     |    0    |    1    |      2-9       |  10-17   | 18-33 | <-      ...     -> | n-32 - n |
Contents: | version | options | encryptionSalt | HMACSalt |  IV   | ... ciphertext ... |   HMAC   |
字节:| 0 | 1 | 2-9 | 10-17 | 18-33 | n-32-n|
内容:|版本|选项|加密盐| HMACSalt | IV |。。。密文…|HMAC|
  • 版本(1字节):数据格式版本。目前为3
  • 选项(1字节): 位0-使用密码
  • EncryptionAlt(8字节):iff选项包括 “使用密码”
  • HMACSalt(8字节):iff选项包括“使用” 密码“
  • IV(16字节)密文(变量)——在CBC中加密 模式HMAC(32字节)

所有数据都按网络顺序排列(大端)。

我遇到了类似的问题。你知道如何在Javascript中使用RNCryptor中相同的数据格式了吗?我对Javascript中加密的数据格式也很感兴趣。你也做到了吗?我没有。我实际上放弃了这条路线,因为需求改变了。