Pourquoi mon nul initWithData de retour indiquant une erreur après la conversion NSData à NSString retour de cryptage via CommonCrypto?

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

Question

Voici mon code:

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

}

Le deuxième à la dernière déclaration que je suis le convertir NSData crypté à un NSString à des fins d'affichage, mais il est nul retour. Nil est une réponse valide indiquant l'erreur. Je l'ai arrêté le droit d'exécution après cette déclaration a fonctionné et voici les 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) 

Le statut est nul indiquant qu'il y avait erreur NO dans le cryptage. Toutes les valeurs semblent être comme prévu, mais le initWithData échoue. Voici les opérations de vue iPhone:

L'écran d'application lorsque le bouton Encrypt est pressé

Pourquoi le initWithData échec ici?

Était-ce utile?

La solution

Comme dit la documentation, initWithData:encoding: peut revenir à zéro si les données transmises ne sont pas des données valides pour le codage. Contrairement à certains encodages, vous ne pouvez pas simplement des données arbitraires et prétendre ses données UTF8 -. Il doit être conforme à la spécification UTF8

Votre objet encryptedData NSData contiendra des données apparemment aléatoires -. Très peu probable données UTF8 valides et ainsi initWithData:encoding: est très susceptible d'échouer

Si vous êtes à la recherche de quelque chose que vous pouvez coller dans une zone de texte, vous pouvez essayer base64 coder les données cryptées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top