Декодировать строку OpenSSL AES256 в iOS - PullRequest
2 голосов
/ 14 февраля 2012

CLI

$ echo -n "TEST1" | openssl enc -aes256 -k FUUU -nosalt -a
bYbkQJcDFZt3y3UQEMbEeg==

iOS

NSString *leSYT = @"bYbkQJcDFZt3y3UQEMbEeg==";
NSData *data = [NSData dataFromBase64String:leSYT];
NSLog(@"%@",[data AES256DecryptWithKey:@"FUUU"]);

iOS ничего не выводит, так как это не удалось.Чего мне не хватает?

Дополнения NSData: http://pastie.org/426530 // NSData + Base64 от Мэтта Галлахера

1 Ответ

3 голосов
/ 14 февраля 2012

Опция -k в утилите OpenSSL enc выводит ключ AES и IV из вашей парольной фразы "FUUU". Вы можете использовать опцию -p, чтобы OpenSSL напечатал ключ AES256 и IV, которые он получил:

$ echo -n "TEST1" | openssl enc -aes256 -k FUUU -nosalt -a -p
key=59C12FFF74992ED40F4DF80A56AB55AE7C513B17CB4B8CF8342E9444C7F7AF3B
iv =0BEE68AD25123B7076B91A5AFB549E33
bYbkQJcDFZt3y3UQEMbEeg==

AES256DecryptWithKey ожидает 32-байтовый ключ AES, как говорится в комментариях:

- (NSData *)AES256DecryptWithKey:(NSString *)key {
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

Но даже если вы преобразуете строку ключа из OpenSSL в строку байтов (не 64 символа ASCII. 32 байта), вы все равно не сможете расшифровать ее и вернуть исходную строку. Это потому, что OpenSSL использует IV, но AES256DecryptWithKey не является:

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                 keyPtr, kCCKeySizeAES256,
                                 NULL /* initialization vector (optional) */,
                                 [self bytes], dataLength, /* input */
                                 buffer, bufferSize, /* output */
                                 &numBytesDecrypted);

(видите, что NULL передается для IV? Это не сработает для вас)

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

...