在iOS中创建随机128位AES加密密钥

时间:2014-05-08 02:05:34

标签: ios objective-c cocoa-touch aes

我想在ios中创建随机AES加密密钥(128位)。我搜索过但我找不到一个好的答案。请给我一些建议。提前谢谢。

更新:

我使用过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 个答案:

答案 0 :(得分:10)

哇,这是一个简单任务的复杂代码!

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

您可能听说过应该使用salt并哈希密码。看起来你对这个建议有点过分了:这里有没有密码,但你的代码仍然会对数据进行盐分和哈希处理!当输入来自arc4random等安全随机数生成器时,这完全没用。

当然它不会转换为NSString,因为随机数据不太可能是有效的UTF-8字符串。

答案 1 :(得分:8)

您可能希望使用Apple的随机字节生成器,这被认为比arc4random更安全。

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

https://developer.apple.com/library/ios/documentation/Security/Reference/RandomizationReference/index.html#//apple_ref/c/func/SecRandomCopyBytes

对此的一个很好的解释可以在James Carroll的博客文章中找到:

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

Open Whisper Systems将此用于其受欢迎的安全聊天应用程序信号的iOS版本

答案 2 :(得分:-3)

这可能会有所帮助

- (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;
}