1 |
=head1 名前 |
2 |
|
3 |
Crypt::CBC - 暗号ブロック連鎖(Cipher Block Chaining)モードでデータを暗号化します |
4 |
|
5 |
=head1 SYNOPSIS |
6 |
|
7 |
use Crypt::CBC; |
8 |
$cipher = Crypt::CBC->new( {'key' => 'my secret key', |
9 |
'cipher' => 'Blowfish', |
10 |
'iv' => '$KJh#(}q', |
11 |
'regenerate_key' => 0, # default true |
12 |
'padding' => 'space', |
13 |
'prepend_iv' => 0 |
14 |
}); |
15 |
|
16 |
$ciphertext = $cipher->encrypt("This data is hush hush"); |
17 |
$plaintext = $cipher->decrypt($ciphertext); |
18 |
|
19 |
$cipher->start('encrypting'); |
20 |
open(F,"./BIG_FILE"); |
21 |
while (read(F,$buffer,1024)) { |
22 |
print $cipher->crypt($buffer); |
23 |
} |
24 |
print $cipher->finish; |
25 |
|
26 |
|
27 |
=head1 説明 |
28 |
|
29 |
このモジュールは暗号化方法 暗号ブロック連鎖(cipher block chaining mode (CBC))の |
30 |
Perlだけによる実装です。DESやIDEAのようなブロック暗号と組み合わせ、 |
31 |
任意の長さのメッセージを暗号化し復号化することができます。 |
32 |
暗号化されたメッセージはB<SSLeay>により使われる暗号化フォーマットと |
33 |
互換性があります。 |
34 |
|
35 |
このモジュールを利用するためには、まずnew()でCrypt::CBC暗号オブジェクトを |
36 |
生成します。暗号作成の時点で、利用する暗号化キーとオプションでブロック暗号化 |
37 |
アルゴリズムを指定します。暗号化あるいは復号化処理を初期化するためにstart() |
38 |
メソッドを呼び出し、1つあるいは複数のデータブロックを暗号化あるいは |
39 |
復号化するために呼び出し、最後に最後のブロックを埋め込み、暗号化するため |
40 |
finish()を呼びます。便利になるように、一度にデータの値全体を |
41 |
処理するためencrypt() と decrypt()を呼び出すことが出来ます。 |
42 |
|
43 |
=head2 new() |
44 |
|
45 |
$cipher = Crypt::CBC->new( {'key' => 'my secret key', |
46 |
'cipher' => 'Blowfish', |
47 |
'iv' => '$KJh#(}q', |
48 |
'regenerate_key' => 0, # デフォルトはtrue |
49 |
'padding' => 'space', |
50 |
'prepend_iv' => 0 |
51 |
}); |
52 |
|
53 |
# あるいは (以前のバージョンとの互換性のため) |
54 |
$cipher = new Crypt::CBC($key,$algorithm); |
55 |
|
56 |
new()メソッドは新しいCrypt::CBCオブジェクトを作成します。 |
57 |
|
58 |
任意の長さの任意の一連の文字にすることができる、暗号化/復号化キーを |
59 |
与えなければなりません。regenerate_keyがfalseの値として指定されなければ、 |
60 |
実際に使われるキーは、あなたが与えたキーのMD5ハッシュから派生されます。 |
61 |
cipherはオプションで、他に指定されなければDESがデフォルトになります。 |
62 |
あらかじめインストールしておいた互換性のあるブロック暗号であれば |
63 |
なんでも使うことができます。現在、これにはCrypt::DES、Crypt::DES_EDE3、 |
64 |
Crypt::IDEA、Crypt::Blowfish、そして Crypt::Rijndaelが含まれます。 |
65 |
それらのフルネーム("Crypt::IDEA")か省略形("IDEA")を使って、それらを |
66 |
参照することができます。 |
67 |
|
68 |
newへのオプションの'iv'というキーを渡すことによって、あるいは |
69 |
$cipher->start()を呼び出す前に$cipher->set_initialization_key($iv) |
70 |
を呼び出すことによって、初期化ベクトルが指定することができます。 |
71 |
暗号化されたテキストが正規表現/^RandomIV.{8}/にマッチするテキストで |
72 |
表されているのであれば、IVは復号化のさいには無視されます。その場合には |
73 |
"RandomIV"の後ろに付く8文字がIVとして使われます。暗号化するとき、 |
74 |
デフォルトでは暗号化されたテキストは"RandomIVE<lt>IVE<gt>"(16 バイト)で |
75 |
表されます。これを無効にするためには、'prepend_iv'を |
76 |
falseの値に設定してください。パディング方法は'padding'オプションによって |
77 |
指定することができます。何もパディング方法が指定されなければ、 |
78 |
PKCS#5("標準")によるパディングが想定されます。 |
79 |
|
80 |
=head2 start() |
81 |
|
82 |
$cipher->start('encrypting'); |
83 |
$cipher->start('decrypting'); |
84 |
|
85 |
start()メソッドは一連の暗号化、復号化の段階のためにcipherを準備し、 |
86 |
必要であればcipherの内部の状態を再設定します。 |
87 |
暗号化(encryption)あるいは復号化(dencryption)のどちらを望んでいるのかを |
88 |
示す文字列を与える必要があります。"E"、あるいは"e"で始まる任意の単語は |
89 |
暗号化を示します。"D"、あるいは"d"で始まる任意の単語は復号化を示します。 |
90 |
|
91 |
=head2 crypt() |
92 |
|
93 |
$ciphertext = $cipher->crypt($plaintext); |
94 |
|
95 |
start()を呼び出した後、望んでいるデータを暗号化するため必要なだけ |
96 |
crypt()を呼び出さなければなりません。 |
97 |
|
98 |
=head2 finish() |
99 |
|
100 |
$ciphertext = $cipher->finish(); |
101 |
|
102 |
暗号化アルゴリズムのブロックサイズ(典型的には8バイト)の余りがない倍数に |
103 |
なるまで、CBCアルゴリズムはデータブロックを内部的にバッファしなければ |
104 |
なりません。最後のcrypt()呼び出しの後、finish()を呼ばなければなりません。 |
105 |
これは内部バッファを完了させ、残っている暗号化テキストを返します。 |
106 |
|
107 |
典型的なアプリケーションでは、以下のようなループの中でファイルあるいは |
108 |
入力ストリームから平文を読み込み、結果を標準出力に出力することになる |
109 |
でしょう: |
110 |
|
111 |
$cipher = new Crypt::CBC('hey jude!'); |
112 |
$cipher->start('encrypting'); |
113 |
print $cipher->crypt($_) while <>; |
114 |
print $cipher->finish(); |
115 |
|
116 |
=head2 encrypt() |
117 |
|
118 |
$ciphertext = $cipher->encrypt($plaintext) |
119 |
|
120 |
この便利な関数は、与えられた平文を処理し、対応する暗号テキストを返す、 |
121 |
start()、crypt()そして finish()の全体の流れを、あなたに代わって |
122 |
実行します。 |
123 |
|
124 |
=head2 decrypt() |
125 |
|
126 |
$plaintext = $cipher->decrypt($ciphertext) |
127 |
|
128 |
この便利な関数は、与えられた暗号テキストを処理し、対応する平文を返す、 |
129 |
start()、crypt()そして finish()の全体の流れを、あなたに代わって |
130 |
実行します。 |
131 |
|
132 |
=head2 encrypt_hex(), decrypt_hex() |
133 |
|
134 |
$ciphertext = $cipher->encrypt_hex($plaintext) |
135 |
$plaintext = $cipher->decrypt_hex($ciphertext) |
136 |
|
137 |
これらは16進表現の暗号テキストを処理する便利な関数です。 |
138 |
B<encrypt_hex($plaintext)>は、B<unpack('H*',encrypt($plaintext))>と |
139 |
まったく同じです。例えば暗号化されたものを入れたい場合には便利でしょう。 |
140 |
|
141 |
=head2 get_initialization_vector() |
142 |
|
143 |
$iv = $cipher->get_initialization_vector() |
144 |
|
145 |
この関数は暗号化、復号化で使われるIVを返します。 |
146 |
この関数はnew()で何も指定されなければ暗号化のときに使われる、 |
147 |
乱数(random)IVを判定するときにも便利です。 |
148 |
暗号化のときにはstart()が呼び出されるまで、復号化のときには |
149 |
crypt()が最初に呼ばれるまで、IVは設定されるかは保障されません。 |
150 |
|
151 |
=head2 set_initialization_vector() |
152 |
|
153 |
$cipher->set_initialization_vector('76543210') |
154 |
|
155 |
この関数は暗号化そして/あるいは復号化で使用されるIVを設定します。この |
156 |
関数はIVが復号化される暗号テキスト文字列にIVが入っていなければ、 |
157 |
あるいは暗号化のために特定のIVにしたいのであれば便利でしょう。 |
158 |
もし設定されなければ、乱数のIVが生成されます。 |
159 |
暗号化のときにはstart()が呼び出されるまで、復号化のときには |
160 |
crypt()が最初に呼ばれるまで、IVは設定されるかは保障されません。 |
161 |
|
162 |
=head2 パディング方法 |
163 |
|
164 |
パディング方法を変更するためには'padding'オプションを使ってください。 |
165 |
|
166 |
平文の最後のブロックがブロックサイズよりも短いとき、それはパディング |
167 |
されなければなりません。パディング方法には以下のものがあります: |
168 |
"standard"(つまりPKCS#5)、"oneandzeroes"、 "space"、 そして "null"。 |
169 |
|
170 |
standard: (デフォルト) バイナリに対しても安全 |
171 |
切り落されるべきバイト数で埋められます。そのためブロックサイズが |
172 |
8であれば、"0A0B0C"は"05"で埋められ、結果は"0A0B0C0505050505"に |
173 |
なります。もし最後のブロックがブロック全体で、ブロックサイズが8で |
174 |
あれば、"0808080808080808"というブロックが追加されます。 |
175 |
|
176 |
oneandzeroes: バイナリに対しても安全 |
177 |
ブロックを一杯にするだけ必要なだけの"00"がついた"80"で |
178 |
埋められます。もし最後のブロックがブロック全体で、 |
179 |
ブロックサイズが8であれば、"8000000000000000"というブロックが |
180 |
追加されます。 |
181 |
|
182 |
null: テキストのみ |
183 |
ブロックを一杯にするために必要なだけ"00"で埋めます。最後の |
184 |
ブロックがブロック全体で、ブロックサイズが8であれば、 |
185 |
"0000000000000000"というブロックが追加されます。 |
186 |
|
187 |
space: テキストのみ |
188 |
"null"と同じ。ただし"20"でおこないます。 |
189 |
|
190 |
standard と oneandzeroes の2つのパディングはバイナリに対しても安全です。 |
191 |
space と null のパディングはテキスト・データにたいしてのみ推奨されます。 |
192 |
あなたがどのパディングを使うのかは、(Crypt::CBCライブラリではない)外部と |
193 |
通信したいかどうかによります。もしそうのような場合であれば、互換性のある |
194 |
どんなパディング方法でも使ってください。 |
195 |
|
196 |
カスタムのパディング関数を渡すことも出来ます。こうした場合には、 |
197 |
以下のような引数をとる関数を作成してください: |
198 |
|
199 |
$padded_block = function($block,$blocksize,$direction); |
200 |
|
201 |
$blockがデータの現在のブロック、$blocksizeがそこまでパディングする |
202 |
大きさ、$directionは"e"が暗号化、"d"が復号化を、そして |
203 |
$padded_blockはパディングあるいはパディングをはずした後の結果です。 |
204 |
|
205 |
暗号化のときには、関数は常に長さが<blocksize>である文字列を返し、 |
206 |
復号化のときには、やってくる文字列が常にその長さであることを |
207 |
期待することができます。例についてはソースの中の |
208 |
_standard_padding(), _space_padding(),_null_padding(), あるいは |
209 |
_oneandzeroes_padding() をご覧ください。 |
210 |
|
211 |
spaceとnullパディングは潜在的に、そうであるよりも多くの文字を切り |
212 |
落してしまうかもしれないため、Standardとoneandzeroesパディングが |
213 |
推奨されます。 |
214 |
|
215 |
=head1 使用例 |
216 |
|
217 |
2つの例、des.plとidea.plがCrypt-CBCディストリビューションのeg/ |
218 |
サブディレクトリにあります。これらはコマンドラインのDESとIDEA |
219 |
暗号アルゴリズムを実装しています。 |
220 |
|
221 |
=head1 制約 |
222 |
|
223 |
暗号と復号の処理は同等の(Cでコンパイルされた)SSLeayプログラムよりも |
224 |
10分の1ほどの速度です。これをCで実装することによって改善することが |
225 |
できるでしょう。DESとIDEAブロック・アルゴリズムをさらに最適化する |
226 |
ことも価値のあることでしょう。 |
227 |
|
228 |
=head1 バグ |
229 |
|
230 |
どうか報告してください。 |
231 |
|
232 |
=head1 作者(=AUTHOR) |
233 |
|
234 |
Lincoln Stein, lstein@cshl.org |
235 |
|
236 |
This module is distributed under the ARTISTIC LICENSE using the same |
237 |
terms as Perl itself. |
238 |
|
239 |
=head1 参考資料 |
240 |
|
241 |
perl(1), Crypt::DES(3), Crypt::IDEA(3), rfc2898 (PKCS#5) |
242 |
|
243 |
=head1 翻訳者 |
244 |
|
245 |
川合孝典(GCD00051@nifty.ne.jp) |