2013-07-26 2 views
3

Я новичок в шифровании, и я пытаюсь получить некоторый симметричный шифрование usign AES256, идущий от мобильного приложения к веб-странице через websockets.RNCryptor IOS + шифрование/дешифрование Javascript AES 256

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

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

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

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

+0

У меня такие же проблемы. Вы поняли, как использовать один и тот же формат данных из RNCryptor в Javascript? – freshking

+0

Я также очень заинтересован в формате данных для шифрования в Javascript. Вам это удалось? – freshking

+0

Я действительно не отказался от этого маршрута, потому что требования изменились. –

ответ

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

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

Смежные вопросы