[ruby-list:50427] Re: [質問] Blowfishの鍵について
From:
Kazuki Yamaguchi <k@...>
Date:
2016-10-12 07:56:34 UTC
List:
ruby-list #50427
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]
>
> --
> 松永肇一
>