RNCryptor IOS + Javascript шифрование/дешифрование AES 256

Я новичок в шифровании, и я пытаюсь получить симметричное шифрование с использованием 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"];

Вот вывод, выходящий через веб-сокеты

КОД 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>');
};

По какой-то причине код зависает при генерации ключа (может быть, 10 000 итераций слишком много для CryptoJS??? это итерации, используемые в IOS)

Я пробовал кучу разных вещей с этим, и вывод - мусор, я на самом деле не получаю расшифрованное сообщение. Любая помощь будет принята с благодарностью. Если вы собираетесь рекомендовать SJCL, укажите код. RNCryptor использует собственный формат сообщений. Я использую его из-за рандомизированного iv, который он предоставляет. Пожалуйста, порекомендуйте другую библиотеку, если вы знаете о ней.

Спасибо за прочтение.


person adrian.coroian    schedule 26.07.2013    source источник
comment
У меня похожие проблемы. Вы поняли, как использовать тот же формат данных из RNCryptor в Javascript?   -  person freshking    schedule 03.12.2013
comment
Меня также очень интересует формат данных для шифрования в Javascript. Вам удалось и это?   -  person freshking    schedule 03.12.2013
comment
На самом деле я не отказался от этого маршрута, потому что требования изменились.   -  person adrian.coroian    schedule 08.04.2014


Ответы (1)


Пожалуйста, следуйте документации по формату файла 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 байт): опция iff включает «использует пароль».
  • HMACSalt (8 байт): опции iff включают «использует пароль».
  • IV (16 байт) зашифрованный текст (переменная) -- Зашифровано в режиме CBC HMAC (32 байта)

Все данные в сетевом порядке (с обратным порядком байтов).

person der_michael    schedule 01.10.2015