यहाँ कैसे मैं AES256 कुंजी उत्पन्न है। एकमात्र दिलचस्प यह है कि मुझे आमक्रिप्टो का अनुमान लगाने के लिए मिलता है कि कितने राउंड का उपयोग करना है। यह बहुत सरल लगता है।
#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);
ध्यान रखें कि पीबीकेडीएफ अंशांकन ठीक हो सकता है यदि आपको केवल एक डिवाइस (या कम से कम उपकरणों के समान वर्ग) पर एक कुंजी प्राप्त करने की आवश्यकता है। जब आप उदा। डेटा को सिंक करने और विभिन्न उपकरणों पर एक ही कुंजी प्राप्त करने की आवश्यकता है, फिर यह कई राउंड सेट करने के लिए एक और समझदार दृष्टिकोण है जो सभी उपकरणों (जैसे मैक प्रो और आईफोन) पर दर्द रहित ढंग से काम करेगा। 2012 में 10000-20000 के बीच कुछ अच्छी संख्या होनी चाहिए। –
क्रिप्टोग्राफी अनुप्रयोगों में छद्म-यादृच्छिक संख्या पीढ़ी के लिए SecRandomCopyBytes() का उपयोग करना बेहतर है। - अन्यथा, महान कोड! मुझे पीबीकेडीएफ 2 राउंड अनुमान बिट पसंद है =) –
लंबाई 32 बाइट्स का नमक बनाना आवश्यक है? –