Хотя iv неправильно обрабатывает, это наименьшая из проблем.
Ошибка декодирования звучит как неправильная длина аргумента, поскольку любые случайные значения iv, ключ и данные должны быть допустимыми. (Моя жена соглашается, и она делает это профессионально.) Проверяйте такие вещи, как ключ и длину данных после преобразования их в NSData. Обратите внимание, что передача зашифрованных данных с неправильным или несовместимым заполнением также приведет к ошибке декодирования.
Напишите тест для Base64, ваш код iOS против openssl.
Работайте над решением из более простых тестов.
Например, отбрасывайте base64, пока не добьетесь успеха в шифровании. Попробуйте простые данные, скажем, один блок длиной 0, заполнение может быть проблемой. Попробуйте более простой ключ, такой как все 0. Вы можете использовать OPENSSL в командной строке Mac Terminal.
Как только базовое шифрование заработает, добавьте необходимые функции.
Для openssl из командной строки используйте входные и выходные файлы, они будут обрабатывать двоичные файлы, поэтому у вас не будет этого препятствия по крайней мере на начальном этапе. Вот образец:
(file_orig.txt contains: "1234567890123456")
openssl enc -e -aes-128-cbc -K 00ff349830193845af43984758690213 -p -iv 0 -nosalt -in file_orig.txt -out file_aes.txt
, который печатает ключ, который он сгенерировал, а также используемый им iv:
key=00ff349830193845af43984758690213
iv =00000000000000000000000000000000
Затем вы можете прочитать те же файлы данных в вашем методе iOS.
Вот метод iOS, который использует файлы, которые создает openssl:
(поместить вывод ключа openssl в файл key-hex-openssl.txt)
NSData *keyHexData = [@"00ff349830193845af43984758690213" dataUsingEncoding:NSUTF8StringEncoding];
NSData *testData = [NSData dataWithContentsOfFile:@"yourDirectoryPath/file_aes.txt"];
NSData *clearData = [NSData dataWithContentsOfFile:@"yourDirectoryPath/file_orig.txt"];
NSLog(@"keyHexData: %@", keyHexData);
NSLog(@"testData: %@", testData);
NSLog(@"clearData: %@", clearData);
unsigned char keyBytes[16];
unsigned char *hex = (uint8_t *)keyHexData.bytes;
char byte_chars[3] = {'\0','\0','\0'};
for (int i=0; i<16; i++) {
byte_chars[0] = hex[i*2];
byte_chars[1] = hex[(i*2)+1];
keyBytes[i] = strtol(byte_chars, NULL, 16);
}
NSData *keyData = [NSData dataWithBytes:keyBytes length:16];
NSLog(@"keyData: %@", keyData);
NSData *ivData = [NSData dataWithBytes:(char []){0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} length:16];
NSLog(@"ivData: %@", ivData);
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0; // Number of bytes moved to buffer.
NSMutableData *clearOut = [NSMutableData dataWithLength:testData.length];
ccStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
keyData.bytes,
kCCKeySizeAES128,
ivData.bytes,
testData.bytes,
testData.length,
clearOut.mutableBytes,
clearOut.length,
&cryptBytes);
if (ccStatus != kCCSuccess) {
NSLog(@"CCCrypt status: %d", ccStatus);
}
clearOut.length = cryptBytes;
NSLog(@"clearOut: %@", clearOut);
keyHexData: <41393641 34344436 31343245 43463546 33444339 30303038 46453941 34383838>
testData: <86a8b306 0f33db02 01e77e66 af5bcb3a>
clearData: <31323334 35363738 39303132 33343536>
keyData: <a96a44d6 142ecf5f 3dc90008 fe9a4888>
ivData: <00000000 00000000 00000000 00000000>
clearOut: <31323334 35363738 39303132 33343536>
Обратите внимание, что clearData была восстановлена в clearOut
Это демонстрирует шифрование с помощью openssl и дешифрование с помощью CommonCrypto.
Проблемы, которые необходимо преодолеть:
1) Необходимо добавить Base64
Это отправная точка для завершения необходимого шифрования.