2012-01-11 65 views
1

这里是我的代码:为什么我的initWithData在将NSData转换为NSString后通过CommonCrypto从加密返回后返回nil指示错误?

-(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; 

}

倒数第二个声明,我将加密的NSData到一个NSString用于显示目的,但它回来了零。无是有效的响应指示和错误。我已经停止了该声明已运行后立即执行,并在这里是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) 

状态是零,表明有在加密无错误。所有值都如预期的那样,但initWithData失败。下面是操作iPhone的看法:

The app screen when Encrypt button is pressed

为什么initWithData失败吗?

+2

这些字节非常不可能是有效的utf8数据 – 2012-01-11 07:23:54

+0

Fredrick,为什么?那里提供的代码会对你提到的内容负责任? – Ric 2012-01-11 17:50:57

回答

6

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

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

如果您只是在寻找可以保存在文本框中的东西,那么您可能需要尝试对加密数据进行base64编码。

+0

宾果!谢谢 。 – Ric 2012-01-12 04:58:11