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