【早期解決で500ptです】Perlでの質問です。


openssl enc -des-ede-3-cfb -base64 -k "SECRET"

の引数をもとに、 $mailaddress='info@example.com';
を暗号、復号化するソースを教えてください。
ワンライナーではなく、Perl(CGI)で使いたいので、実際の記述方法を教えてください。

ちなみに質問ですが、、"SECRET" は暗号キーですよね?
また、Windows+Apacheでの必要環境も教えてください。
(ppmでのインストールソフトは、opensslのみで大丈夫でしょうか。)

よろしくお願い致します。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2010/05/15 17:42:14
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント600pt
#!/usr/bin/perl

use strict;
use warnings;
use IPC::Open2;

my $message = "info\@example.com";
my $pid = open2(\*RDR, \*WTR, 'openssl enc -des-ede3-cfb -e -base64 -k SECRET');
print WTR $message;
close WTR;
my $result = <RDR>;
close RDR;
print "Result: $result\n";


$pid = open2(\*RDR, \*WTR, 'openssl enc -des-ede3-cfb -d -base64 -k SECRET');
print WTR $result;
close WTR;
my $org_message = <RDR>;
close RDR;
print "Original: $org_message\n";

IPC::Open2 を使って、上記のコードだと openssl の標準入力を WTR 、標準出力を RDR というファイルハンドルでオープンしています。

下記のページを参考にしました。

[を] IPC::Open2 の簡単サンプル

id:furure

さっそくありがとうございました!! 手元の環境にopensslがインストールされていないため、

上記ソースを試せていないのですが、後ほど試させて頂きます。まずは早期解決ということで500pt送らせて頂きます。

付け加えて、質問させて下さい。

opensslを使わずに、上記コードを再現してもらえますでしょうか。

こちらも解決でポイントをつけさせて頂きますので、、

お手数をおかけしますがよろしくお願い致します。。

2010/05/14 20:33:30
  • id:JULY
    回答に書き忘れたのですが、-k で指定した文字列が「暗号キー」というと、ちょっと語弊が有ります。

    ---------------------------------------------------
    -k password
    the password to derive the key from.
    ----------------------------------------------------

    訳すと「鍵を得るためのパスワード」という意味になります。つまり、このパスワードを元に、実際に暗号化処理に使うための鍵を計算し、その計算結果を暗号化/復号化処理に使う、ということになります。

    あと、
    ----------------------
    -des-ede-3-cfb -base64
    ----------------------

    は、正しくは、

    ---------------------
    -des-ede3-cfb -base64
    ---------------------

    です(「ede」と「3」の間にハイフンは入りません)。
  • id:furure
    上記の追加質問について補足させてください。
    再現というか、単純にopensslを使わずに暗号化、復号化をしたいのです。
    openssl enc -des-ede3-cfb -base64 -k "SECRET"
    の引数でいうと、enc~からの部分です。

    こちらの質問がもしお答えできないようでしたら一旦締めてポイントを送らせて頂きます。
    もしご回答いただければあわせてポイントを送らせて頂きたいと思いますので
    今しばらくお時間頂ければ幸いです。。どうぞよろしくお願い致します。
  • id:JULY
    ちょっと難しそうですね。

    Crypt::CFB、Crypt::DES-EDE3、Crypt::DES(Crypt:DES-EDE3 が要求)といった辺りを使うと出来そうなんですが、openssl の -k で渡すパスワードから、実際の暗号化処理に渡す鍵を生成する方法を、何らかの形で実現する必要があります。調べれば、実装は可能だと思いますが、手頃なモジュールやコードは見つけられませんでした。

    CFB モードではなく、CBC モードであれば、Crypt:CBC が使えて、こっちにでは openssl と同様に、パスワードから鍵を生成する事が可能なようです。
  • id:furure
    お調べいただきありがとうございました!
    ちょっと環境上の理由からopensslの導入がもう少し先になりそうで、、と思ったのですが、
    opensslの導入を急ぐことにします。鍵の意味など詳しく解説いただき、
    本当にありがとうございました!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません