Qualquer código-fonte de cacau para descriptografia de criptografia AES?

Eu estou procurando por algum código de cacau em criptografia AES e eu fiz alguma pesquisa no google por isso. Eu encontrei este link muito útil – http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html . Então eu tentei, mas não funcionou para mim.

Alguém pode me sugerir algum link útil ou código-fonte que possa me ajudar a implementá-lo no meu aplicativo de exemplo.

A criptografia AES128 está disponível no iPhone na estrutura CommonCrypto. As funções relevantes estão no header CommonCryptor.h.

Você pode criar um cryptor assim:

// Assume key and keylength exist CCCryptorRef cryptor; if(kCCSuccess != CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES128, 0, key, keyLength, NULL, &cryptor)) ; //handle error // Repeatedly call CCCryptorUpdate to encrypt the data CCCryptorRelease(cryptor); 

Parece da pergunta e do link que você está procurando implementações de exemplo do AES. Eu não recomendaria isso – use a implementação da Apple!

Parece que http://pastie.org/297563.txt pode ajudá-lo também, mas eu não testei isso.

Eu uso uma categoria simples no NSData que usa a estrutura CommonCrypto para fazer criptografia AES de 256 bits. Eu uso isso no Mac, mas também deve funcionar bem no iPhone:

 #import  @implementation NSData (AESAdditions) - (NSData*)AES256EncryptWithKey:(NSString*)key { // 'key' should be 32 bytes for AES256, will be null-padded otherwise char keyPtr[kCCKeySizeAES256 + 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]; //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 numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL /* initialization vector (optional) */, [self bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesEncrypted); if (cryptStatus == kCCSuccess) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free(buffer); //free the buffer; return nil; } - (NSData*)AES256DecryptWithKey:(NSString*)key { // 'key' should be 32 bytes for AES256, will be null-padded otherwise char keyPtr[kCCKeySizeAES256 + 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]; //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, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL /* initialization vector (optional) */, [self bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesDecrypted); if (cryptStatus == kCCSuccess) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; } free(buffer); //free the buffer; return nil; } @end 

Todos os exemplos que encontrei não funcionaram para mim, então mudei a solução acima. Este funciona para mim e usa o material do Google-Lib para Base64:

 + (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData*)data encryptOrDecrypt:(CCOperation)encryptOrDecrypt { // 'key' should be 32 bytes for AES256, will be null-padded otherwise char keyPtr[kCCKeySizeAES256+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]; if (encryptOrDecrypt == kCCDecrypt) { data = [GTMBase64 decodeData:data]; } NSUInteger dataLength = [data length]; //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(encryptOrDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL /* initialization vector (optional) */, [data bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesDecrypted); if (cryptStatus != kCCSuccess){ NSLog(@"ERROR WITH FILE ENCRYPTION / DECRYPTION"); return nil; } NSData *result; if (encryptOrDecrypt == kCCDecrypt) { result = [NSData dataWithBytes:(const void *)buffer length:(NSUInteger)numBytesDecrypted]; } else { NSData *myData = [NSData dataWithBytes:(const void *)buffer length:(NSUInteger)numBytesDecrypted]; result = [GTMBase64 encodeData:myData]; } free(buffer); //free the buffer; return result; } 

obrigado pela ótima extensão da categoria. Uma coisa que eu descobri – quando você usa CCCrypt com um algoritmo mais forte que 64 bits, você precisa estar em conformidade com os regulamentos de exportação do BIS. Veja a FAQ do iTunes Connect para mais detalhes. Mesmo que você use o ini crypto api da Apple, você precisa obter aprovação do BIS.

Houve uma discussão sobre sf sobre este tópico antes (no contexto do uso ssl):

Usando SSL em um aplicativo para iPhone – Conformidade de exportação

Atenciosamente, Chris