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

我有一个接收应用程序,期望从PHP生产者的string,看起来像这样:

<?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 ?> 

接收器的改变是昂贵的。

我正在build设使用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 

我select了'bf-ecb'密码,因为我认为这是ECB模式下的blowfish。 我提供了8个空字节作为IV,因为mcrypt_encrypt的PHP文档说如果你省略了IV,它将使用所有的空字节,而mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)答案为8.我select'hex'是因为我认为它提供了与PHP'2 bin2hex()相同的表示forms。

我应该怎样做我的JavaScript代码来匹配PHP代码的输出?

我的代码只有四个问题:

  • 输出不需要相同。 它只需要解密到相同的明文。 鉴于节点和PHP填充不同,追逐相同的密码是愚蠢的我。
  • ECB模式不使用IV。 我误导了我的PHP的mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB) ,它报告8而不是说“你是个傻瓜”。
  • crypto.createCipheriv() ,它使用给定的密钥。 crypto.createCipher()使用给定键(md5,我认为)的派生。
  • update()的返回值不能被丢弃。

所以工作的解决scheme是:

  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));