人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで質問です。

3DES-CBCで暗号化したものを復号化したいのですが
どうも上手く行きません。
良いサンプルか何かはありませんでしょうか?

PHPでは、CBC/0パディングが設定できないため、ここが問題かなと考えておりますが
厳密には分かりません。。

下記、ソースです。

$code = 'ここに暗号化された物が入る'
$des = 'ここには暗号キーを入れる';

$iv = 'ivを入れる';

$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, $des, $iv);
$dec = mdecrypt_generic($td, $code);

echo $dec;





●質問者: makocan
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● TransFreeBSD
●200ポイント

http://php.net/manual/ja/function.mdecrypt-generic.php
これの例で問題なく動きました。
質問のソースもキーやIVが大きいと警告は出ます(多分切り捨てられてます)が、復号は出来ます。
http://sandbox.onlinephpfunctions.com/code/ca9841dc79d81682b2a2251ecd68dbbba486fbaf

元がテキストならパディング除去はtrimで良いんじゃないでしょうか。
バイナリなら元データの最初にサイズを埋め込んだら良いかと。

ところで暗号コードはテキストなんでしょうか?
mcrypt_genericはバイナリで返しますし、mdecrypt_genericはバイナリで受け入れます。
もし質問ソースの様にテキストで入れているなら、hexとかbase64とかでencodeされたもので、だから失敗しているのではないでしょうか?
#もしくはキーやIVが違うとか……


TransFreeBSDさんのコメント
0パディングはもしかしてIVの事でしょうか? 他の環境でIVが短いと0パディングされるので、phpでも0パディングが必要なら別途str_padで付け足すだけでOKと思います。 >|| $iv = str_pad($iv, 8, "\0") ||<

makocanさんのコメント
色々とありがとうございます。 参考にさせていただきます。

makocanさんのコメント
また、暗号コードはテキストで問題ありません。

TransFreeBSDさんのコメント
mdecrypt_genericの入力はバイナリなのでテキストだと問題ありですよ。

makocanさんのコメント
んっ?暗号コードは、暗号元の情報(例えば、パスワードなど)ではなくでしょうか? もし、格納しているデータであれば、バイナリをbase22hexで16心にしたものです。

TransFreeBSDさんのコメント
「base22hex」がよく分かりませんが、 hexと言うのは16進数表記で"cbc5a27efd"のようなもの、 base64というのは"y8Wifv1IeBIy"のようなものです。 それぞれhex2binやbase64_decodeを使いデコード(バイナリ形式に)します。 それぞれの復号例は下記 http://sandbox.onlinephpfunctions.com/code/7d2652141650474f5ccad93a33bbb18432bcfe3c 暗号化は下記 http://sandbox.onlinephpfunctions.com/code/6d80ad9983c850281c22d22184fff8cb4f9f43ef バイナリをテキスト形式にするとなると上記2つが有名ですが、他にもuuencode(英数字と記号の羅列)やurl encode(%エンコード、%2e%3cなどURLで使われるもの)など色々ありますので、暗号化してる部分でどういう処理をしているか確認してみてください。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ