2010-10-17 10 views
5

Me gustaría tener una funcionalidad de cifrado de archivos para mi aplicación de iPhone. Para aplicaciones basadas en escritorio i utiliza la función siguiente para cifrar archivos relativamente pequeños:cifrar un archivo en iphone-sdk

- (NSData *)aesEncrypt:(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; 
} 

Pero no creo que este código se puede usar en un iPhone. Si intento encriptar un archivo de 5 mb, ocupará al menos 10 mb en RAM, ya que se cargará en NSData y se devolverá como tal. ¿Hay algún método que pueda eccriptar un archivo leyendo pequeños bloques y escribiendo el resultado en otro archivo? ¿O estoy equivocado acerca de esto por lo que la toma de m

+0

Hola, también estoy trabajando con el cifrado en una aplicación de cacao en lugar de en el iPhone. ¿Cómo implementó el código anterior con el archivo que utilizó para encriptar? ¿Usaste NDAlias? No puedo entender cómo tomar el contenido del archivo y luego encriptarlo. –

+1

Me rendí, así que solo estoy leyendo un archivo en un búfer de tamaño fijo, encriptando el búfer y escribiendo en un archivo encriptado. Estoy haciendo esto en un bucle, ya que el búfer es mucho más pequeño que el archivo en sí (para evitar los cerdos de memoria). Esto funciona, pero no estoy seguro de si no afecta la fuerza del cifrado. – Marius

+0

Hola, Marius
¿Lo hiciste funcionar? También hago lo mismo leyendo el archivo en un búfer de tamaño fijo y luego encriptando ese búfer. Pero cuando intento descifrar ese archivo encriptado, el resultado es un archivo dañado. ¿Me puede ayudar? – Iducool

Respuesta