type=class
superclass=Object
included=
extended=
dynamically_included=
dynamically_extended=
library=openssl
aliases=
aliasof=

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

基本的にこのクラスを直接使ってデータを暗号化することは
避けてください。通常はより高水準なインターフェースが利用可能な
はずです。必要なのは暗号アルゴリズムを指定するため 
[[m:OpenSSL::Cipher.new]] で暗号オブジェクトを生成することだけでしょう。

もし、このクラスを直接利用して暗号化する場合は、暗号の鍵や
IV(Initialization Vector)の取り扱いについて正しく理解してからに
してください。

以下の手順で利用します。
  * [[m:OpenSSL::Cipher.new]] や [[m:OpenSSL::Cipher::AES256.new]] 
    などで暗号オブジェクトを生成する
  * [[m:OpenSSL::Cipher#encrypt]], [[m:OpenSSL::Cipher#decrypt]] で
    暗号、復号のいずれをするかを設定する
  * [[m:OpenSSL::Cipher#key=]], [[m:OpenSSL::Cipher#iv=]], 
    [[m:OpenSSL::Cipher#random_key]], [[m:OpenSSL::Cipher#random_iv]] などで
    鍵と IV(initialization vector) を設定する
  * [[m:OpenSSL::Cipher#update]], [[m:OpenSSL::Cipher#final]] で
    暗号化/復号化をする


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

=== ブロック暗号モード
AES のようなブロック暗号では暗号方式を選択する際に
モードを指定する必要があります。このライブラリでは
以下のような文字列でモードを指定できます。
  * "CBC"
  * "CFB"
  * "ECB"
  * "OFB"
これらの文字列の意味は
[[ref:lib:openssl#references]] などで調べてください。
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
