¿Por qué mi initWithData devuelve nil que indica un error después de convertir NSDATA a NSString que regresa de encriptar a través de CommonCrypto?

StackOverflow https://stackoverflow.com/questions/8815570

Pregunta

Aquí está mi código:

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

}

La segunda en la última declaración estoy convirtiendo los NSData encriptados en un NSString para fines de visualización, pero vuelve nulo. NIL es una respuesta válida que indica y un error. He detenido la ejecución justo después de que se haya ejecutado esa declaración y aquí están los 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) 

El estado es nulo que indica que no hubo error en el cifrado. Todos los valores parecen ser como se esperaba, pero el initwithData falla. Aquí está la vista de iPhone de operaciones:

The app screen when Encrypt button is pressed

¿Por qué el initwithdata está fallando aquí?

¿Fue útil?

Solución

Como dice la documentación, initWithData:encoding: puede devolver nulo si los datos aprobados no son datos válidos para la codificación. A diferencia de algunas codificaciones, no puede simplemente tomar datos arbitrarios y fingir que son datos UTF8: tiene que ajustarse a la especificación UTF8.

Su encryptedData El objeto NSDATA contendrá datos aparentemente aleatorios: es muy probable que sean datos UTF8 válidos y así initWithData:encoding: es muy probable que falle.

Si solo está buscando algo que pueda pegar en un cuadro de texto, es posible que desee probar Base64 codificando los datos cifrados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top