0

次のような暗号文を生成する PHP コードがあります。

<?php
$data = '12345678123456781234567812345678123456781234567812345678123456781234567812345678';

$ciphertext = mcrypt_encrypt('rijndael-128', 'M02cnQ51Ji97vwT4', $data, 'ecb');

echo base64_encode($ciphertext);
?>

プロデュース:

6tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Tq0nruhoXVfXZf8UThqEt06tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Q=

ECB がこの種のデータに使用するのに最適なモードではないことはわかっていますが、暗号化するのは私ではありません。

私が抱えている問題は、これを復号化しようとしている node-crypto にあります。私のノードスクリプトは次のとおりです。

var crypto = require("crypto");    

var data = "6tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Tq0nruhoXVfXZf8UThqEt06tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Q=";

var out = '';

var decipher = crypto.createDecipher("aes-256-ecb", "M02cnQ51Ji97vwT4");

decipher.setAutoPadding(false); //this needs to be set otherwise i get an error:06065064:bad decrypt

out += decipher.update(data, "base64", "ascii");

out += decipher.final("ascii");

console.log(out);

プロデュース:

"3i<1pzV7A

      vnE"3i<1pzV7A

                   vnE"3i<1pzV7A

                                vnE"3i<1pzV7A

                                             vnE"3i<1pzV7A

                                                          vnE

元のデータの繰り返しパターンは復元されましたが、正しくありません。「rijndael-128」に相当するものをopensslで見つけるのに苦労しました.「aes-256-ecb」である必要があり、ECBであるためIVは必要ありません。これら 2 つのライブラリを連携させるにはどうすればよいですか?

ありがとう、J

4

2 に答える 2

1

これを試して:

var crypto = require("crypto");    
var data = "6tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Tq0nruhoXVfXZf8UThqEt06tJ67oaF1X12X/FE4ahLdOrSeu6GhdV9dl/xROGoS3Q=";

var out = '';

var decipher = crypto.createDecipheriv("aes-256-ecb", "M02cnQ51Ji97vwT4", '');
out += decipher.update(data, "base64");
out += decipher.final();

console.log(out);

createDecipher(...) を createDecipheriv (最後にivに注意) に変更し、空の 3 番目のパラメーター (いわゆる初期化ベクトル) を使用すると、私の場合はうまくいきます。この場合、setAutoPadding(false) を削除します。

于 2013-11-05T11:16:43.643 に答える