Aquí es cómo generar claves AES256. Lo único interesante es que obtengo CommonCrypto para calcular cuántas rondas debo usar. Parece bastante sencillo.
#import <CommonCrypto/CommonKeyDerivation.h>
...
// Makes a random 256-bit salt
- (NSData*)generateSalt256 {
unsigned char salt[32];
for (int i=0; i<32; i++) {
salt[i] = (unsigned char)arc4random();
}
return [NSData dataWithBytes:salt length:32];
}
...
// Make keys!
NSString* myPass = @"MyPassword1234";
NSData* myPassData = [myPass dataUsingEncoding:NSUTF8StringEncoding];
NSData* salt = [self generateSalt256];
// How many rounds to use so that it takes 0.1s ?
int rounds = CCCalibratePBKDF(kCCPBKDF2, myPassData.length, salt.length, kCCPRFHmacAlgSHA256, 32, 100);
// Open CommonKeyDerivation.h for help
unsigned char key[32];
CCKeyDerivationPBKDF(kCCPBKDF2, myPassData.bytes, myPassData.length, salt.bytes, salt.length, kCCPRFHmacAlgSHA256, rounds, key, 32);
Tenga en cuenta que la calibración de PBKDF puede estar bien si solo necesita derivar una clave en un dispositivo (o al menos la misma clase de dispositivos). Cuando, por ejemplo, Necesita sincronizar datos y derivar la misma clave en diferentes dispositivos, entonces es un enfoque más sensato establecer una serie de rondas que funcionen sin problemas en todos los dispositivos (por ejemplo, Mac Pro y iPhone). Algo entre 10000-20000 debería ser un buen número en 2012. –
Es mejor usar SecRandomCopyBytes() para la generación de números pseudoaleatorios en aplicaciones de criptografía. - De lo contrario, gran código! Me gusta el bit de estimación de redondeo PBKDF2 =) –
¿Es necesario crear una sal de longitud 32 bytes? –