带有openssl加密数据的NSString initWithBytes使用NSUTF8StringEncoding返回nil

时间:2014-07-21 16:30:19

标签: ios objective-c encryption nsstring openssl

我遇到了一个问题,我试图从OpenSSL创建的加密数据创建一个NSString,并且我一直为字符串获取nil。

我用来加密和解密数据的代码取自以下链接http://saju.net.in/code/misc/openssl_aes.c.txt

现在这里是我打电话来加密我的数据的代码(" aes_init"当然是在我的应用程序init上调用的):

//-- encrypt saved data
int textLen = str.size();
char* buff = const_cast<char*>(str.c_str());

EVP_CIPHER_CTX encryptCtx;
unsigned char *ciphertext = aes_encrypt(&encryptCtx,
                                    reinterpret_cast<unsigned char*>(buff),
                                    &textLen);

NSString * nsstring = [[NSString alloc] initWithBytes:reinterpret_cast<const char*>(ciphertext)
                                    length:strlen(reinterpret_cast<const char*>(ciphertext))
                                        encoding:NSUTF8StringEncoding];
[nsstring autorelease];

UIApplication* clientApp = [UIApplication sharedApplication];
AppController* appController = ((AppController *)clientApp.delegate);
[appController saveData:nsstring]; //--> crash at this line

我尝试了不同的编码(NSASCIIStringEncoding和NSUnicodeStringEncoding)并且它们没有崩溃但是我解码后数据完全错误。

有关如何解决此问题的任何想法?

谢谢:)

1 个答案:

答案 0 :(得分:1)

密文,加密函数的输出应该与随机无法区分。这意味着可以生成任何字节值,包括不映射到字符的字节值。因此,需要编码密文,例如使用base 64编码。