2013-08-01 20 views
1

我有希望從PHP製作,看起來像這樣的字符串接收應用程序:匹配PHP的mcrypt_encrypt()與node.js的crypto.createCipher()

<?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代碼的輸出?

回答

2

當時只有四個問題我的代碼:

  • 輸出並不需要是相同的。它只需要解密爲相同的明文。鑑於節點和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));