2016-10-22 11 views
6

मैं संदेश के साथ एक फ़ाइल (part444.txt) डिक्रिप्ट करने के लिए कोशिश कर रहा हूँ:AES128-सीबीसी "बुरा जादुई संख्या" और "त्रुटि पढ़ने इनपुट फ़ाइल"

y2EdLtmNQsZkvwwf8jf3fM6c1thfzF0sQfblayGIBik= 

यह base64 है सीबीसी में नीचे पाठ 128 बिट एईएस एन्क्रिप्टेड एन्कोडेड मोड। यह गद्देदार नहीं है। चतुर्थ एन्क्रिप्टेड पाठ का पहला 16 बाइट है और कुंजी h4ckth1sk3yp4d16 है।

मुझे पता है कि लोगों को बेस 64 के साथ समस्याओं से खराब जादू संख्या त्रुटि मिली है, लेकिन अब मुझे "इनपुट फ़ाइल पढ़ने में त्रुटि" मिलती है और यह सुनिश्चित नहीं है कि यहां से कहां जाना है।

मैं कोशिश की है:

openssl enc -base64 -d part444.txt | openssl aes-128-cbc -d -k h4ckth1sk3yp4d16 

मैं त्रुटियों क्यों सामना कर रहा हूँ "बुरा जादुई संख्या" और "त्रुटि इनपुट फ़ाइल पढ़ने"?

उत्तर

6

यह openssl के साथ दर्द का एक प्रकार है, क्योंकि openssl की एन्क्रिप्शन पैडिंग के बारे में धारणा करता है और दर्ज पासवर्ड से नमकीन कुंजी प्राप्त करता है जिसे आपको जानबूझ कर बंद करना पड़ता है।

PyCrypto कहने के साथ पाइथन में करना बहुत आसान है, जहां ये धारणाएं नहीं बनाई गई हैं।

>>> import base64 
>>> data = base64.b64decode('y2EdLtmNQsZkvwwf8jf3fM6c1thfzF0sQfblayGIBik=') 
>>> from Crypto.Cipher import AES 
>>> aes_crypter = AES.new('h4ckth1sk3yp4d16', AES.MODE_CBC, data[:16]) 
>>> aes_crypter.decrypt(data[16:]) # this gives the encrypted secret. 

यह openssl के साथ ऐसा करना संभव है, लेकिन आप बेस 64 एन्कोडेड डेटा को पढ़ने के लिए - पहले 16 बाइट्स बाहर ले जाना और अपने $IV के रूप में यह याद (इसे वापस एन्कोडिंग हेक्स के लिए के बाद कि openssl उम्मीद) , पहले 16 के बाद सभी बाइट्स को पढ़ना शुरू करें और इसे $CIPHERTEXT के रूप में याद रखें (और बेस 64 में पुनः-एन्कोड करें)। $KEY के समान, आपको इसे ASCII से हेक्स में बाइट्स में परिवर्तित करना होगा। आप चर में इन संग्रहीत मान लें, तो निम्नलिखित काम करेगा:

IV=`base64 -d part444.txt | xxd -p -l 16` 
CIPHERTEXT=`base64 -d part444.txt | cut -b 17- | base64` 
KEY=`echo -n h4ckth1sk3yp4d16 |xxd -p` 

echo $CIPHERTEXT | openssl aes-128-cbc -d -a -nopad -K $KEY -iv $IV && echo "" 

नोट base64 -d बाइनरी बेस 64 डीकोड (GNU coreutils से उपयोग करते हुए बेस 64; BSD पर base64 -D के साथ बदलें), base64 b64 बाइनरी डेटा encodes, cut -b 17- से पढ़ता फ़ाइल के अंत तक डेटा के 17 वें बाइट, और xxd -p बाइनरी से हेक्स में परिवर्तित हो जाता है।

+0

शैल स्क्रिप्ट में ऐसा करने के लिए बहुत कुछ है। 'कट-बी 16-' शायद सिफरटेक्स्ट को अलग करने में मदद करेगा। – jww

+1

@jww - हाँ यह कमांड लाइन में करने के लिए थोड़ा परेशान है (एक-एक-एक त्रुटियों के कारणों के लिए; उदाहरण के लिए, 'कट-बी 17 -'' होना चाहिए, लेकिन निश्चित रूप से करने योग्य। –

+0

@jimbob - वास्तव में, धन्यवाद! – jww

संबंधित मुद्दे