暗号化・複合化を行う ブロック暗号

Rubyでブロック暗号を行うにはOpenSSL::Cipherを使用します。
DESやAESやBlowfishが使用可能です。

[参考記事] ブロック暗号とは
[参考記事] PHPで暗号化・複合化を行う ブロック暗号
[参考記事] Javaで暗号化・複合化を行う ブロック暗号
[参考記事] Perlで暗号化・複合化を行う ブロック暗号

サンプルコード
使用できる暗号アルゴリズムの一覧

この暗号化方式はアルゴリズム規定のブロック長に分割して秘密鍵を用いて暗号化を行います。
規定のブロック長に分割する方式を暗号利用モードブロック長に満たないときの補完方法をパディング方式といいます。
暗号利用モードで分割するときに前の平文ブロックの結果を次の平文に使用しますが、この最初のブロックで使用される値がIV(初期化ベクトル)です。

まとめ
暗号化の流れ
(1) ブロック長に満たない部分をパディング方式で補完する。
(2) アルゴリズムに対応したブロック長に分割する。
 このときの分割ルールを決めるのが暗号利用モード
 分割モードによっては初期値が必要で、これがIV(初期化ベクトル)
(3) 暗号鍵を用いてアルゴリズムで暗号化する。
(4) 分割されたデータを結合する。

復号化の流れ
(1) アルゴリズムに対応したブロック長に分割する。
(2) 暗号鍵を用いてアルゴリズムで復号化する。
(3) 暗号利用モードを元に分割されたデータを結合する。
 分割モードによっては初期値が必要で、これがIV(初期化ベクトル)
(4) 補完されたパディングをパディング方式で除去する。

ブロック暗号では、
ブロック長
秘密鍵
暗号アルゴリズム
暗号利用モード
パディング方式
IV(初期化ベクトル)
の6つのキーワードが重要です。

利用できるアルゴリズムはシステムにインストールされている openssl に依存します。
ブロック長、共通鍵の長さは使用する暗号アルゴリズムに依存します。

標準のパディング方式はPKCS#5 Paddingです。 OpenSSLに依存するので、OpenSSLの場合の暗号化は

$ echo 'Hello World!' | openssl enc -e -aes-128-cbc  < cipher.txt
enter aes-128-cbc encryption password: ********

復号化は

$ openssl enc -d -aes-128-cbc < cipher.txt

サンプルコード

require 'openssl'
class CryptUtil

  def self.encrypt(pass, value)
    enc = OpenSSL::Cipher.new('aes-128-cbc')
    # enc = OpenSSL::Cipher::DES.new DESの場合
    # 暗号化を指定
    enc.encrypt 
    # ivを生成
    iv = OpenSSL::Random.random_bytes(16) 
    # 暗号化する際のキー文字列をセット
    enc.key = pass
    # ivをセット
    enc.iv = iv
    # パディングをセット
    # enc.padding = padding
    crypted = ""
    crypted << enc.update(value) # 暗号化
    crypted << enc.final

    return crypted
  end

  def self.decrypt(pass, encrypted, iv)
    dec = OpenSSL::Cipher.new('aes-128-cbc')
    # dec = OpenSSL::Cipher::DES.new DESの場合
    # 暗号化する際のキー文字列をセット
    dec.key = pass
    # ivをセット
    dec.iv = iv
    dec.decrypt
    # パディングをセット
    # dec.padding = padding
    plain_text = ""
    plain_text << dec.update(encrypted)
    plain_text << dec.final
    return plain_text
  end

end

使用できる暗号アルゴリズムの一覧

OpenSSL::Cipher::BF
OpenSSL::Cipher::CAST5
OpenSSL::Cipher::DES
OpenSSL::Cipher::IDEA
OpenSSL::Cipher::RC2
OpenSSL::Cipher::RC4
OpenSSL::Cipher::RC5
OpenSSL::Cipher::Cipher.new('aes256')

使用できるアルゴリズムの一覧は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

関連記事

スポンサーリンク

$config_read_hiddenクラス変数 設定ファイルのhiddenセクションをテンプレートから読み込むかどうか

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る