Я смотрел и смотрел на это в течение нескольких часов. Я отчаянно пытаюсь заставить iOS зашифровать короткий фрагмент текста с помощью шифрования AES-256, который затем может быть расшифрован с помощью openssl.
Простой? Неа.
Код, который я нашел для iOS, несовместим с ключами и IV для openssl, поэтому мне пришлось его адаптировать, но он явно не работает.
Итак, вот код для шифрования, который я использую... передача строки для шифрования (dataString) строкового ключа (key) и вектора инициализации строки (iv)...
- (NSData *)AES256Encrypt:(NSString *)dataString WithKey:(NSString *)key iv:(NSString *)iv {
// '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)
// fetch key data
//[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
//NSLog(@"keyPtr: '%s'", keyPtr);
NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"keyPtr: '%s'", keyData.bytes);
NSData *dataToEncrypt = [dataString dataUsingEncoding:NSUTF8StringEncoding];
NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [dataToEncrypt 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, kCCOptionPKCS7Padding,
keyData.bytes, kCCKeySizeAES256,
ivData.bytes, // initialisation vector
dataToEncrypt.bytes,
dataToEncrypt.length, /* 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;
}
Для той же строки для кодирования это не дает того же значения, что и при использовании openssl с тем же ключом и iv... например. эта командная строка:
openssl enc -aes-256-cbc -e -in secrets.txt -a -iv 0000 -K 0000 -p
secrets.txt — это просто текстовый файл, содержащий строку, которую нужно зашифровать.
Это выводит что-то вроде этого:
salt=3C66000000000000
key=0000000000000000000000000000000000000000000000000000000000000000
iv =00000000000000000000000000000000
qTMfgtAxbF8Yyh27ZDrcIQ==
А для расшифровки выполните обратную операцию (при условии, что зашифрованная последняя строка данных выше находится в test.secrets.out)
openssl enc -aes-256-cbc -d -in test.secrets.out -a -iv 0000 -K 0000 -p
salt=3C66000000000000
key=0000000000000000000000000000000000000000000000000000000000000000
iv =00000000000000000000000000000000
< text of the secrets.txt file >
Теперь, если я использую ключ и iv из 4 символов, это неправильно кодируется в iOS. Если я использую ключ полной длины и iv, это также не будет правильно кодироваться.
По сути, это проверка, чтобы убедиться, что если я отправлю часть зашифрованных данных, это будет правильная часть данных.
Что мне не хватает?
Некоторый код, который я просмотрел, чтобы попытаться найти ответ...
http://robnapier.net/blog/aes-commoncrypto-564
https://github.com/rnapier/RNCryptor
Здесь тоже много искал и не нашел ответа.
Любая помощь приветствуется.