RUBY による トリプルDES

移転しました。

仕事で暗号化にトリプルDESを使うことになったので、引用だが記載しておく。

引用元
http://www.ruby-lang.org/ja/man/?cmd=view;name=OpenSSL%3A%3ACipher%3A%3ACipher

require 'openssl'
include OpenSSL::Cipher

# Triple DES
# 
c1 = Cipher.new("DES-EDE3-CBC")
c2 = DES.new(:EDE3, "CBC")
pass = "open sesame!"
data = "Hello world!"
c1.pkcs5_keyivgen(pass)
s1 = c1.encrypt.update(data) + c1.final
c2.pkcs5_keyivgen(pass)
s2 = c2.decrypt.update(s1) + c2.final
p(data == s2) #=> true

暗号化の説明

以下より引用。

http://blog.mag2.com/m/log/0000063498/108539780.html?page=2

11.11.2.1.4.3. EDE

 以前(バックナンバーNo.308)でも書きましたが、アプリケーションでDES

 暗号化を利用する場合、単にDESを使う、と指定するだけではありません。

 ブロック暗号方式も同時に指定する必要があります。

 OpenSSLでは以下のパラメータがあります。

des, des-cbc, des-cfb, des-ecb, des-ede, des-ede-cbc, des-ede-cfb, 
des-ede-ofb, des-ede3, des-ede3-cbc, des-ede3-cfb, des-ede3-ofb, des-ofb

 des: des-cbcと同じ。

 des-cbc: DESでブロック暗号にCBCを使う。

 des-cfb: DESでブロック暗号にCFBを使う。

  des-ecb: DESでブロック暗号にECBを使う。

 des-ede: DESでEDE (Encryption-Decryption-Encryption; 暗号、復号、暗号
     を繰り返す)を行う。これはある平文について、鍵2つ(鍵Aと鍵B)
     を使い、鍵Aで暗号化→鍵Bで復号化→鍵Aで暗号化を行う。56ビット
     キーを3つ使い、計168ビット鍵での暗号化となる3DESを鍵2つで行
     える。
     暗号強度的には鍵3つの場合ほどではないが、それほど変わらない。

 des-ede-cbc: DES-EDEをCBCブロック暗号で行う。des-edeと同じ。

 des-ede-cfb: DES-EDEをCFBブロック暗号で行う。

 des-ede-ofb: DES-EDEをOFBブロック暗号で行う。

 des-ede3: des-ede3-cbcと同じ。des-edeに対し、des-ede3は鍵を3つ使い、
     EDEを行う (DES-EDE3)。つまり、
      鍵Aで暗号化→鍵Bで復号化→鍵Cで暗号化
     を行う。

 des-ede3-cbc: DES-EDE3をCBCブロック暗号で行う。des-ede3と同じ。

 des-ede3-cfb: DES-EDE3をCFBブロック暗号で行う。

 des-ede3-ofb: DES-EDE3をOFBブロック暗号で行う。

 des-ofb: DESをOFBブロック暗号で行う。
 

 11.11.2.1.5. 3DES

 上記で記したとおり、OpenSSLのDESにはEDEやEDE3という手法があります。

 これはDESが56ビットという短い鍵長であるために、総当り攻撃を行うと1日

 で鍵が発見されてしまう、という背景から、DES暗号化を3回繰り返して暗号

 強度を高めよう、というものです。

 一般には3DES (triple DES; トリプルデス) と呼ばれます。

 サンデスとかスリーデスとか言う人もいますが、トリプルデスです。

 2つの鍵で暗号化・復号化を行うEDEと、3つの鍵で暗号化・復号化を行う

 EDE3があります。

 なぜ、3つの鍵でEEE、つまり暗号化→暗号化→暗号化にしないのでしょう?

 同じ鍵で暗号化→復号化を行ってしまえば元の平文に戻ってしまいますが、

 異なる鍵で暗号化→復号化を行えば、それは異なる鍵で暗号化→暗号化を行う

 のと同じ暗号強度が得られます。

 鍵Aで暗号化→鍵Bで暗号化→鍵Cで暗号化

 は、

 鍵Aで暗号化→鍵Bで復号化→鍵Aで暗号化

 にしても強度は同じ、つまりEDEはEEEと同じ暗号強度があるということです。

 さらに、EDEで使う2つの鍵を同一にしてしまえば、

  (暗号化→復号化)→暗号化

 で、()内で平文に戻ってしまうため、単純に1つの鍵で暗号化したことと

 同じになります。つまりDESと同じになるわけです。

 ハードウェアやソフトウェアでアルゴリズムを実装するときに、EDE方式を

 使えばDESも3DESも同じロジックで動かせるため、EDEが使われます。