Шифрование с помощью OpenSSL и CommonCrypto

Я пытаюсь в конечном итоге зашифровать файл с помощью OpenSSL и расшифровать с помощью Objective-c CommonCrypto, но прежде чем это сработает, мне нужно, чтобы оба подхода шифровали одинаково.

Вот что у меня есть:

Строка для шифрования: «Это строка»

Ключ: "это ключ"

OpenSSL:

openssl enc -aes256 -a -e -nosalt -in InputFileWithString.txt -out OutputFile.txt thisisthekey

Результирующая строка в кодировке base 64 из openSSL: HncUM4ryxSR7Rdi7Z49HPl9veOPxkk3l8GYIgorBhbk=

Цель-c CommonCrypto:

+(NSString *)encryptText:(NSString *)text withKey:(NSString *)key{
    NSData *plainData = [text dataUsingEncoding:NSUTF8StringEncoding];

    NSData *encryptedData = [plainData AES256EncryptWithKey:key];

    NSString *base64String = [encryptedData base64EncodedStringWithOptions:0];

    return base64String;
}

- (NSData*)AES256EncryptWithKey:(NSString*)key {
    char keyPtr[kCCKeySizeAES256 + 1]; 
    bzero(keyPtr, sizeof(keyPtr)); 

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

    NSUInteger dataLength = [self length];

    size_t bufferSize           = dataLength + kCCBlockSizeAES128;
    void* buffer                = malloc(bufferSize);

    size_t numBytesEncrypted    = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL,
                                          [self bytes], dataLength, 
                                          buffer, bufferSize,
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess)
    {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer);
    return nil;
}

Результирующая строка в кодировке base 64: gNCs4d0GAxZHRcOtu8RVpLgN0ONKk1r5XkJ4GtL7W2I=

Как видите, каждый подход создает другую зашифрованную строку. Любые идеи, как заставить их обоих производить одну и ту же строку?


person user3564870    schedule 24.10.2016    source источник
comment
Взгляните на github.com/rnapier/RNOpenSSLCryptor, где вы узнаете об этом и завершите. thisisthekey не является правильным ключом (см. ответ zaph ниже). Скорее всего, вы на самом деле хотите использовать пароль, который RNOpenSSLCryptor обработает за вас.   -  person Rob Napier    schedule 25.10.2016
comment
Попробуйте OpenSSL EVP_BytesToKey CommonCrypto site: stackoverflow.com   -  person jww    schedule 25.10.2016
comment
Это кажется очень актуальным: Как расшифровать данные с помощью инструмента Openssl, зашифрованного с помощью AES128 в iOS, но ответ не так уж хорош, потому что он предлагает вам посетить какой-то блог.   -  person jww    schedule 25.10.2016
comment
Спасибо, ребята, за вклад. Я нашел здесь очень хорошую запись: richardwarrender .com/2016/04/   -  person user3564870    schedule 27.10.2016


Ответы (2)


  1. Используйте ключ полной длины, 256 бит, который составляет 32 байта, не полагайтесь на заполнение. CCCrypt ожидает 32-байтовый ключ из-за kCCKeySizeAES256, но вы предоставляете 12 байтов и заполняете оставшееся пространство ключа нулями.

  2. По умолчанию для CCCrypt используется режим CBC, но вы указываете NULL IV. По сути, это даст вам режим ECB, но лучше указать конкретную опцию: kCCOptionECBMode.

person zaph    schedule 24.10.2016

Хороший рабочий пример находится здесь:

https://richardwarrender.com/2016/04/encrypt-data-using-aes-and-256-bit-keys/

person user3564870    schedule 15.11.2016
comment
Примечания по связанному шифрованию: 1. Допустимые размеры ключа для AES: 128 192 и 256 байт. 2. Действительно необходимо использовать случайный IV, иначе два идентичных сообщения будут одинаковыми, даже если можно определить только первую часть одной и той же информации. Создайте случайный IV с помощью SecRandomCopyBytes(), используйте его и, как уже отмечалось, добавьте его к зашифрованным данным. 3. Длина шестигранного ключа должна быть проверена, простое заполнение может вызвать проблемы совместимости. - person zaph; 16.11.2016