2011-12-27 21 views
5

मैं साथ Node.js में निम्नलिखित base64 एनकोडेड सिफर डिकोड करने के लिए कोशिश कर रहा हूँ में निर्मित क्रिप्टो पुस्तकालयडिक्रिप्ट ब्लोफिश-ईसीबी बनाम php के mcrypt

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

यह PHP के mcrypt के साथ काम करने लगता है http://www.tools4noobs.com/online_tools/decrypt/ में मान इनपुट करके और ब्लोफिश, ईसीबी, बेस 64 डीकोड का चयन करके दिखाए गए अनुसार typeconfig.sys^_- स्ट्रिंग का उपयोग करके फ़ंक्शंस।

हालांकि, जब मैं 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); 

पैदा करता है: यह सामान को संभालने के लिए यह अपने आप ठीक encodes में सक्षम हो रहा है

y0rq5pYkiU0= 
foobar 

लेकिन कॉपी और चिपकाने कि base64 स्ट्रिंग और http://www.tools4noobs.com/online_tools/decrypt/ कुंजी "कुंजी" के साथ में inputting भी कचरा उत्पादन पैदा करता है।

क्या इन दोनों पुस्तकालयों का उत्पादन समान उत्पादन नहीं होना चाहिए, या क्या मैंने कुछ गलत किया है?

+0

Node.js और PHP के mcrypt के लिए दस्तावेज़ स्पष्ट नहीं हैं, लेकिन जब mcrypt कुंजी के रूप में-है का उपयोग करता है यह, Node.js की तरह एक कुंजी व्युत्पत्ति फ़ंक्शन का उपयोग करता लग रहा है। चूंकि Node.js PBKDF2 लागू करता है, मुझे लगता है कि यह इसकी मुख्य व्युत्पन्न एल्गोरिदम है, लेकिन मुझे नहीं लगता कि पैरामीटर निर्दिष्ट करने के लिए कैसे। आपको इसका उपयोग करने वाले पैरामीटर को समझना चाहिए, फिर अपना पासवर्ड दिया गया कुंजी प्राप्त करें, और उस पक्ष का उपयोग PHP पक्ष पर करें। – erickson

+0

ओह, मैं, काम करने वाले नोड.जेएस कोड में नोटिस करता हूं, आप एन्क्रिप्टिंग * और * डिक्रिप्टिंग के लिए 'createCipher() 'का उपयोग करते हैं, जबकि आपके मूल, काम नहीं कर रहे कोड में, आप' createDecipher()' का उपयोग कर रहे हैं। – erickson

+0

@ एरिक्सन हां, 'createCipher' दो बार एक टाइपो था, क्षमा करें .. मेरी समस्या यह है कि मैं एक और सेवा के साथ संगत होने की कोशिश कर रहा हूं जिसके लिए उस विशिष्ट कच्ची कुंजी की आवश्यकता है (उदाहरण के लिए पहली बेस 64 एन्कोडेड स्ट्रिंग देखें) इसलिए आपका उत्तर सहायता दोनों के बीच के अंतर को बताती है, यह वास्तव में मुझे जो चाहिए उसे डीकोड और एन्कोड करने में मदद नहीं करता है। –

उत्तर

5

Node.js कुंजी के रूप में उपयोग करने से पहले पासवर्ड के MD5 हैश की गणना करता है। जहां तक ​​मैं कह सकता हूं, mcrypt कुंजी का उपयोग करता है।

पासवर्ड के MD5 हैश की गणना करें, और इसे मैक्रिप्ट कुंजी के रूप में उपयोग करें।

+4

ऐसा लगता है कि सही दिशा में पर्याप्त धक्का था। 'createCipher' और' createDecipher 'कुंजी के MD5 हैश का उपयोग करते हैं, जबकि' createCipheriv' और 'createDecipheriv' कच्ची कुंजी और प्रदान की गई IV का उपयोग करते हैं। 'Crypto.createDecipheriv (' bf-ecb ',' typeconfig.sys^_- ',' '') का उपयोग करने के लिए कोड को बदलना अब इसे काम करता है। धन्यवाद! –

+0

@erickson इस सवाल के बारे में कोई विचार? http://stackoverflow.com/questions/37825261/php-warning-mcrypt-generic-init-iv-size-is-incorrect-supplied-length-12-n –

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