Почему мой initWithData возвращает nil, указывая на ошибку после преобразования NSData в NSString, возвращающуюся из шифрования через CommonCrypto? - PullRequest
1 голос
/ 11 января 2012

Вот мой код:

-(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 для целей отображения, но возвращается ноль.Ноль является действительным ответом, указывающим на ошибку.Я остановил выполнение сразу после того, как этот оператор запустился, и вот правила:

(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 здесь?

1 Ответ

6 голосов
/ 12 января 2012

Как сказано в документации, initWithData:encoding: может вернуть ноль, если переданные данные не являются действительными данными для кодировки. В отличие от некоторых кодировок, вы не можете просто взять произвольные данные и притвориться, что это данные UTF8 - они должны соответствовать спецификации UTF8.

Ваш encryptedData NSData-объект будет содержать, казалось бы, случайные данные - маловероятно, что это будут действительные данные utf8, поэтому initWithData:encoding: с большой вероятностью завершится ошибкой.

Если вы просто ищете что-то, что можно вставить в текстовое поле, вы можете попробовать base64-кодирование зашифрованных данных.

...