【发布时间】:2013-07-08 04:39:53
【问题描述】:
我正在尝试与AES256 合作,将字符串从 iPhone 应用程序发送到服务器并返回。
使用以下代码,我可以成功地加密一个字符串并使用以下代码解密一个字符串:-
// Encryption Methods
NSString *theStringToDecrypt = @"{\"String\":\"This is a string\"}";
NSData *theEncodedString = [theStringToDecrypt dataUsingEncoding:NSUTF8StringEncoding]; // NSUTF8 Encrypt the string
NSData *encryptedData = [theEncodedString AES256EncryptWithKey:theKey]; // Encrypt to AES-256
NSData *decryptedData = [encryptedData AES256DecryptWithKey:theKey]; // Decrypt from AES-256
NSString *theDecodedString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; // NSUTF8 Decode the string
NSString *theString = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding]; // NSUTF8 Decode the string
NSLog(@"theDecryptedKey=%@ | theEncryptedKey=%@",theString,theDecodedString);
所以,这会抓取一个字符串,使用UTF8 编码转换为NSData,然后使用AES256 加密数据。然后它解密NSData 并转换回字符串。
这可以正常工作并成功加密/解密字符串。
我遇到的问题是我从服务器获取数据作为解密字符串,因此需要将字符串传递给AES256DecryptWithKey 以简单地解密它,但AES256DecryptWithKey 仅适用于NSData。
这会导致问题,因为我已经有一个加密字符串,因此转换为数据然后加密为 AES 包括 UTF8 编码,因此我实际上只是将 UTF8 字符串转换回解密的字符串。
我是在这里遗漏了一些简单的东西,还是有一种更黑暗的力量在起作用?
【问题讨论】:
-
这取决于服务器如何将其编码为字符串。
-
它将按照我们的意愿进行编码。目前我们正在测试所有这些,所以 atm 我什至没有使用服务器端,而是有一个我正在测试的解密字符串的 NSString!
-
你说上面的代码虽然有效。为什么不像解密字符串那样从加密字符串中取出数据。
-
所以我有一个解密的“字符串”,如果我将它转换为 NSData,它使用 NSUTF8 的编码,所以我使用 AES256EncryptWithKey 解密它,它是无效的,因为 UTF8 已将内容添加到数据中。
-
这就是为什么我问你的服务器将如何制作字符串。如果它只是使用文字 UTF-8 数据创建一个字符串,那么就没有问题。上面的代码示例工作证明了这一点。 UTF-8 编码不会“添加”任何内容,它只是将其转换为字节数组。如果您查看它,您会注意到字节和字母之间的一对一匹配(无论如何,对于 ASCII)。如果您的服务器无法做到这一点,那么您将不得不使用 Base64 发送它。
标签: iphone ios objective-c encryption commoncrypto