我想下面的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/旁邊的關鍵「鑰匙」生產垃圾產量也。
這兩個庫不應該產生相同的輸出,還是有什麼我做錯了?
於Node.js和PHP的mcrypt的文檔不清晰,但它看起來像Node.js的使用密鑰導出函數,而採用的mcrypt作爲-是關鍵。由於Node.js實現了PBKDF2,我猜這是它的關鍵推導算法,但我不知道如何指定參數。你應該找出它使用的參數,然後派生一個給定密碼的密鑰,並在PHP端使用該密鑰。 – erickson 2011-12-27 19:44:50
哦,另外,我注意到在工作的Node.js代碼中,您使用'createCipher()'來加密*和*解密,而在原始的非工作代碼中,您正在使用'createDecipher()'。 – erickson 2011-12-27 19:49:24
@erickson是的,'createCipher'兩次是一個錯字,對不起.. 我的問題是,我試圖與另一個需要特定原始密鑰的服務兼容(請參閱示例中的第一個base64編碼字符串),所以你的答案幫助解釋了兩者之間的差異,它實際上並不幫助我解碼和編碼我需要的東西。 – 2011-12-28 06:25:27