为什么我的initWithData返回nil表示在将NSData转换为从通过CommonCrypto加密返回的NSString后出错?

Ric*_*Ric 1 encryption objective-c ios4 commoncrypto

这是我的代码:

-(IBAction)encryptText:(id)sender
{
key = self.tvKey.text;

CCCryptorStatus status = kCCSuccess;                                        
algorithm = kCCAlgorithmAES128;                                                
CCOptions opts = kCCOptionPKCS7Padding;

NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];

NSString *plainString = [NSString stringWithFormat:@"%@", self.tvEntryText.text];
NSData *plainData = [plainString dataUsingEncoding:NSUTF8StringEncoding];

NSData *encryptedData = [plainData dataEncryptedUsingAlgorithm: algorithm     
                                                           key: keyData       
                                          initializationVector: nil             
                                                       options: opts           
                                                         error: &status];    


if ( status != kCCSuccess ) {
    NSError * err = [NSError errorWithCCCryptorStatus: status];
    self.lblKeyMsg.text = [NSString stringWithFormat:@"Encryption failed: %s", [[err localizedDescription] UTF8String]];
    self.lblKeyMsg.textColor = [UIColor redColor];
    return;
}

NSString *encryptedString = [[[NSString alloc] initWithData:encryptedData encoding:NSUTF8StringEncoding] autorelease];
self.tvResultText.text = encryptedString;
Run Code Online (Sandbox Code Playgroud)

}

倒数第二个语句我将加密的NSData转换为NSString用于显示目的,但它返回零.Nil是一个有效的响应指示和错误.我已经在该语句运行后立即停止执行,这里是vaues:

(gdb) po keyData
<61616161 61616161 61617373 73737373 73737373 64646464 64646464 64646666>
(gdb) po key
aaaaaaaaaassssssssssddddddddddff
(gdb) po plainString
this is a test.
(gdb) po plainData
<74686973 20697320 61207465 73742e>
(gdb) po encryptedData
<f7074146 b295e340 0d947d53 9ea629cf>
(gdb) po encryptedString
Can't print the description of a NIL object.
(gdb) po status
Can't print the description of a NIL object.
(gdb) 
Run Code Online (Sandbox Code Playgroud)

状态为nil表示加密中没有错误.所有值都显示为预期值,但initWithData失败.这是iPhone视图的操作:

按下加密按钮时的应用程序屏幕

为什么initWithData在这里失败?

Fre*_*ung 6

如文档所述,initWithData:encoding:如果传递的数据不是编码的有效数据,则可能返回nil.与某些编码不同,您不能只采用任意数据并伪装成UTF8数据 - 它必须符合UTF8规范.

您的encryptedDataNSData对象将包含看似随机的数据 - 极不可能是有效的utf8数据,因此initWithData:encoding:极有可能失败.

如果您只想找到可以放在文本框中的内容,您可能需要尝试对加密数据进行base64编码.