对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

上一篇: AES Encryption for an NSString on the iPhone

下一篇: How do I convert an NSString value to NSData?