初めまして。
復号で嵌っているので、お助けいただけますと嬉しいです。
前提・実現したいこと
使用言語:PHP(7.2.13),JS(Node.js(10.14.1))
実現したいこと:PHPで暗号化した文をJS側で復号したい
発生している問題・エラーメッセージ
修正前
(node:11944) UnhandledPromiseRejectionWarning: Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
修正後
(node:18364) UnhandledPromiseRejectionWarning: Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
該当のソースコード
平文:テスト太郎
修正前
PHP
1 base64_encode(openssl_encrypt($planeText, 'aes-256-ecb', 'testtes'));
Node
1 const crypto = require("crypto"); 2 3 const planeText = 'cEtkTUxJMngwK0VJMWNHa0NWRE1Xdz09';//平文をPHPで暗号化した文字列 4 const buffer = new Buffer(planeText, 'base64'); 5 const ascii = buffer.toString('ascii'); 6 console.log('ascii: '+ ascii); 7 8 const passowrd = 'testtes'; 9 const alg = 'aes-256-ecb' 10 const encoding = 'base64' 11 12 const decipher = crypto.createDecipher(alg, passowrd); 13 let dec = decipher.update(ascii, encoding, 'utf8'); 14 dec += decipher.final('utf8'); 15 16 console.log('decrypted: ' + dec);
修正後
PHP
1 openssl_encrypt($planeText, 'aes-256-ecb', 'testtes', 1);
Node
1 const crypto = require("crypto"); 2 3 const planeText = 'A4A74C2C8DB1D3E108D5C1A40950CC5B';//平文をPHPで暗号化した文字列 4 const buffer = new Buffer(planeText, 'base64'); 5 const ascii = buffer.toString('ascii'); 6 console.log('ascii: '+ ascii); 7 8 const passowrd = 'testtes'; 9 const alg = 'aes-256-ecb' 10 const encoding = 'binary' 11 12 const decipher = crypto.createDecipher(alg, passowrd); 13 let dec = decipher.update(ascii, encoding, 'utf8'); 14 dec += decipher.final('utf8'); 15 16 console.log('decrypted: ' + dec);
試したこと
https://qiita.com/hm0429/items/2acee723170b32b91304
https://qiita.com/mokemokechicken/items/7dfb4d2a9800426ead9d
https://qiita.com/tomi_linka/items/e39e767f77eaca4e82f5
その他もろもろ見ましたが、うまくいきませんでした。
そもそもPHP側で暗号化した場合とJS側で暗号化した際に文字列が言語ごとで異なる理由がわかりません。
(復号方法が違うからなんでしょうが・・・)
また、PHPで暗号化する際に'base64'せずに'binary'にすることができましたが、修正後でもエラーが出ており上手く動きません。
補足情報(FW/ツールのバージョンなど)
暗号化する際に『aes-256-ecb』を使用するのはよくないことは承知しております。
ですが、今回は上記を利用したいと考えております。
何卒宜しくお願い致します。

回答3件
あなたの回答
tips
プレビュー