Perché il mio ritorno a zero initWithData che indica un errore dopo la conversione NSData a NSString ritorno da cifrare via CommonCrypto?

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

Domanda

Ecco il mio codice:

-(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 penultima affermazione sto convertendo il NSData crittografato a un NSString per la visualizzazione, ma si tratta nil indietro. Nil è una risposta valida indicazione e di errore. Ho smesso di destra esecuzione dopo che la dichiarazione è eseguito e qui ci sono le 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) 

Lo stato è pari a zero indica che non c'era errore NO nel crittografia. Tutti i valori sembrano essere come previsto, ma l'initWithData fallisce. Ecco l'operazioni di visualizzazione iPhone:

Lo schermo app quando si preme il pulsante Encrypt

Perché l'initWithData fallendo qui?

È stato utile?

Soluzione

Come dice la documentazione, initWithData:encoding: può restituire nil se i dati passati non sono dati validi per la codifica. A differenza di alcuni codifiche, non si può semplicemente prendere i dati arbitrario e finta che sia i dati UTF8 -. Deve essere conforme alle specifiche UTF8

Il tuo encryptedData NSData oggetto conterrà i dati apparentemente casuali -. Altamente improbabile che siano i dati utf8 validi e così initWithData:encoding: è molto probabile a fallire

Se siete solo in cerca di qualcosa che si può attaccare in una casella di testo, si potrebbe desiderare di provare la codifica Base64 i dati crittografati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top