お世話になります。

iOSのAES256暗号化に利用する暗号化キーについてです。

下記のようなコードで暗号化キーを生成し、暗号化キーの保存は  
キーチェーンで行い、暗号化/複合化のたびにキーチェーンから  
暗号化キーを取得する形式を想定しています。  
※キーチェーンへの読み書きはLUKeychainAccessを利用予定です。

**暗号化キー生成ロジック**

```

    NSString *seed = @"abcde.....6789";
    NSString *key  = @"";
    
    for(int cnt = 0;cnt < 32;cnt++){
        key = [key stringByAppendingString:[seed substringWithRange:NSMakeRange((int)arc4random_uniform((int)seed.length),1)]];
    }
    return key;
    
```

この方法で暗号化キー生成/管理する場合、セキュリティ上の問題等は発生するのでしょうか？  
問題がある場合、生成/管理それぞれどのような方式に変更したらよいか教えて頂けると幸いです。
CC BY-SA 3.0
2016-04-20T08:51:42.007
24180
2016-04-22T00:04:46.760
2016-04-20T11:39:23.370
76
9986
question
ios objective-c
AES暗号化キーの生成及び管理について
Objective-Cはよくわからないのですが、`seed`に含まれる文字をランダムに取り出し32文字連結、と言うことで良いでしょうか。

AESが要求するのは鍵長256bitの場合「32文字の文字列」ではなく「256bitの値」です。特定文字に限定すると鍵のbit数が小さくなってしまいます。(ASCII表示可能文字32文字だと210bit)

共通鍵暗号の鍵を乱数から導出する場合は、暗号論的に安全な乱数生成器(CSPRNG)を使用すべきです。

arc4random*がCSPRNGとして使えるかどうかは定か出ないのですが、[`SecRandomCopyBytes`](https://developer.apple.com/library/ios/documentation/Security/Reference/RandomizationReference/)はCSPRNGだと明記されており、必要な長さのバイト列が取り出せるのでこちらを使った方が良いように思います。

多少鍵空間が小さくなるのは目をつぶると言うことであれば、1度SHA-256を通してから使うとよいでしょう。ASCII文字列だと0から数えて8の倍数bit目が必ず0になるので、規則性が出てしまいます。ハッシュ関数を通すことでそれを回避できます。
CC BY-SA 3.0
2016-04-22T00:04:46.760
24231
2016-04-22T00:04:46.760
5793
24180
answer