gpt4 book ai didi

php - 将 PHP 的 mcrypt_encrypt() 与 node.js crypto.createCipher() 相匹配

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:45 25 4
gpt4 key购买 nike

我有一个接收应用程序,它需要来自 PHP 生成器的字符串,如下所示:

<?php
$shared_secret = 'secret';
$data = 'whatever';

# Newline added for viewing convenience only
echo bin2hex(mcrypt_encrypt(MCRYPT_BLOWFISH, $shared_secret, $data,
MCRYPT_MODE_ECB)) . "\n";

# -> 05c3febb9970204a
?>

更换接收器的成本很高。

我正在使用 node.js 构建另一个生成器,但我无法让我的 JavaScript 代码生成相同的输出:

  var data, encrypt, sharedSecret;

sharedSecret = 'secret';
data = 'whatever';

encrypt = function(d) {
var cipher, crypto;
crypto = require('crypto');
cipher = crypto.createCipher('bf-ecb', sharedSecret, '\0\0\0\0\0\0\0\0');
cipher.update(d);
return cipher.final('hex');
};

console.log(encrypt(data));

// -> 35c9801f2afca332

我选择了'bf-ecb'密码,因为我认为这是 ECB 模式下的河豚。我提供了 8 个空字节作为 IV,因为 mcrypt_crypt 的 PHP 文档表示,如果省略 IV,它将使用所有空字节,并且 mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB) 答案 8。我选择了 'hex' 因为我认为它提供了与 PHP'2 bin2hex() 相同的表示形式。

我应该如何处理我的 JavaScript 代码才能匹配 PHP 代码的输出?

最佳答案

我的代码只有四个问题:

  • 输出不需要完全相同。它只需要解密为相同的明文即可。鉴于 Node 和 PHP pad 不同,追逐相同的密码对我来说是愚蠢的。
  • ECB 模式不使用 IV。我误导了我的 PHP mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB),它报告 8,而不是说“你是个傻瓜”。
  • 我输错了 crypto.createCipheriv(),它使用给定的 key 。 crypto.createCipher() 使用给定 key 的派生(我认为是 md5)。
  • update() 的返回值不得被丢弃。

所以工作解决方案是:

  var data, encrypt, sharedSecret;

sharedSecret = 'secret';
data = 'whatever';

encrypt = function(d) {
var cipher, crypto;
crypto = require('crypto');
cipher = crypto.createCipheriv('bf-ecb', sharedSecret, '');
return cipher.update(d, 'utf8', 'hex') + cipher.final('hex');
};

console.log(encrypt(data));

关于php - 将 PHP 的 mcrypt_encrypt() 与 node.js crypto.createCipher() 相匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17990627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com