4

私は暗号化が初めてで、モバイルアプリからWebsocketsを介してWebページに移動するAES256を使用した対称暗号化を取得しようとしています。

I 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 CODE - メッセージを受け取り、それを解析して表示しようとしました

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のために私はそれを使用します。ご存知の場合は、別のライブラリをお勧めしてください。

読んでくれてありがとう。

4

1 に答える 1