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;



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

回答1件)

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

ポイント200pt

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が違うとか……

他4件のコメントを見る
id:makocan

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

2014/10/03 19:03:53
id: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で使われるもの)など色々ありますので、暗号化してる部分でどういう処理をしているか確認してみてください。

2014/10/04 00:29:26

コメントはまだありません

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

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

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

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