2013-12-07 2 views
1

Я пытаюсь выполнить дешифрование с помощью RNDecryptor. То, что я сделал, - это выполнить вывод из операции шифрования openssl и попытаться декодировать его с помощью RNDecryptor.openssl несовместим с RNDecryptor?

Эта команда шифрует эту строку с помощью aes-256-cbc с кодом доступа abc.123. Затем он преобразует вывод в base64.

$ echo "This is good" | openssl enc -e -aes-256-cbc -k abc.123 -md md5 -base64 
U2FsdGVkX1+mgp+PlVPeyjiEJzkN6jWwN9z5CynnHu4= 

Я тогда взять строку base64 "U2FsdGVkX1 + MGP + PlVPeyjiEJzkN6jWwN9z5CynnHu4 =", и положил его в мою Objective программу C ...

NSString *b64Encrypted = @"U2FsdGVkX1+mgp+PlVPeyjiEJzkN6jWwN9z5CynnHu4="; 
NSData *notB64 = [b64Encrypted base64DecodedData]; 
NSData *decryptedData = [RNDecryptor decryptData:notB64 withPassword:@"abc.123" error:&decryptionError]; 
if (decryptionError != nil) { 
     NSLog([decryptionError debugDescription]); 
} 

Результат

Error Domain=net.robnapier.RNCryptManager Code=2 "Unknown header" UserInfo=0x102505ab0 {NSLocalizedDescription=Unknown header} 

Когда Я внимательно изучаю данные. Это некоторые вещи, которые я замечаю ... Из openssl данные из hexdump выглядят следующим образом ... (Примечание: я не преобразовал в base64)

~ $ echo "This is good" | openssl enc -e -aes-256-cbc -k abc.123 -md md5 -out g.1 
~ $ hexdump g.1 
00000 53 61 6c 74 65 64 5f 5f 19 dd cc 48 19 9e c3 2c  Salted__...H..., 
00010 16 1c 71 c5 c7 56 3b 97 c8 48 fc ae 7c 56 a1 91  ..q..V;..H..|V.. 

Что я заметил, так это то, что данные начинаются с «Salted__», тогда следующие 8 байтов являются солью.

Когда я использую метод RNEncryptor, результирующие данные никогда не начинаются с «Salted__», видимого при использовании openssl. Он всегда начинается с шестигранного значением 0x0201

NSData *encryptedData = [RNEncryptor encryptData:data 
            withSettings:kRNCryptorAES256Settings 
             password:password 
              error:&error]; 

Так что мой вопрос ... Является ли RNEncryptor/RNDecryptor делать правильные вещи, и она совместима с OpenSSL?

ответ

1

Так что я выяснил проблему. В основном для совместимости с opessl используйте класс RNOpenSSLEncryptor.

Для справки RNDecryptor класс имеет заголовок в ожидаемых данных. Первые два байта составляют заголовок. Первый байт указывает на наличие v1hmac или RNCrypterFileVersion. Второй байт - это вариант с первым байтом.

Поэтому, если вы хотите быть совместимым с opnssl, используйте класс RNOpenSSLEnryptor/RNOpenSSLDecryptor.

+0

Я просто добавляю методы шифрования и дешифрования из RNOpenSSLEnryptor/RNOpenSSLDecryptor, которые должны использоваться с настройками. –

+0

Как найти RNOpenSSLEnryptor/RNOpenSSLDecryptor? – lenhhoxung

0

OpenSSL добавляет свою соль. Вы можете попробовать -nosalt в команде enc.

+0

Даже используя опцию '-nosalt', закодированные данные не принимаются RNDecryptor. Используя носальт, он удаляет соль из зашифрованных данных. В настоящее время я изучаю, почему результирующее шифрование на обоих так сильно отличается по размеру. Выход openssl (без соли) составляет всего 16 байт, а выход RNEncryptor - 82 байта. Выход openssl (с солью) составляет 32 байта. –

+0

82 байта с AES невозможно. могут быть другие причины, такие как различие в кодировании. Если один бит отличается, вывод будет значительно отличаться. – doptimusprime

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