From: "ry.ichi" Date: 2007-11-21T00:53:39+09:00 Subject: [ruby-list:44254] Re: Rubyで3DESを使用する際に鍵を複数指定する方法 いちのみやと申します。 はじめまして。 07/11/20 に 松風 敬 さんは書きました: > Rubyで以下のような鍵A,Bを作成して,その鍵を使用して暗号化形式 > "des-ede"でメッセージを暗号化、その暗号化したものをさらに複合 > 化したいです。 > > 鍵A作成 → 'keymessage1'をMD5でハッシュ化したもの > 鍵B作成 → 'keymessage2'をMD5でハッシュ化したもの > > ※あるメッセージを > 鍵Aで暗号化 → 鍵Bで複合化 → 鍵Aで暗号化 > のように暗号化(des-ede)し、これを複合化するコード TripleDESは鍵を2個または3個使って DESの暗号化→復号→暗号化をするものですが、 鍵を別々に設定するのではなく 2 or 3個の鍵を連結したものを1つの鍵(128bit or 192bit)として 設定するようになっています。 なので、鍵Aと鍵Bを連結したものを鍵として設定すれば ご希望の処理が実現できると思います。 require 'openssl' require 'md5' include OpenSSL::Cipher key1 = MD5.digest('keymessage1')[0..7] key2 = MD5.digest('keymessage2')[0..7] msg = "12345678" # # TripleDES(des-ede)で暗号(key1+key2) # c1 = Cipher.new("des-ede") c1.key = key1 + key2 c1.padding = 0 msg1_e = c1.encrypt.update(msg) + c1.final # # DESで暗号(key1)→復号(key2)→暗号(key1) # c21 = Cipher.new("des-ecb") c21.key = key1 c21.padding = 0 c22 = Cipher.new("des-ecb") c22.key = key2 c22.padding = 0 # key1で暗号化 msg2_e = c21.encrypt.update(msg) + c21.final # key2で復号 msg2_ed = c22.decrypt.update(msg2_e) + c22.final # key1で暗号化 msg2_ede = c21.encrypt.update(msg2_ed) + c21.final # 暗号文を比較 p msg1_e == msg2_ede # => true # 暗号文が同じなので当然ですが、どっちでも復号できます # msg2_edeをc1で復号 msg1d = c1.decrypt.update(msg2_ede) + c1.final p msg1d # => "12345678" # msg1_eをc21, c22で復号(復号(key1)→暗号(key2)→復号(key1)) msg2d_ed = c21.decrypt.update(msg1_e) + c21.final msg2d_e = c22.encrypt.update(msg2d_ed) + c22.final msg2d = c21.decrypt.update(msg2d_e) + c21.final p msg2d # => "12345678" よく分かってませんがpadding = 0をしないと key2で復号するところで怒られます。 "bad decrypt (OpenSSL::CipherError)" (PKCS?とかの関係らしいですが詳しく調べていません) -- ICHINOMIYA Ryuji