我已经花了几个小时看这个问题,我正在拼命地尝试使用AES-256加密iOS上的一小段文本,然后可以通过openssl进行解密。
看起来很简单?不是的。
我找到的iOS代码与openssl的密钥和IV不兼容,因此我不得不对其进行调整,但它显然没有起作用。
所以这就是我使用的加密代码...传入要加密的字符串(dataString),一个字符串密钥(key)和一个字符串初始化向量(iv)...
现在,如果我使用4个字符的密钥和iv,这在iOS中无法正确编码。如果我使用完整长度的密钥和iv,这也无法正确编码。
基本上,这是一个检查,以确定如果我发送了一段加密数据,它是否是正确的数据。
我错过了什么?
我已经查看了一些代码,试图找到答案...
看起来很简单?不是的。
我找到的iOS代码与openssl的密钥和IV不兼容,因此我不得不对其进行调整,但它显然没有起作用。
所以这就是我使用的加密代码...传入要加密的字符串(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中不会产生相同的值...例如,以下命令行:
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 >
现在,如果我使用4个字符的密钥和iv,这在iOS中无法正确编码。如果我使用完整长度的密钥和iv,这也无法正确编码。
基本上,这是一个检查,以确定如果我发送了一段加密数据,它是否是正确的数据。
我错过了什么?
我已经查看了一些代码,试图找到答案...
http://robnapier.net/blog/aes-commoncrypto-564
https://github.com/rnapier/RNCryptor
我在这里进行了广泛搜索,但仍找不到答案。
非常感谢您的帮助。