Вот как я генерировать ключи AES256. Единственное, что интересно, это то, что я получаю CommonCrypto для оценки количества раундов. Это выглядит довольно просто.
#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);
Имейте в виду, что калибровка PBKDF может быть ОК, если вам нужно всего лишь вывести ключ на одном устройстве (или, по крайней мере, на тот же класс устройств). Когда вы, например, необходимо синхронизировать данные и выводить один и тот же ключ на разных устройствах, тогда более разумный подход - установить несколько раундов, которые будут безболезненно работать на всех устройствах (например, Mac Pro & iPhone). Что-то между 10000-20000 должно быть хорошим числом в 2012 году. –
Лучше использовать SecRandomCopyBytes() для генерации псевдослучайных чисел в приложениях криптографии. - В противном случае отличный код! Мне нравится бит оценки раунда PBKDF2 =) –
Нужно ли создавать соль длиной 32 байта? –