暗号化・複合化を行う ブロック暗号
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
関連記事
- PostgreSQLでSCRAM authentication requires libpq version 10 or aboveと出るとき
- Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合
- プログラムでもっとも正確に日本の祝日を求める方法(内閣府公表CSVの過去3度の改訂履歴)
- yumのius(iuscommunity.org)でエラーが出る場合
- iusリポジトリで公開されているパッケージの一覧
- Twitter APIでのエラーの一覧
- 「ID」や「ID_xxxx」という文字列があるCSVファイルをExcelで開くとSYLKエラーが出る
- Excelの日付が数字になるときの対処法
- facebook APIを使用する時にfacebook Appsでアプリを登録するまでの流れ
- SELECTタグで色を選択する場合のサンプル
- [暗号化]ブロック暗号とは(AES/DES/Blowfish PKCS5Padding ECB/CBC IV)
- switch文とif文の違い
- NetBeans6のインストール(JavaだけでなくRuby、PHP、C/C++に対応した統合開発環境)
- Rubyのスクリプトをexeファイルに変換する (RubyScript2Exe)
- memcachedを使用する(memcache-client)
- リファラやユーザーエージェントなどのリクエストヘッダーを取得する
- Ruby開発環境 RDE(Ruby Development Environment)
- msiファイル版Rubyのインストール ActiveScriptRuby
- EclipseでRuby開発環境を作る RDT(Ruby Development Tool)
- Rubyとは
スポンサーリンク