Rubyで3DESを使用する際に鍵を複数指定する方法に
移転しました。
"); // リダイレクト setTimeout("redirect()", 2000); // 2 sec function redirect(){ location.href = url; } // canonical の書き換え var link = document.getElementsByTagName("link")[0]; link.href = url; -->Rubyメーリングリストで、Rubyで3DESを使用する際に鍵を複数指定する方法に
ついて問合せたところ、ものすごい良い回答が帰ってきました。
以下ソースです。もしソース公開に不都合があればご連絡ください。
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?とかの関係らしいですが詳しく調べていません)