繁体   English   中英

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

[英]Matching PHP's mcrypt_encrypt() with node.js crypto.createCipher()

我有一个接收应用程序,期望从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_encrypt的PHP文档说如果忽略IV,它将使用所有空字节,并且mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)回答8。我选择了'hex'因为我认为它提供了与PHP'2 bin2hex()相同的表示形式。

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

我的代码只有四个问题:

  • 输出不必相同。 它只需要解密为相同的明文即可。 鉴于该节点和PHP的填充不同,追逐相同的密码对我来说是愚蠢的。
  • ECB模式不使用IV。 我误导了我的PHP的mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB) ,它报告8而不是说“你是个傻瓜”。
  • 我输错了crypto.createCipheriv() ,它使用给定的密钥。 crypto.createCipher()使用给定密钥的派生(我认为是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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM