Создать случайный 128-битный ключ шифрования AES в iOS

Я хочу создать случайный ключ шифрования AES (128 бит) в IOS. Я искал в SO, но не могу найти хороший ответ. Пожалуйста, дайте мне совет. заранее спасибо.

ОБНОВИТЬ:

Я использовал BBAES lib. Я использовал приведенный ниже код для генерации ключа шифрования, но когда я конвертирую из NSData в NSString, он показывает NULL

  -(NSData*)randomDataWithLength{
    NSData* salt = [BBAES randomDataWithLength:BBAESSaltDefaultLength];
    NSData *key = [BBAES keyBySaltingPassword:@"password" salt:salt keySize:BBAESKeySize128 numberOfIterations:BBAESPBKDF2DefaultIterationsCount];
    NSLog(@"Data ASE Key %@",key);
    NSString *aString  = [[NSString alloc] initWithData:key encoding:NSUTF8StringEncoding];
}

3 ответа

Возможно, вы захотите использовать генератор случайных байтов Apple для этого, который считается более безопасным, чем arc4random.

int SecRandomCopyBytes ( SecRandomRef rnd, size_t count, uint8_t *bytes ); 

https://developer.apple.com/library/ios/documentation/Security/Reference/RandomizationReference/index.html

Хорошее объяснение этому можно найти в блоге Джеймса Кэрролла:

http://jamescarroll.xyz/2015/09/09/safely-generating-cryptographically-secure-random-numbers-with-swift/

Open Whisper Systems использует это для iOS-версии своего популярного приложения для безопасного чата Signal.

Вау, это сложный код для простой задачи!

- (NSData *)random128BitAESKey {
    unsigned char buf[16];
    arc4random_buf(buf, sizeof(buf));
    return [NSData dataWithBytes:buf length:sizeof(buf)];
}

Возможно, вы где-то слышали, что вам следует использовать соль и хешировать свои пароли. Похоже, вы слишком далеко зашли по этому совету: здесь нет паролей, но ваш код все еще солит и хеширует данные! Это совершенно бесполезно, когда ввод поступает от безопасного генератора случайных чисел, такого как arc4random,

Конечно, он не будет преобразован в NSString потому что случайные данные вряд ли будут действительной строкой UTF-8.

Это может помочь

- (NSString *)getRandomKey{
    NSString *alphabet  = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789/=+";
    NSMutableString *s = [NSMutableString stringWithCapacity:20];
    for (NSUInteger i = 0; i < 20; i++) {
        u_int32_t r = arc4random() % [alphabet length];
        unichar c = [alphabet characterAtIndex:r];
        [s appendFormat:@"%C", c];
    }
    NSLog(@"%@", s);
    NSString *key = s;
    return key;
}
Другие вопросы по тегам