Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > opensslライブラリ > OpenSSL::Cipherクラス
クラスの継承リスト: OpenSSL::Cipher < Object < Kernel
共通鍵暗号のために抽象化されたインターフェースを提供するクラスです。
基本的にこのクラスを直接使ってデータを暗号化することは 避けてください。通常はより高水準なインターフェースが利用可能な はずです。必要なのは暗号アルゴリズムを指定するため OpenSSL::Cipher.new で暗号オブジェクトを生成することだけでしょう。
もし、このクラスを直接利用して暗号化する場合は、暗号の鍵や IV(Initialization Vector)の取り扱いについて正しく理解してからに してください。
以下の手順で利用します。
ruby 1.8.3 から Cast5 と Idea が CAST5 と IDEA に改名されました。
AES のようなブロック暗号では暗号方式を選択する際に モードを指定する必要があります。このライブラリでは 以下のような文字列でモードを指定できます。
これらの文字列の意味は openssl/参考文献 などで調べてください。 AES を用いる場合、通常は CBC を用いれば良いでしょう。 選択肢によっては安全性に問題があるので気をつけてください。
require 'openssl'
# 暗号化するデータ
data = "*secret data*"
# パスワード
pass = "**secret password**"
# salt
salt = OpenSSL::Random.random_bytes(8)
# 暗号化器を作成する
enc = OpenSSL::Cipher.new("AES-256-CBC")
enc.encrypt
# 鍵とIV(Initialize Vector)を PKCS#5 に従ってパスワードと salt から生成する
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, 2000, enc.key_len + enc.iv_len)
key = key_iv[0, enc.key_len]
iv = key_iv[enc.key_len, enc.iv_len]
# 鍵とIVを設定する
enc.key = key
enc.iv = iv
# 暗号化する
encrypted_data = ""
encrypted_data << enc.update(data)
encrypted_data << enc.final
p encrypted_data
# 復号化器を作成する
dec = OpenSSL::Cipher.new("AES-256-CBC")
dec.decrypt
# 鍵とIVを設定する
dec.key = key
dec.iv = iv
# 復号化する
decrypted_data = ""
decrypted_data << dec.update(encrypted_data)
decrypted_data << dec.final
p decrypted_data
ciphers -> [String][permalink][rdoc]利用可能な暗号方式名を文字列の配列で返します。
OpenSSL::Cipher.ciphers # => ["AES-128-CBC", "AES-128-CFB", "AES-128-CFB1", "AES-128-CFB8", "AES-128-ECB", "AES-128-OFB", "AES-192-CBC", ... ]
new(name) -> OpenSSL::Cipher[permalink][rdoc]共通鍵暗号のアルゴリズム名を渡し、対応する暗号オブジェクトを生成します。
利用できるアルゴリズムはシステムにインストールされている openssl に依存します。 OpenSSL::Cipher.ciphers で利用可能な暗号のアルゴリズム名が得られます。
さまざまな方式がありますが、2006年現在 aes256 (aes-256-cbc) を用いるのが安心でしょう。
block_size -> Integer[permalink][rdoc]暗号化のブロックのサイズをバイト数で返します。
decrypt(pass, iv = nil) -> self[permalink][rdoc]復号化の準備をします。
暗号オブジェクトの内部状態を復号化のために初期化します。
pass と iv が渡された場合、これらを用いて鍵を生成し、暗号オブジェクトに 鍵と IV を設定します。このやりかたは非標準的であるため利用すべきではありません。
encrypt -> self[permalink][rdoc]encrypt(pass, iv = nil) -> self暗号化の準備をします。
暗号オブジェクトの内部状態を暗号化のために初期化します。
pass と iv が渡された場合、これらを用いて鍵を生成し、暗号オブジェクトに 鍵と IV を設定します。このやりかたは非標準的であるため利用すべきではありません。
final -> String[permalink][rdoc]暗号オブジェクト内部に残されたデータを暗号化/復号化し、文字列で 返します。
パディング(OpenSSL::Cipher#padding=)を有効にしている場合は、 残されたデータにパディングを付加した上で暗号化します。
iv=(iv)[permalink][rdoc]IV(Initialization Vector) を設定します。
iv_len -> Integer[permalink][rdoc]必要な IV(Initialization Vector) の長さをバイト数で返します。
key=(key)[permalink][rdoc]暗号鍵を設定します。
なお、ここでいう「暗号鍵」は各暗号アルゴリズムに渡される鍵であって、 「パスワード」ではありません。
key_len -> Integer[permalink][rdoc]暗号鍵の長さをバイト数で返します。
key_len=(length)[permalink][rdoc]暗号鍵の長さを変更します。
name -> String[permalink][rdoc]暗号化アルゴリズムの名前を文字列で返します。
padding=(padding)[permalink][rdoc]パディングを設定します。
1 でバディングを有効に、0で無効にします。
パディングを無効化した場合には、暗号化するデータのサイズはブロックサイズの 倍数でなければなりません。
暗号化する側と復号化する側でパディングの設定を一致させておかなければなりません。
pkcs5_keyivgen(pass, salt=nil, num=2048, digest="md5") -> nil[permalink][rdoc]pass と salt から鍵と IV を生成し、暗号オブジェクトに設定します。
このメソッドは PKCS#5 v1.5 で定義されている方法に 従って鍵と IV を生成します。PKCS#5 v1.5 と正しく互換するには digest は md5 か sha1 を使い、暗号アルゴリズムは RC2, RC4-40, DES のいずれかを使わなければなりません。
このメソッドの利用は推奨されません。これではなく PKCS#5 v2.0 に定義されている方法で鍵と IV を生成すべきです。
salt が nil である場合には salt なしと見なします。
num は必要なデータの生成でハッシュ関数を何回繰り返し適用するかを 指定します。最低でも1000を使うべきです。
[SEE_ALSO] OpenSSL::PKCS5
random_iv -> String[permalink][rdoc]IV を乱数で生成し、暗号オブジェクトに設定します。
生成した IV を文字列で返します。
random_key -> String[permalink][rdoc]鍵を乱数で生成し、暗号オブジェクトに設定します。
生成した鍵を文字列で返します。
reset -> self[permalink][rdoc]内部状態をリセットします。
鍵、IV、暗号化/復号化待ちデータなどがクリアされます。
update(data) -> String[permalink][rdoc]渡された文字列を暗号化もしくは復号化して文字列として返します。
どちらがなされるかは直前に OpenSSL::Cipher#encrypt もしくは OpenSSL::Cipher#decrypt のいずれが呼びだされたかに よって決まります。
ブロック暗号を利用する場合は、暗号化/復号化はブロックサイズで規定された バイト数ごとに行われます。そのため余ったデータは暗号オブジェクト内部に 保存され、次の文字列が渡されたときに使われます。
暗号化/復号化すべきデータを渡し終えた後は、 OpenSSL::Cipher#final を呼びだして暗号オブジェクト内部に残されたデータを暗号化/復号化 する必要があります。