ttlog

日々の開発で得た知見の技術メモ。モバイルアプリネタが多いです。

256bit乱数を生成する方法

256bitに限った話ではないのですが、大きめの乱数を生成する方法です。

乱数の生成は以下のように様々な方法がありますが、

  • RandomNumberGenerator
  • arc4random()
  • arc4random_uniform()
  • rand()
  • random()

いずれにしても最大で64bitまでしか生成出来ないようです。

これ以上の長さの乱数を生成する場合、Security FrameworkのSecRandomCopyBytes()を使用します。

  • 生成
func generate256bitRandom() -> Data? {
    let count = 32  // 32byte = 256bit
    var data = Data(count: count)
    let status = data.withUnsafeMutableBytes { body in
        SecRandomCopyBytes(kSecRandomDefault, count, body.baseAddress!)
    }
    if status == errSecSuccess {
        return data
    }
    return nil
}
  • 呼び出し
print(generate256bitRandom()!.base64EncodedString()) // "oyICfMgwGXUVeML+Lmhb5ixnAB1io+mNI4BlxNYXVaA=" (呼び出し毎に変わる)

let count = 32の部分を調整してあげれば、128bitでも512bitでも生成出来ると思います。