对iPhone上的NSString进行AES加密
任何人都可以指出我正确的方向来加密一个字符串,返回另一个字符串与加密的数据? (我一直在尝试使用AES256加密。)我想编写一个方法,它需要两个NSString实例,一个是要加密的消息,另一个是“密码”来加密它 - 我怀疑我必须生成带有密码的加密密钥,如果密码与加密数据一起提供,则可以反转该方式。 该方法应该返回一个由加密数据创建的NSString。
我已经尝试过在这篇文章的第一条评论中详细介绍的技术,但到目前为止我还没有运气。 苹果的CryptoExercise肯定有一些东西,但我无法理解它......我看过很多关于CCCrypt的参考,但是在我使用它的每一种情况下都失败了。
我也必须能够解密一个加密的字符串,但我希望这很简单,如kCCEncrypt / kCCDecrypt。
由于您没有发布任何代码,因此很难确切知道您遇到的问题。 但是,链接到的博客文章似乎工作CCCrypt()
体面......除了每次调用CCCrypt()
引起编译错误的额外逗号。
后来对这篇文章的评论包括了这个改编的代码,它适用于我,似乎更简单一些。 如果你包含他们的NSData类别的代码,你可以这样写:(注意: printf()
调用仅用于展示不同点的数据状态 - 在真实的应用程序中,它是没有意义的打印这些值。)
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *key = @"my password";
NSString *secret = @"text to encrypt";
NSData *plain = [secret dataUsingEncoding:NSUTF8StringEncoding];
NSData *cipher = [plain AES256EncryptWithKey:key];
printf("%sn", [[cipher description] UTF8String]);
plain = [cipher AES256DecryptWithKey:key];
printf("%sn", [[plain description] UTF8String]);
printf("%sn", [[[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding] UTF8String]);
[pool drain];
return 0;
}
鉴于此代码以及加密数据不会总是很好地转换为NSString的事实,编写两种方法可能会更方便,这两种方法会将您需要的功能(包括正向和反向)
- (NSData*) encryptString:(NSString*)plaintext withKey:(NSString*)key {
return [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key];
}
- (NSString*) decryptData:(NSData*)ciphertext withKey:(NSString*)key {
return [[[NSString alloc] initWithData:[ciphertext AES256DecryptWithKey:key]
encoding:NSUTF8StringEncoding] autorelease];
}
这绝对适用于Snow Leopard, @Boz报告说CommonCrypto是iPhone上Core OS的一部分。 10.4和10.5都有/usr/include/CommonCrypto
,虽然10.5有一个CCCryptor.3cc
的手册页,10.4没有,所以YMMV。
编辑:看到这个后续问题使用Base64编码表示加密数据字节作为一个字符串(如果需要)使用安全,无损转换。
我已经将NSData和NSString的类别集合在一起,它使用Jeff LaMarche的博客中找到的解决方案以及Quinn Taylor在Stack Overflow中的一些提示。
它使用类别来扩展NSData以提供AES256加密,并且还提供NSString到BASE64的扩展 - 将加密数据安全地编码为字符串。
下面是一个显示加密字符串用法的例子:
NSString *plainString = @"This string will be encrypted";
NSString *key = @"YourEncryptionKey"; // should be provided by a user
NSLog( @"Original String: %@", plainString );
NSString *encryptedString = [plainString AES256EncryptWithKey:key];
NSLog( @"Encrypted String: %@", encryptedString );
NSLog( @"Decrypted String: %@", [encryptedString AES256DecryptWithKey:key] );
在这里获取完整的源代码:
https://gist.github.com/838614
感谢所有有用的提示!
迈克尔
@owlstead,关于您对“给定答案之一的加密安全变体”的请求,请参阅RNCryptor。 它旨在完成您请求的内容(并且是为响应这里列出的代码的问题而构建的)。
RNCryptor使用带盐的PBKDF2,提供一个随机的IV,并附加HMAC(也由PBKDF2产生自己的盐),它支持同步和异步操作。
链接地址: http://www.djcxy.com/p/35131.html