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

Perlでブロック暗号を行うにはCrypt::CBCを使用します。
DESやIDEAやBlowfish、Rijndaelが使用可能です。
それ以外はモジュールを読み込む必要があります。

Crypt::CBC

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

サンプルコード
使用できる暗号アルゴリズムの一覧
使用できる暗号利用モードの一覧
指定できるパディング方式の一覧

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

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

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

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

ブロック長、共通鍵の長さは使用する暗号アルゴリズムに依存します。

アルゴリズム、暗号利用モード、パディング方式など暗号化の詳細は次のように指定します。

my $cipher = Crypt::CBC->new(
    -key         => '0123456789ABCDEF', # 暗号化鍵
    -keysize     => 16,                 # 鍵の長さ
    -literal_key => 1,                  # 鍵をMD5ハッシュから派生するかどうか(1:しない/0:する デフォルトは1)
    -cipher      => "Rijndael",         # 暗号化アルゴリズム フルネーム Crypt::Rijndaelでもよい
    -iv          => '0000000000000000', # IV(初期化ベクトル)
    -prepend_iv  => 0,                  # 内部で行われるIV関連の処理を使用するか(1:しない/0:する デフォルトは1)
    -padding     => 'space',            # パディング方式(standard [PKCS#5])
    -pcbc        => 1,                  # PCBCを使うか(1:PCBC/0:CBC デフォルトは0)
);

標準以外の暗号化アルゴリズムを使用するにはCrypt::Rijndael・Crypt::Twofish・Crypt:DES_EDE3 などのモジュールをインストールする必要があります。

サンプルコード

use Crypt::CBC;

# Crypt::CBCのコンストラクタ。
my $cipher = Crypt::CBC->new(
    -key         => '0123456789ABCDEF',
    -keysize     => 16,
    -literal_key => 1,
    -cipher      => "Rijndael",
    -iv          => '0000000000000000',
    -header      => 'none',
);

my $input = 'plain text';

my $ciphertext = $cipher->encrypt_hex($input);
my $plaintext = $cipher->decrypt_hex($ciphertext);

# 入力がバイト型の場合
my $encrypted = $cipher->encrypt($input);
my $decrypted = $cipher->decrypt($encrypted);

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

Crypt::Blowfish
Crypt::Rijndael
Crypt::DES
Crypt::IDEA
Crypt::RC4
Crypt::Blowfish_PP
Crypt::Twofish
Crypt::TripleDES
Crypt::Rijndael_PP
Crypt::RSA

使用できる暗号利用モードの一覧

CBCCipher Block Chaining Modeデフォルト
PCBCPropagating Cipher Block Chainingコンストラクタでpcbc => 1

Crypt::ECB

指定できるパディング方式の一覧

standardPKCS#5 Padding
oneandzeroesブロックを一杯にするだけ必要なだけの"00"がついた"80"で埋められます。
もし最後のブロックがブロック全体で、ブロックサイズが8であれば、"8000000000000000"というブロックが追加されます。
nullZeroBytePadding
spaceZeroBytePaddingの埋める値が0x20

関連記事

スポンサーリンク

XOOPS Cube

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

上に戻る