【发布时间】:2017-03-06 18:41:23
【问题描述】:
我正在尝试最终使用 OpenSSL 加密文件并使用 Objective-c CommonCrypto 解密,但在此之前我需要两种方法以相同的方式加密。
这就是我所拥有的:
要加密的字符串:“这是字符串”
键:“thisisthekey”
OpenSSL:
openssl enc -aes256 -a -e -nosalt -in InputFileWithString.txt -out OutputFile.txt thisisthekey
来自 openSSL 的 base 64 编码字符串:HncUM4ryxSR7Rdi7Z49HPl9veOPxkk3l8GYIgorBhbk=
Objective-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=
如您所见,每种方法都生成不同的加密字符串。任何想法如何使它们都产生相同的字符串?
【问题讨论】:
-
看看github.com/rnapier/RNOpenSSLCryptor,它会引导您完成并总结。 “thisisthekey”不是正确的键(见下面zaph的回答)。很可能您实际上是想使用密码,RNOpenSSLCryptor 将为您处理。
-
这个似乎很相关:How to decrypt data with Openssl tool encrypted with AES128 in iOS,但答案不是很好,因为它告诉你访问一些博客。
-
感谢大家的意见。我在这里找到了一篇很好的文章:richardwarrender.com/2016/04/…
标签: objective-c encryption openssl commoncrypto