Crittografia AES iOS – Imansible crittografare

Nel mio progetto ho avuto l’opportunità di implementare AES 128 CBC Encryption. Sto usando Category e si basa su NSData. Questo è il mio codice di crittografia:

- (NSData*)AES128Decrypt { char ivPtr[kCCKeySizeAES128 + 1]; bzero(ivPtr, sizeof(ivPtr)); // fetch iv data [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; // 'key' should be 32 bytes for AES256, will be null-padded otherwise char keyPtr[kCCKeySizeAES128 + 1]; // room for terminator (unused) bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) // fetch key data [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [self length]; // dataLength = 19 //See the doc: For block ciphers, the output size will always be less than or //equal to the input size plus the size of one block. //That's why we need to add the size of one block here size_t bufferSize = dataLength + kCCBlockSizeAES128; void* buffer = malloc(bufferSize); size_t numBytesDecrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, keyPtr, kCCKeySizeAES128, ivPtr, [self bytes], dataLength, buffer, bufferSize, &numBytesDecrypted); // buffer = 0 & numBytesDecrypted = 0 if (cryptStatus == kCCSuccess) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytes:buffer length:numBytesDecrypted] ; // returns 0 } free(buffer); //free the buffer; return nil; } 

Ed è così che lo chiamo dalla mia class di vista:

 - (void) testActuallyEncrypting :(NSString*) hexString { NSLog(@"String to Encrypt : %@", hexString); // prints test12 @try { //Convert NSString to NSData NSData *data = [self dataFromHexString:hexString]; // [hexString dataUsingEncoding:NSUTF8StringEncoding]; // // // Prepare the NSDAta obj to store the encrypted pswd NSData *encryptedData = [NSData dataWithBytes:[data bytes] length:[data length]]; // 6bytes NSData *decryptedData = [encryptedData AES128Decrypt]; // 0bytes NSString *decryptedString = [NSString stringWithUTF8String:[decryptedData bytes]]; // NULL Exception NSLog(@"Decrypted String : %@", decryptedString); decryptedString = [self addPaddingToString:decryptedString]; decryptedData = [NSData dataWithBytes:[decryptedString UTF8String] length:[[decryptedString dataUsingEncoding:NSUTF8StringEncoding] length]]; encryptedData = [decryptedData AES128Encrypt]; if (encryptedData!=nil) { NSString *encryptedHexString = [self hexStringFromData:encryptedData]; NSLog(@"Encrypted HexString : %@",encryptedHexString); } }@catch (NSException *ex) { NSLog(@"Exception : %@", ex); } } 

Sto passando la stringa "test12" per essere crittografata. Alla chiamata AES128Decrypt , decryptedData è 0, a causa del quale la riga successiva decryptedString genera un’eccezione Null – Exception : *** +[NSString stringWithUTF8String:]: NULL cString .

Qualcuno può aiutarmi a capire perché decryptedData è nullo. Dove sto andando male nel metodo AES128Decrypt?

Mi aiuti per favore. Sono bloccato su questo dagli ultimi 2 giorni. Ho cercato molto su internet, ma non ho trovato nessuna soluzione per farcela. Qualsiasi aiuto è molto apprezzato. Grazie.

AGGIORNAMENTO: – Aggiunto il metodo @ Zaph nella mia class e lo sto chiamando.

 NSLog(@"String to Encrypt : %@", hexString); NSString *iv = @"fedcba9876543210"; NSString *key = @"0123456789abcdef"; // Convert str to encrypt, iv & key from NSString to NSData NSData *dataIn = [hexString dataUsingEncoding:NSUTF8StringEncoding]; NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding]; NSData *symKey = [key dataUsingEncoding:NSUTF8StringEncoding]; NSError *error; NSData *result = [LoginViewController doCipher:dataIn iv:ivData key:symKey context:kCCEncrypt error:&error]; // result = 16bytes if (result != nil) { // Convert result to satring NSString *resultStr = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]; NSLog(@"Encrypted Str = %@", resultStr ); // Encrypted Str = (null) ???? 

Perché la stringa convertita è nullo? Qualsiasi aiuto per favore. Grazie

Non è necessario rendere la crittografia così complicata, ecco un metodo di crittografia / decrittografia di base. Iv e key devono essere della lunghezza corretta. Il contesto del valore è kCCEncrypt o kCCDecrypt .

 + (NSData *)doCipher:(NSData *)dataIn iv:(NSData *)iv key:(NSData *)symmetricKey context:(CCOperation)encryptOrDecrypt error:(NSError **)error { CCCryptorStatus ccStatus = kCCSuccess; size_t cryptBytes = 0; NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128]; ccStatus = CCCrypt( encryptOrDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, symmetricKey.bytes, kCCKeySizeAES128, iv.bytes, dataIn.bytes, dataIn.length, dataOut.mutableBytes, dataOut.length, &cryptBytes); if (ccStatus == kCCSuccess) { dataOut.length = cryptBytes; } else { if (error) { *error = [NSError errorWithDomain:@"kEncryptionError" code:ccStatus userInfo:nil]; } dataOut = nil; } return dataOut; }