OpenSSL::Cipher::Cipher

対称鍵暗号のために抽象化されたインターフェースを提供するクラス。

以下が実装されているクラス。

AES も OpenSSL::Cipher::Cipher.new('aes256') などとすれば利用可能です。

ruby 1.8.3 feature: Cast5 と Idea が CAST5 と IDEA に改名されました。

使用例。

require 'openssl'

p a123 = "0123456789"
pass = "hogehoge"
enc = OpenSSL::Cipher::DES.new
enc.encrypt
enc.pkcs5_keyivgen(pass)
p a = enc.update(a123)
p b = enc.final
s = a + b

dec = OpenSSL::Cipher::DES.new
dec.decrypt
dec.pkcs5_keyivgen(pass)
p a = dec.update(s)
p b = dec.final
p a + b #=> "0123456789"

クラスメソッド

Cipher.new(name)
Cipher.new()

対称鍵暗号アルゴリズムの名前 name を与えると暗号オブジェクトを生成する。 利用できるアルゴリズムはシステムにインストールされている openssl に依存します。

$ openssl
OpenSSL> version
OpenSSL 0.9.7d 17 Mar 2004
OpenSSL> enc help
(略)  
Cipher Types
-aes-128-cbc               -aes-128-cfb               -aes-128-ecb
-aes-128-ofb               -aes-192-cbc               -aes-192-cfb
-aes-192-ecb               -aes-192-ofb               -aes-256-cbc
-aes-256-cfb               -aes-256-ecb               -aes-256-ofb
-aes128                    -aes192                    -aes256
-bf                        -bf-cbc                    -bf-cfb
-bf-ecb                    -bf-ofb                    -blowfish
-cast                      -cast-cbc                  -cast5-cbc
-cast5-cfb                 -cast5-ecb                 -cast5-ofb
-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                   -des3                      -desx
-desx-cbc                  -idea                      -idea-cbc
-idea-cfb                  -idea-ecb                  -idea-ofb
-rc2                       -rc2-40-cbc                -rc2-64-cbc
-rc2-cbc                   -rc2-cfb                   -rc2-ecb
-rc2-ofb                   -rc4                       -rc4-40
-rc5                       -rc5-cbc                   -rc5-cfb
-rc5-ecb                   -rc5-ofb

さまざまな方式がありますが、2006年現在 aes256 (aes-256-cbc) を用いるのが安心でしょう。

参考: UNIXの部屋 検索結果: openssl

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

c1 = Cipher.new("AES256")
c2 = Cipher.new("AES-256-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

メソッド

reset

暗号、暗号鍵、暗号化復号化フラグを共にリセットする。

encrypt(key, iv)

暗号化の準備をする。iv は initialization vector、必要なら使用される。 このAPIに引数を渡すのは推奨しない。パスワードから鍵を生成する場合は、 pkcs5_keyivgenを使用すること。

decrypt(key, iv)

復号化の準備をする。iv は initialization vector、必要なら使用される。 このAPIに引数を渡すのは推奨しない。パスワードから鍵を生成する場合は、 pkcs5_keyivgenを使用すること。

update(data)

与えられた文字列を暗号化あるいは復号化して文字列として返す。直前に呼ばれた encrypt あるいは decrypt により暗号化か復号化かが決まる。

final()

ブロックに残っているデータを暗号化あるいは復号化する。final() を呼んだあとでは update を呼んではいけない。

key=

暗号鍵を設定する。 なお、ここでいう「暗号鍵」は AES のアルゴリズムに渡される鍵であり、「パスワード」ではない。

key_len
key_len=

暗号鍵の長さ。

iv=

初期ベクトル (initialization vector)。

iv_len

初期ベクトルの長さ。

block_size

ブロックのサイズを返す。

padding=

パディングを設定する。

pkcs5_keyivgen(pass, salt=nil, num=2048, digest=OpenSSL::Digest::MD5.new())

pass から key と iv を生成し key= と iv= に設定する。 salt は 8-octet string でないといけない。nil を返す。

エラー

OpenSSL::Cipher::CipherError



rubyist ML