WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:Crypt::CBC について教えてください

0:[投稿] かとう [2005/08/21 18:03 ][環境:Mac Safari Linux Red Hat 8]

Crypt::CBC をPERL にて利用しています。

「cgi01.cgi」内部でDES 暗号文字列を作成し、Location ヘッダでDES 暗号文字列を「cgi02.cgi」に渡します。その後、「cgi02.cgi」でDES 暗号文字列を複合化します。

上記について、「cgi01.cgi」をブラウザでよんでみると、「cgi02.cgi」が起動されるのですが、DES 暗号文字列がうまく複合化できていません。

なお、「cgi01.cgi」も「cgi02.cgi」も独自のプログラムであり、その内容は非常に簡単で、下記の通りです。

----- 「cgi01.cgi」の内容

use Crypt::CBC;

$CBC = Crypt::CBC->new( {
       'key' => 'secret keys', 'cipher' => 'DES', 'regenerate_key' => 1,
       'padding' => 'standard', 'iv' => '$KJh#(}q', 'prepend_iv' => 1
} );

# 暗号化する
$PlainText  = "これは暗号文字列";
$CipherText = $CBC->encrypt( $PlainText );
$CipherText = $CBC->encrypt_hex( $CipherText );
print STDERR "暗号化文字列 = $CipherText\n";

print "Location: /cgi02.cgi?k=$CipherText\n\n";
exit;

----- 「cgi02.cgi」の内容

use Crypt::CBC;

$CBC = Crypt::CBC->new( {
       'key' => 'secret keys', 'cipher' => 'DES', 'regenerate_key' => 1,
       'padding' => 'standard', 'iv' => '$KJh#(}q', 'prepend_iv' => 1
} );

# $Form{'k'} はURL デコードされた文字が入る
$CipherText = $CBC->decrypt_hex( $Form{'k'} );
$PlainText = $CBC->decrypt( $CipherText );
print STDERR "複合化文字列 = $PlainText\n";

上記ソースで $PlainText にはめちゃくちゃな読めない文字が入ってくるのです。この問題、わかる方がいたら教えてください。


1:[回答] miz [2005/08/21 21:24 ]

>print "Location: /cgi02.cgi?k=$CipherText\n\n";
暗号化はしたけど、URLencodingしてないように思います。


2:[回答] かとう [2005/08/22 07:59 ]

miz さん、ご回答ありがとうございます。

確かに Location ヘッダに暗号化文字列を渡す際に、URL エンコードしていませんが、暗号化文字列自体ASCII ですので、URL エンコードが必要ないと思い、行いませんでした。念のため、「cgi01.cgi」で、下記のように文末でURL エンコード行ってみても、結果は同様でした。私のやり方が間違っているのでしょうか?

$URLString = $CipherText;
$URLString =〜 s/(\W)/'%'.unpack('H2', $1)/eg;

print "Location: /websrv/web-ftp/login/index.cgi?k=$URLString\n\n";
exit;

お願いします。


3:[回答] かとう [2005/08/22 08:14 ]

かとうです。

いろいろと調査しているのですが、「cgi01.cgi」で暗号化した際の文字列$CipherText と、「cgi02.cgi」でURL デコードした後の文字列$Form{'k'} をプリントディバックしてみたところ、またく同じASCII 文字でした。おそらくURL デコード、エンコードの処理は問題ないと思っていますが、どうでしょうか?そして、同じ暗号化文字列が「cgi02.cgi」にわたってきているのみ、「cgi02.cgi」で複合化が失敗するということはどういうことなのでしょうか?


4:[完了] かとう [2005/08/22 10:09 ]

かとうです。
この件ですが、なんとか解決しました。

$CBC = Crypt::CBC->new( {
      'key' => 'secret keys', 'cipher' => 'DES', 'regenerate_key' => 1,
      'padding' => 'standard', 'iv' => '$KJh#(}q', 'prepend_iv' => 1
} );

上記の書き方がまずかったらしいです。

$CBC = Crypt::CBC->new( "secret keys", "Crypt::DES" );

上記のように簡略化して記載したらすべてがうまく動作してくれました。しかし、マニュアル通りの書き方をしたつもりですが、何が違っていたのでしょうか?

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World