Voici comment je générer des clés de AES256. Le seul intéressant est que je reçois CommonCrypto pour estimer pour moi combien de tours à utiliser. Cela semble assez simple.
#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);
Gardez à l'esprit que l'étalonnage PBKDF peut être OK si vous avez seulement besoin de dériver une clé sur un périphérique (ou au moins la même classe de périphériques). Lorsque vous faites par exemple besoin de synchroniser les données et de dériver la même clé sur différents appareils, alors il est plus judicieux de définir un nombre de tours qui fonctionnera sans problème sur tous les appareils (par exemple Mac Pro et iPhone). Quelque chose entre 10000-20000 devrait être un bon nombre en 2012. –
Il est préférable d'utiliser SecRandomCopyBytes() pour la génération de nombres pseudo-aléatoires dans les applications de cryptographie. - Sinon, super code! J'aime le bit d'estimation ronde PBKDF2 =) –
Est-il nécessaire de créer un sel de longueur 32 octets? –