Dưới đây là làm thế nào tôi tạo ra các phím AES256. Điều thú vị duy nhất là tôi nhận được CommonCrypto để ước tính cho tôi có bao nhiêu viên đạn để sử dụng. Nó có vẻ khá đơn giản.
#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);
Hãy nhớ rằng hiệu chuẩn PBKDF có thể là OK nếu bạn chỉ cần lấy một khóa trên một thiết bị (hoặc ít nhất là cùng một loại thiết bị). Khi bạn, ví dụ: cần phải đồng bộ hóa dữ liệu và lấy cùng một khóa trên các thiết bị khác nhau, thì đó là một cách tiếp cận hợp lý hơn để đặt số vòng sẽ hoạt động không đau trên tất cả các thiết bị (ví dụ: Mac Pro & iPhone). Một cái gì đó giữa 10000-20000 nên là một con số tốt trong năm 2012. –
Tốt hơn nên sử dụng SecRandomCopyBytes() để tạo số giả ngẫu nhiên trong các ứng dụng mã hóa. - Nếu không, mã tuyệt vời! Tôi thích bit ước lượng vòng PBKDF2 =) –
Có cần thiết để tạo ra một muối có độ dài 32 byte không? –