2011-12-27 45 views
5

我想下面的base64編碼的密文的Node.js與解碼內置加密庫解密河豚,歐洲央行與加密的NodeJS VS PHP的mcrypt的

2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A== 

這似乎與PHP的mcrypt的工作函數使用字符串typeconfig.sys^_-作爲關鍵字,如通過將值輸入到http://www.tools4noobs.com/online_tools/decrypt/並選擇Blowfish,ECB,Base64解碼所示。

然而,當我運行的Node.js下面的代碼:

var crypto = require('crypto'); 
var data = "2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A=="; 
var decipher = crypto.createDecipher('bf-ecb', 'typeconfig.sys^_-'); 
data = decipher.update(data, "base64", "utf8"); 
data += decipher.final("utf8"); 
console.log(data); 

我得到垃圾輸出:

y 
�:����d�(����Q�i��z1��4�� �k�(� ��a5����u��73c/��(ֻ��)��������fȠ��� 
                   �ec�-<z�8����(�-L���ԛ�I��1L*��u�4�j-�Чh쭊@\P)?޼�.�^���q㊬�U���W&�x��85�T-ג9,dE<g}�`*� 
��|@����k"�!�D'u���,x��7���� 
       ��9q=q�q��ա>�w�T����H3͜�i)R��zy��C�� 
                ��o� 

我也試着庫本身的測試,在它似乎能夠處理的東西它編碼本身罰款:

var crypto = require('crypto') 
var cipher = crypto.createCipher("bf-ecb", "key"); 
var data = cipher.update("foobar", "utf8", "base64"); 
data += cipher.final("base64"); 
console.log(data); 
var decipher = crypto.createDecipher("bf-ecb", "key"); 
data = decipher.update(data, "base64", "utf8"); 
data += decipher.final("utf8"); 
console.log(data); 

生產:

y0rq5pYkiU0= 
foobar 

但複製和粘貼該字符串的base64並輸入成http://www.tools4noobs.com/online_tools/decrypt/旁邊的關鍵「鑰匙」生產垃圾產量也。

這兩個庫不應該產生相同的輸出,還是有什麼我做錯了?

+0

於Node.js和PHP的mcrypt的文檔不清晰,但它看起來像Node.js的使用密鑰導出函數,而採用的mcrypt作爲-是關鍵。由於Node.js實現了PBKDF2,我猜這是它的關鍵推導算法,但我不知道如何指定參數。你應該找出它使用的參數,然後派生一個給定密碼的密鑰,並在PHP端使用該密鑰。 – erickson 2011-12-27 19:44:50

+0

哦,另外,我注意到在工作的Node.js代碼中,您使用'createCipher()'來加密*和*解密,而在原始的非工作代碼中,您正在使用'createDecipher()'。 – erickson 2011-12-27 19:49:24

+0

@erickson是的,'createCipher'兩次是一個錯字,對不起.. 我的問題是,我試圖與另一個需要特定原始密鑰的服務兼容(請參閱示例中的第一個base64編碼字符串),所以你的答案幫助解釋了兩者之間的差異,它實際上並不幫助我解碼和編碼我需要的東西。 – 2011-12-28 06:25:27

回答

5

Node.js在將密鑰用作密鑰之前計算密碼的MD5哈希值。據我所知,mcrypt按原樣使用密鑰。

計算密碼的MD5哈希值,並將其用作mcrypt密鑰。

+4

這似乎足以推動正確的方向。 'createCipher'和'createDecipher'使用密鑰的MD5哈希,而'createCipheriv'和'createDecipheriv'使用原始密鑰和提供的IV。改變代碼使用'crypto.createDecipheriv('bf-ecb','typeconfig.sys^_-','')'現在就可以工作。謝謝! – 2011-12-28 07:01:09

+0

@erickson關於這個問題的任何想法? http://stackoverflow.com/questions/37825261/php-warning-mcrypt-generic-init-iv-size-is-incorrect-supplied-length-12-n – 2016-06-17 14:41:45

2

https://github.com/tugrul/node-mcrypt

var mcrypt = require('mcrypt'); 

var bfEcb = new mcrypt.MCrypt('blowfish', 'ecb'); 

bfEcb.open('typeconfig.sys^_-'); 

var cipherText = new Buffer('2tGiKhSjSQEjoDNukf5BpfvwmdjBtA9kS1EaNPupESqheZ1TCr5ckEdWUvd+e51XWLUzdhBFNOBRrUB5jR64Pjf1VKvQ4dhcDk3Fdu4hyUoBSWfY053Rfd3fqpgZVggoKk4wvmNiCuEMEHxV3rGNKeFzOvP/P3O5gOF7HZYa2dgezizXSgnnD6mCp37OJXqHuAngr0pps/i9819O6FyKgu6t2AzwbWZkP2sXvH3OGRU6oj5DFTgiKGv1GbrM8mIrC7rlRdNgiJ9dyHrOAwqO+SVwzhhTWj1K//PoyyzDKUuqqUQ6AvJl7d1o5sHNzeNgJxhywMT9F10+gnliBxIg8gGSmzBqrgwUNZxltT4uEKz67u9eJi59a0HBBi/2+umzwOCHNA4jl1x0mv0MhYiX/A==', 'base64'); 

console.log(bfEcb.decrypt(cipherText).toString()); 

bfEcb.close();