質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3364閲覧

nodejsで暗号化したAES-128-CBCの復号化をPHPでやりたい

rera

総合スコア109

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/11/15 06:21

javascript

1var secretKey = TWITTER_ID; 2var text = OAUTH_TOKEN_SECRET ; 3 4var hash = crypto.createHash('md5'); 5hash.update(secretKey, 'utf8'); 6var key = hash.digest(); 7 8hash = crypto.createHash('md5'); 9hash.update(secretKey + 'hogehoge'); 10var ive = hash.digest(); 11 12var cipher = crypto.createCipheriv('aes-128-cbc', key, ive); 13var crypted = cipher.update(text, 'utf8', 'hex'); 14crypted += cipher.final('hex');

上記のようにAES-128-CBCで暗号化した文字列を
PHPで復号化するにはどうすればいいのでしょうか?

PHP

1$key = hash("md5", $twitter_id, TRUE); 2 3$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 4$iv = mcrypt_create_iv($size, MCRYPT_RAND); 5 6$hex = bin2hex($encrypted); 7$bin = pack('H*', $hex); 8echo mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $bin, MCRYPT_MODE_CBC, $iv);

としてみましたが解読不明な文字列が表示されてしまいました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

$iv が暗号化時と異なる、乱数列になってますから、復号できてません。
JS 側で ive を作った時と同じことをして、$iv を作ってみては。

投稿2016/11/15 09:26

編集2016/11/15 09:52
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rera

2016/11/15 13:18

回答ありがとうございます。 Node.js(暗号化)に使用したivとkeyをPHP側で直接指定して下記のようやってみましたが エラーが発生してしまいました。 ```PHP <?php $twitter_id = "231127644"; $key = hash("md5", $twitter_id, true); $iv = "d8d5e1al7d695b1b830c88f9638b8cc6"; $encrypted = "262b3e30fc6c602bd364986b4eedd40a57bce9b41fce471aae794dcb4198b227307f512c7fac67e8a1141a80da2aebbc"; $hex = bin2hex($encrypted); $bin = pack('H*', $hex); echo mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $bin, MCRYPT_MODE_CBC, $iv); ``` ``` PHP Warning: mcrypt_decrypt(): Received initialization vector of size 32, but size 16 is required for this encryption mode ```
rera

2016/11/15 13:20

下記のようにやってみましたがエラーが発生してしました。 ```PHP <?php $twitter_id = "1111111"; $key = hash("md5", $twitter_id, true); $iv = "d8d5e1al7d695b1b830c88f9638b8cc7"; $encrypted = "262b3e30fc6c602bd364986b4eedd40a57bce9b41fce471aae794dcb4198b227307f512c7fac67e8a1141a80da2ae342"; $hex = bin2hex($encrypted); $bin = pack('H*', $hex); echo mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $bin, MCRYPT_MODE_CBC, $iv); ``` ``` PHP Warning: mcrypt_decrypt(): Received initialization vector of size 32, but size 16 is required for this encryption mode ```
tacsheaven

2016/11/15 13:31

initialization vector of size 32, but size 16 is required for this encryption mode ですから、$iv として16byte が欲しいのに、32byte 突っ込んでるからです。 $iv を bin2hex し忘れているからでは。
tacsheaven

2016/11/15 13:47

おっと、逆だ。 $iv を hex2bin して 16byte にしなきゃいけない。 あと、$hex も hex2bin しないとおかしいかな。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問