On Wed, Oct 12, 2016 at 02:30:42PM +0900, 松永 肇一 wrote:
> 松永と申します。
> 
> cで記述されたBlowfishを使った暗号化関数をrubyで書き直しています。
> このときの鍵の扱いについて質問です。
> 
> OpenSSL::Cipherのリファレンスを見るとkey=メソッドに『なお、ここでいう「暗号鍵」は各暗号アルゴリズムに渡される鍵であって、
> 「パスワード」ではありません。』という記述があります。

はい、そうです。

> 
> cのソースコードを見るとBF_set_keyを使ってパスフレーズを変換して、BF_KEYという構造体に格納しているようです。

どのライブラリでしょうか。OpenSSL(libcrypto)だとすると、BF_set_key()
も同様に直接暗号鍵を設定するものです。ですから、

    BF_KEY key;
    BF_set_key(&key, 8, "\0\1\2\3\4\5\6\7");

に相当するものは、OpenSSL::Cipher で書き直すと、

    cipher = OpenSSL::Cipher.new("bf-<なにか>").encrypt
    cipher.key_len = 8
    cipher.key = "\0\1\2\3\4\5\6\7"

となります。

> 
> key=メソッドが期待するのはパスフレーズではなく、それを変換した後の暗号鍵だと思うのですが、それをrubyで実装する方法が分かりません。参考になるサイト等ご存じの方はいらっしゃいませんでしょうか。
> 

パスワードから暗号鍵を導出する方法はいくつかありますが、Ruby の標準ライ
ブラリの中では PBKDF2(+HMAC) が使えます。

    salt = OpenSSL::Random.random_bytes(16)
    key_iv = OpenSSL::PKCS5.pbkdf2_hmac(pass, salt, 100_000, cipher.key_len + cipher.iv_len, "sha256")
    cipher.key = key_iv[0, cipher.key_len]
    cipher.iv = key_iv[cipher.key_len, cipher.iv_len]

> 
> -- 
> 松永肇一
>