2012-06-21 16 views
13

मैं पायथन 2.7 का उपयोग कर रहा हूं। मेरे पास एक अल्फान्यूमेरिक स्ट्रिंग है, जिस पर मैं एन्क्रिप्शन/डिक्रिप्शन करना चाहता हूं। जो कुछ भी मैं करता हूं उसे 2-रास्ता रहना चाहिए और नतीजा भी अल्फान्यूमेरिक होना चाहिए।पायथन: दो-तरफा अल्फान्यूमेरिक एन्क्रिप्शन

उदाहरण के लिए

:

str = 'ma6546fbd' 
encrypted_data = encrypt_function(str) 
decrypted_data = decrypt_function(encrypted_data) 
print decrypted_data # I get 'ma6546fbd' 

मैंने क्या किया:

मैं एक समारोह

def xor_crypt_string(data, key): 
    return ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(data, cycle(key))) 

यह डेटा और एक चाबी ले जाता है लिखा है और परिणाम देता है, समस्या यह है कि इसमें विशेष पात्र भी शामिल हैं, जिन्हें मैं टालना चाहता हूं।

+2

क्या आपके पास अपनी खुद की एन्क्रिप्शन का आविष्कार करने का एक अच्छा कारण है? –

+2

वह शायद ही कभी _inventing_ है, यह सिर्फ एक एक्सओआर – mhawke

+0

है मैंने एएसई जैसे कुछ तंत्रों की कोशिश की, लेकिन मुझे उन में विशेष पात्र भी मिलते हैं। जैसा कि मैंने कहा था कि मैं एक अल्फान्यूमेरिक स्ट्रिंग बैक चाहता हूं जिसे उपयोगकर्ता को जेसन ओबीजे के रूप में भेजा जाएगा। और उपरोक्त कोड एक साधारण ज़ोर ऑपरेशन –

उत्तर

33

यदि आप गंभीर एन्क्रिप्शन (अटूट पढ़ने के लिए) चाहते हैं तो मैं AESpycrypto से कुछ इस तरह का उपयोग करूंगा।

>>> from Crypto.Cipher import AES 
>>> from Crypto import Random 
>>> key = b'Sixteen byte key' 
>>> iv = Random.new().read(AES.block_size) 
>>> cipher = AES.new(key, AES.MODE_CFB, iv) 
>>> msg = iv + cipher.encrypt(b'Attack at dawn') 
>>> msg.encode("hex") 
'e10e096aabff9db382abe8d704404995a7b64d72a4e1b9e5208912d206c4' 

अपने ascii संदेश है कि। अब इस

>>> recv='e10e096aabff9db382abe8d704404995a7b64d72a4e1b9e5208912d206c4' 
>>> cipher.decrypt(recv.decode("hex"))[len(iv):] 
'Attack at dawn' 
>>> 

किसी भी एन्क्रिप्शन विधि और एक आप ऊपर दिखाए गए है कि श्रेणी में आता है आप को बनाने के अपने आप को एक विशेषज्ञ के द्वारा आसानी से भंगुर हो जाएगा की तरह संदेश को डिकोड।

+0

है मैंने सोचा कि एक यादृच्छिक कुंजी का उपयोग कर एक्सओआर एन्क्रिप्शन अटूट है। समस्या कुंजी प्रबंधन है। क्या आपको अभी भी एईएस के साथ एक ही समस्या नहीं होगी? – mhawke

+0

+1 कुछ त्वरित पुन: शिक्षा के बाद, मैंने जो कहा वह शायद सच है, लेकिन एक्सओआर एन्क्रिप्शन के साथ महत्वपूर्ण प्रबंधन एईएस के मुकाबले ज्यादा कठिन और मुश्किल है। एक्सओआर ज्ञात सादे टेक्स्ट हमलों के लिए भी कमजोर है। – mhawke

+4

यदि आप केवल एक बार और एक बार कुंजी का उपयोग करते हैं, तो प्रत्येक संदेश के लिए एक अलग कुंजी, आप सही हैं। यह एक बार पैड है। हालांकि एक बार पैड वास्तव में असुविधाजनक हैं क्योंकि आपको संदेश के रूप में अधिक महत्वपूर्ण जानकारी स्टोर करने की आवश्यकता होगी, और इसे प्रेषक और रिसीवर के साथ पहले से सहमत होना चाहिए! एईएस के साथ आप प्रत्येक संदेश के लिए एक ही कुंजी का उपयोग कर सकते हैं और निश्चित (व्यावहारिक उद्देश्यों के लिए) कि कोई भी कुंजी के बिना आपके संदेशों को डिक्रिप्ट कर सकता है। –

2

अल्फान्यूमेरिक आवश्यकता कितनी सख्त है?

आपके मौजूदा एन्क्रिप्शन फ़ंक्शन के परिणामस्वरूप बेस 64 एन्कोडिंग के बारे में कैसे? आप कुछ भटक '=' पैडिंग वर्णों के साथ समाप्त हो सकते हैं, लेकिन आप इन्हें ट्रिम कर सकते हैं और अतिरिक्त पैडिंग की गणना और संभाल सकते हैं।

def xor_crypt_string(plaintext, key): 
    ciphertext = ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(plaintext, cycle(key))) 
    return ciphertext.encode('base64') 

def xor_decrypt_string(ciphertext, key): 
    ciphertext = ciphertext.decode('base64') 
    return ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(ciphertext, cycle(key))) 
+0

या, जैसा कि किसी अन्य उत्तर द्वारा सुझाया गया है, आप बेस 64 के बजाय हेक्स एन्कोडिंग का उपयोग कर सकते हैं। – mhawke

+0

मैंने इसे थक दिया, परिणाम में कई विशेष पात्र हैं। मुझे इस अल्फान्यूमेरिक स्ट्रिंग को उपयोगकर्ता को एन्कोड किए गए जेसन के रूप में भेजना होगा। विशेष वर्ण –

+0

के साथ खेल नहीं सकते हैं फिर .encode ('हेक्स') का उपयोग करें जिसके परिणामस्वरूप स्ट्रिंग्स में 0-9 और ए-एफ शामिल होगा। आपको निक क्रेग-वुड के जवाब पर गंभीरता से विचार करना चाहिए।वाक्यांश के लिए – mhawke

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