2014-12-17 2 views
0

мне нужно расшифровать файлы, зашифрованные с помощью OpenSSL следующим образом:дешифрации зашифрованных файлов (AES CFB8) в прошивкой

openssl enc -d -aes-256-cfb8 -nopad -in myFile -iv myIV -K myKey 

В частности, IV и ключ массив байтов. Пример (в гексагоне):

key: 5492557823faec274708eb34d263029084abe5544789340a1d3ccf6bd74774ad 
iv: 01e2a0ac72375edec4b126b1197a2885 

Как это сделать?

Я попытался следовать примеру здесь AES/CFB8 IV size, но с ограниченными результатами.

EDIT:

Вот что я уже пробовал:

NSString *IVString = @"3d090e3f7a72d51ae4f4d0d15025926e"; 
NSString *KEYString = @"207ecf137586424952b8cfc3e7fd8ce9bd839a916c07b9d5f34d250315d91aa9"; 


NSData *myIV = [IVString decodeFromHexidecimal]; 
NSData *myKey = [KEYString decodeFromHexidecimal]; 

CCCryptorStatus result = CCCryptorCreateWithMode(kCCDecrypt, 
               kCCModeCFB8, 
               kCCAlgorithmAES128, 
               ccNoPadding, 
               [myIV bytes], 
               [myKey bytes], 
               kCCKeySizeAES256, 
               NULL, 
               0, 
               0, 
               0, 
               &_cryptor); 

size_t *outLength; 

NSMutableData *cipherData = [NSMutableData dataWithLength:self.length + kCCBlockSizeAES128]; 

if (result == kCCSuccess) 
    result = CCCryptorUpdate(_cryptor, 
          [self bytes], 
          [self length], 
          [cipherData mutableBytes], 
          [cipherData length], 
          outLength); 

if (result == kCCSuccess) 
    result = CCCryptorFinal(_cryptor, 
          [cipherData mutableBytes], 
          [cipherData length], 
          outLength); 
if (result == kCCSuccess) 
    result = CCCryptorRelease(_cryptor); 

EDIT 2:

Спасибо Rob, что помог мне!

Окончательный код:

CCCryptorStatus result = CCCryptorCreateWithMode(kCCDecrypt, 
               kCCModeCFB8, 
               kCCAlgorithmAES128, 
               ccNoPadding, 
               [myIV bytes], 
               [myKey bytes], 
               kCCKeySizeAES256, 
               NULL, 
               0, 
               0, 
               0, 
               &cryptor); 


size_t bufferLength = CCCryptorGetOutputLength(cryptor, [self length], false); 
NSMutableData *buffer = [NSMutableData dataWithLength:bufferLength]; 

size_t outLength; 


result = CCCryptorUpdate(cryptor, 
         [self bytes], 
         [self length], 
         [buffer mutableBytes], 
         [buffer length], 
         &outLength); 


result = CCCryptorRelease(cryptor); 
+0

См. Https://github.com/RNCryptor/RNCryptor – rmaddy

+0

У вас есть пример того, как использовать режим, отличный от CBC, с RNCryptor? –

+1

Пожалуйста, покажите нам, что вы пробовали и как все пошло не так, в настоящее время вы показываете скудные результаты. –

ответ

2

Вы проходя cipherData как буфер, но не создают пространство в нем. (Вы также используете тот же самый буфер на этапах обновления и завершения, не выгружая результат, так что это может повредить ваш результат, хотя в этом случае вы можете избежать этого, потому что нет отступов). (EDIT: я начал писать это несколько часов назад, я вижу, что с тех пор вы изменили свой код, чтобы выделить буфер, но вы все еще повторно используете его, вот что может испортить ваш результат. Я также вижу, что вы переключились с шифрования для расшифровки Обратите внимание, что тогда ваш результат не «cipherData» больше)

Сначала создайте свой Cryptor (эта часть является правильной, хотя нет никаких причин, чтобы положить его в Ивар)..

CCCryptorRef cryptor; 
CCCryptorStatus result = CCCryptorCreateWithMode(kCCEncrypt, 
               ... 
               &cryptor); 

// FIXME: Return error 
if (result != kCCSuccess) { NSAssert(@"Failed to create cryptor: %d", result) } 

Затем выясните, насколько большой ваш буфер должен быть:

size_t bufferLength = CCCryptorGetOutputLength(cryptor, [self length], true); 

Теперь создайте буфер:

NSMutableData *buffer = [NSMutableData dataWithLength:bufferLength]; 

Настройка ваши выходные переменные:

size_t outLength; 
NSMutable *cipherData = [NSMutableData data]; 

процесса данные:

result = CCCryptorUpdate(cryptor, 
         [self bytes], 
         [self length], 
         [buffer mutableBytes], 
         [buffer length], 
         &outLength); 

// FIXME: Release cryptor and return error 
if (result != kCCSuccess) { NSAssert(@"Failed to encrypt: %d", result) } 

Копировать то, что мы до сих пор в нашем конечный результат (см примечание):

[cipherData appendBytes:buffer.bytes length:outLength]; 

Завершить (так как нет прокладки, т его не может ничего сделать, но это необходимо в общем случае):

result = CCCryptorFinal(cryptor, 
         [buffer mutableBytes], 
         [buffer length], 
         &outLength); 

// FIXME: Release cryptor and return error 
if (result != kCCSuccess) { NSAssert(@"Failed to finalize: %d", result) } 

Если мы получили что-нибудь добавить, и сделать окончательный Cleanup

[cipherData appendBytes:buffer.bytes length:outLength]; 

result = CCCryptorRelease(cryptor); 
if (result != kCCSuccess) { NSLog(@"Failed to do final cleanup, ignoring: %d", result) } 

И это должно быть.

Обратите внимание, что есть способы, по которым вы можете переделать это, чтобы не было необходимости копировать ваш зашифрованный текст, перемещая указатель буфера вперед между обновлением и финалом, но если это не много зашифрованного текста, я бы просто сделал это простой способ и сделать копию.

+0

Благодарю вас за вашу драгоценную помощь. Вчера я продолжал работать над своим кодом, и я не понимал, что вначале я вставил неправильный фрагмент. Моя цель - расшифровать файл больше, чем зашифровать его. Итак, что вы имеете в виду, что результат не является cipherData? где он будет храниться? –

+0

так что да, в конце концов я прокомментировал CCCryptorFinal, и он работал как шарм. То, что я думаю, заставило его работать, это начальная CCCryptorGetOutputLength. Огромное спасибо. –