Как расшифровать данные с помощью инструмента Openssl, зашифрованного с помощью AES128 в iOS - PullRequest
5 голосов
/ 24 сентября 2011

У меня есть много фрагментов кода, которые шифруют данные с помощью AES128 (если вы предоставите вашу рабочую реализацию, я буду очень благодарен). Например, такой:

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

    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    //See the doc: For block ciphers, the output size will always be less than or
    //equal to the input size plus the size of one block.
    //That's why we need to add the size of one block here
    size_t bufferSize           = dataLength + kCCBlockSizeAES128;
    void* buffer                = malloc(bufferSize);

    size_t numBytesEncrypted    = 0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode + kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES128,
                                          NULL /* initialization vector (optional) */,
                                          [self bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess)
    {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer); //free the buffer;
    return nil;
}

После этого данные кодируются в base64.с помощью онлайн-инструмента я сохраняю его в data.bin

. Я хочу расшифровать эти данные с помощью OpenSSl.Но когда я звоню

openssl enc -aes-128-ecb -in data.bin -out out.bin -d -pass pass:0123456789123456

Это говорит мне плохое магическое число

В случае, если я использую

openssl enc -aes-128-ecb -in data.bin -out out.bin -d -pass pass:0123456789123456 -nosalt

Это говорит мне плохая расшифровка

Пожалуйста, помогите.

1 Ответ

5 голосов
/ 24 сентября 2011

Здесь есть несколько проблем.Во-первых, вы шифруете в режиме CBC (который используется по умолчанию для CCCrypt), но расшифровываете в режиме ECB.Очень редко есть причина использовать режим ECB.

Вы шифруете строку (я полагаю, "0123456789123456") в качестве ключа , а не пароля .Это разные вещи.Я не уверен, как openssl переводит пароль в ключ.Я не вижу объяснения этому на странице enc(1).Я предполагаю, что он использует PBKDF2, но это не ясно (и количество итераций не указано).Вы должны передавать фактический ключ с опцией -K.В этом случае вам также необходимо явно передать IV.Вы не правильно генерируете IV или соль.Вы должны быть, и тогда вы должны передать их openssl.

Чтобы понять, как правильно это зашифровать, см. Правильное шифрование с помощью AES с CommonCrypto .Как только у вас есть что-то должным образом зашифрованное, вы должны иметь правильный ключ, соль и IV.Передайте все это enc, используя aes-128-cbc (при условии 128-битного AES), и оно должно работать.

РЕДАКТИРОВАТЬ

Стоит констатировать очевидноездесь: шифрование / дешифрование намного проще, если вы используете один и тот же инструментарий с обеих сторон.Чтобы сделать то, что вы пытаетесь сделать, вы действительно должны понимать все гайки и болты как CCCrypt (), так и OpenSSL, поэтому я и обсуждаю их.Даже если вы найдете что-то, что «кажется, работает», безопасность может быть очень плохой, даже если вы этого не поймете.AES128EncryptWithKey: является примером этого;это выглядит хорошо, и это "работает", но у него есть несколько проблем безопасности.Если возможно, я бы использовал OpenSSL с обеих сторон или CCCrypt с обеих сторон.

...