¿Algún código fuente de cocoa para el descifrado de cifrado AES?

Estoy buscando algún código de cocoa en encriptación AES y lo busqué en google. Encontré este enlace muy útil: http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html . Así que lo intenté, pero no funcionó para mí.

¿Alguien puede sugerirme algún enlace útil o código fuente que pueda ayudarme a implementarlo en mi aplicación de muestra?

El cifrado AES128 está disponible en el iPhone en el marco CommonCrypto. Las funciones relevantes están en el encabezado CommonCryptor.h.

Puedes crear un cryptor así:

// 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 a partir de la pregunta y el enlace que está buscando, por ejemplo, implementaciones de AES. No recomendaría esto: ¡use la implementación de Apple!

Parece que http://pastie.org/297563.txt podría ayudarlo también, pero no lo he probado.

Utilizo una categoría simple en NSData que usa el marco CommonCrypto para hacer el cifrado AES de 256 bits. Utilizo esto en la Mac pero debería funcionar bien en iPhone también:

 #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 los ejemplos que encontré no funcionaron para mí, así que cambié la solución anterior. Este funciona para mí y usa Google-Lib para las cosas de 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; } 

gracias por la gran extensión de categoría. Una cosa que descubrí es que cuando usa CCCrypt con un algoritmo más fuerte que 64 bits, debe cumplir con las regulaciones de exportación del BIS. Consulte las Preguntas frecuentes sobre iTunes Connect para obtener más detalles. Incluso si usa la API criptográfica de Apple, necesita obtener la aprobación del BIS.

Hubo un debate sobre sf sobre este tema antes (en el contexto del uso de SSL):

Usar SSL en una aplicación de iPhone – Cumplimiento de exportación

Saludos cordiales Chris

    Intereting Posts