WEB相談室

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

タイトル:PerlでのCBCを用いた暗号化についてご教授願えませんでしょうか

0:[投稿] ろん [2004/03/25 10:48 ][環境:Windows2000、IE6.0 Linux、CGI、Apache1.3.26、Perl5.6.1、Crypt::CBC]

ろんと申します。
皆様からすると基本的なことかもしれませんが、
ぜひ題記の件に関してご教授頂きたく投稿致しました。
暗号化処理のソースを書いたことがないので、恥ずかしながら嵌ってしまっています…。

まず私がどういったことをするために暗号化を行いたいかと言いますと、アンケートフォームでユーザーが登録した内容をエクセルでCVS形式で特定のディレクトリに保存するのですが、保存をする際に暗号化する必要があります。
また、既存のCVSファイルに対して追加書き込みを加える時には、そのCVSファイルを1回複号化して追加してから、再度暗号化をかけて保存する必要があります。

今現在下記の状態ですが、このままだと平文のまま処理です。
#既存のCSVファイル処理の場合
my $csv = "";
for( my $i = 0; $i < scalar(@csv); $i++ ) {
 if( $a_id == $b_id ) {
   $csv = $CSV_DIR . $csv[$i];
###
###ここで既存CSVファイルに対して1度複号化(!?)
###
 }
}
#新規(既存ではない)CSVファイルを処理する場合
unless( $csv ) {
 $csv = $CSV_DIR . sprintf("%04d",$a_id) . ".csv";
}

if( open(CSV,">> $csv") ) {
 flock(CSV,LOCK);
print CSV "$shimei,$seibetsu,$age,$jyusyo,$tel,$mail,>,$goiken\n";
 flock(CSV,LOCK);
 close(CSV);
###
###ここでディレクトリに保管する前に暗号化(!?)
###
}else {
 print "CSVファイルに書き込みが出来ませんでした\n";
}

###で示したところに処理を加えることになると思います。
暗号化・複合化の処理は別のファイルに書いて、このソースの最初でrequireで呼び出そうと考えています。暗号化モジュールを調べたらCrypt::CBCというものがあり、それをマシンに入れました。
暗号化・複合化のためのキーも生成しなくてはならないのかと思いますが、サイトをみても$keyという変数に何か入れていたり、また別のサイトではMD5を使って発生させると書いてあったりで、よく分からず、ピンとこない状態です…(すいません)。
引き続き自分でも調べてみますが、どなたか暗号化に関して分かる方がいらっしゃいましたらご教授願えませんでしょうか?
よろしくお願い致します。


1:[回答] B-Cus [2004/03/25 13:37 ]

Crypt::CBC は暗号化・復号化を簡単に行なうためのフレームワークだと思って
ください。別途、Crypt::Rijndael・Crypt::Twofish・Crypt:DES_EDE3 などの
暗号化・復号化アルゴリズムを実装したモジュールをインストールする必要が
あります。

> このソースの最初でrequireで呼び出そうと考えています。
require でなく use してください。

書き方は
 http://www.ss.iij4u.or.jp/~somali/web/_crypt_cbc.html
 http://perldoc.jp/docs/modules/Crypt-CBC-2.08/CBC.pod
などを参考にしてください。

> 暗号化・複合化のためのキーも生成しなくてはならないのかと思いますが、
> サイトをみても$keyという変数に何か入れていたり、また別のサイトではMD5を
> 使って発生させると書いてあったりで、よく分からず
わからないところがあれば、具体的に URL を提示して質問してください。

Crypt::CBC とは別に perl 標準の crypt というものがありますが、
それと混同しておられるのか、あるいはそうではないのかわからない
ため答えづらいです。


2:[関連] ろん [2004/03/25 16:34 ]

B-Cusさま

返信ありがとうございます。
私の説明不足で大変申し訳ありませんでした。
perl標準のcrypt関数は暗号化するだけで、複合化することが
できませんので、今回は考えておりません。
またDESで暗号化しようと思いますので、別途Crypt::DESを入れました。サイトはB-Cusさまが上記にご提示くださった2つのサイトも見ました。このサイトの場合は、$keyという変数ではなく、newメソッドのハッシュでkeyを指定していますね。すいません。
ただこの場合ですと、暗号化・複号化のためのキーがずっとこれになるということで理解しております。(同じマシン内でCSVファイルに対して暗号化・複号化を繰り返すので、これでもいいといえばいいのですが。)ただできれば、キーをランダムに発生させるにはどうしたらいいのかも知りたいのです。(すいません、MD5に関する記述があったサイトは失念してしまいました。申し訳ありません。)

私の目的を整理しますと、

@新規CSVの場合
openでCSVファイルを開いて、内容を読み込んで変数に格納し、それに対して追加事項を追加し閉じ、再び暗号化して保存。
A既存CSVの場合
openでCSVファイルを開いて、内容を読み込んで変数に格納し、それに対して1度複合化。その複合化されたものに対して、追加を行って閉じ、再び暗号化して保存。

となります。読み込んだ内容に対して行いたいので、上記の書き方だとちょっと違いますね。
(1度ファイルを開いて内容を変数に格納してから行う必要がありますね…。以下のようになる可能性が高いですね。)

<新規CSV>
if(open(CSV,">>$csvfile")){
      undef $/;
      my $text = <CSV>;
      print "$text\n"."$shimei……<略>……\n";
###暗号化処理!! → 引数に$textつける########
      close(CSV);
}else{
  print   "CSVファイルに書き込みが出来ませんでした\n";
}

<既存CSV>
if(open(CSV,">>$csvfile")){
      undef $/;
      my $text = <CSV>;
###複号化処理!! → 引数に$textつける########
      print "$text\n"."$shimei……<略>……\n";
###暗号化処理!! → 引数に$textつける########
      close(CSV);
}else{
  print   "CSVファイルに書き込みが出来ませんでした\n";
}

今まで暗号化のソースを書いたことがないため、ファイルの読み込みのタイミングや暗号化自体の書き方が良く分からず困っています。B-Cusさま、あるいは、暗号化に関してご存知の方がいましたらご教授願えませんでしょうか?
よろしくお願い致します。


3:[回答] B-Cus [2004/03/25 17:37 ]

> 今まで暗号化のソースを書いたことがないため、ファイルの読み込みの
> タイミングや暗号化自体の書き方が良く分からず困っています。
というか、暗号化云々以前の問題として、プログラミング経験がほとんど
ないのではないかとお見受けします。

まずは暗号化・復号化を一切行なわず、平文で保存するプログラムを
書いてみて、その後暗号化・復号化処理を追加してはどうでしょうかね。


以下、気になる点。

> キーをランダムに発生させるにはどうしたらいいのかも知りたいのです。
キーをランダムに発生させて暗号化するならば、そのキーをどこかに
記録しておかないと復号化できませんが、それでいいのですか?

キーをランダムにする、ということは Crypt::CBC->new の key に渡す
文字列をランダムにする、ということです。つまり、
 「perl でランダムな文字列を生成するにはどうしたらよいか」
を調べればよい、というのは理解しておられますか?

> @新規CSVの場合
> openでCSVファイルを開いて、内容を読み込んで変数に格納し、
新規 CSV (ファイルが存在しない?) なのに、内容を読み込む必要が
あるのですか?

> if(open(CSV,">>$csvfile")){
>     undef $/;
>     my $text = <CSV>;
ファイルを >> でオープンしたら追加書き込みモードなわけで、
<CSV> でファイル内容を取得することはできません。

読み込みと書き込みに分けて、それぞれの箇所で open することを
お勧めします。

> 暗号化自体の書き方が良く分からず
http://www.ss.iij4u.or.jp/~somali/web/_crypt_cbc.html を読みましたか?

 my $plaintext = "$text\n"."$shimei……<略>……\n";
 my $ciphertext = $cipher->encrypt($plaintext);
 print CSV $ciphertext;


あとどうでもいいですが、「複合」ではなく「復号」です。


4:[関連] ろん [2004/03/25 21:41 ]

B-Cusさま

再度のご返答ありがとうございます。
>というか、暗号化云々以前の問題として、プログラミング経験が
>ほとんど ないのではないかとお見受けします。
そうなんです。まだプログラムを初めて間もないです…。
見事にばれて恥ずかしい限りです…。
元々平文でCSVファイルを処理する内容は他の方が書いて下さったのがあるのですが、修正としてそこに暗号化の処理を加えなくてはなりません。
またキーをランダムにとるのは、今の状態で考えると更に分からなくなるので、単一キーで行うようにします。

<<提示して下さった「気になる点」に関して>>
> @新規CSVの場合
> openでCSVファイルを開いて、内容を読み込んで変数に格納し、
新規 CSV (ファイルが存在しない?) なのに、内容を読み込む必要が あるのですか?
ないですね…(恥) 直接書いてしまえば良いんですよね。
「>>」ではなくて、「>」で指定すればいいと考えられますね。

>ファイルを >> でオープンしたら追加書き込みモードなわけで、
><CSV> でファイル内容を取得することはできません。
>読み込みと書き込みに分けて、それぞれの箇所で open することをお勧めします。
これなんですが、具体的にどういったことなのでしょうか?
大変申し訳ないのですが、イメージが湧きません。
ご教授願えませんでしょうか?

また、ご提示下さったように、
>my $plaintext = "$text\n"."$shimei……<略>……\n";
>my $ciphertext = $cipher->encrypt($plaintext);
>print CSV $ciphertext;
とありますが、これは暗号化するサブルーチンに引数として$text、$shimeiなどを引数として連れて行き、そこで追加処理までするということでしょうか?
すいません、経験がないのでイメージが湧きづらいのです…。

度々すいませんが、お聞かせ願えませんでしょうか?
よろしくお願い致します。


5:[回答] Iwa [URL] [2004/04/06 18:15 ]

>> ファイルを >> でオープンしたら追加書き込みモードなわけで、
> これなんですが、具体的にどういったことなのでしょうか?

そのまんまの意味です。
要するに >> を使うとファイルの最後の(終わりの部分)から書き始めるということです。
で、"追加で書く専用"なので読むことはできないということです。
ファイルがない(新規)または0バイトのファイルなら最後=最初になります。

>> my $plaintext = "$text\n"."$shimei……<略>……\n";
> とありますが、これは暗号化するサブルーチンに引数として$text、$shimeiなどを引数として連れて行き、そこで追加処理までするということでしょうか?

これは$plaintextに暗号化前の平分を用意しているだけです。
ここでは「$text + 改行 + $shimei + <略> + 改行」と繋げたものを$plaintextとしています。

全て一行で書くと
print CSV $cipher->encrypt("$text\n"."$shimei……<略>……\n");
とすることもできますが、初心者の場合は混乱する可能性があるので慣れるまではB-Cusさんのように順番に書かれることをお勧めします。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World