1

次のような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 モードのフグだと思うからです。mcrypt_encrypt の PHP ドキュメントには、IV を省略するとすべての null バイトが使用され、mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)8 と回答されると記載されているため、IV として 8 つの null バイトを指定しました。選択'hex'したのは、PHP'2 と同じ表現を提供すると思うためですbin2hex()

PHP コードの出力と一致させるには、JavaScript コードをどうすればよいですか?

4

1 に答える 1

2

私のコードには 4 つの問題しかありませんでした。

  • 出力は同一である必要はありません。同じ平文に解読する必要があるだけです。そのノードと PHP パッドが異なることを考えると、同じ暗号を追跡するのはばかげていました。
  • ECB モードは IV を使用しません。mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB)「あなたはばかだ」と言うのではなく、8を報告するPHPを誤解させました。
  • 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));
于 2013-08-01T11:44:37.613 に答える