2011-02-09 32 views
7

का उपयोग जो मुझे पता है, सीटीआर मोड प्रारंभिक वेक्टर का उपयोग नहीं करता है। यह सिर्फ एक काउंटर लेता है, इसे एक दी गई कुंजी के साथ एन्क्रिप्ट करता है और फिर XOR का परिणाम साइडटेक्स्ट प्राप्त करने के लिए सादे टेक्स्ट के साथ होता है।सीटीआर मोड प्रारंभिक वेक्टर (IV)

एन्क्रिप्शन करने से पहले सीबीसी जैसे अन्य ब्लॉक सिफर मोड वे प्रारंभिक वेक्टर के साथ सादे टेक्स्ट को एक्सओआर करते हैं।

तो मेरी समस्या यहां है। मैं जावा में निम्नलिखित कोड (bouncycastle लाइब्रेरी का उपयोग) है:

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC"); 

cipher.init(Cipher.ENCRYPT_MODE, key); 

byte[] result = cipher.doFinal("Some plaintext"); 

एक ही कुंजी के साथ उपरोक्त कोड का हर अलग-अलग कॉल विभिन्न उत्पादन देता है! लेकिन जब:

byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC"); 

cipher.init(Cipher.ENCRYPT_MODE, key, IV); 

byte[] result = cipher.doFinal("Some plaintext"); 

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

कोई भी विचार बहुत उपयोगी होगा। धन्यवाद

+2

[यदि आप अपने कोड में अक्षर एईएस टाइप कर रहे हैं, तो आप इसे गलत कर रहे हैं।] (Http://chargen.matasano.com/chargen/2009/7/22/if-youre-typing-the -लेटर-एएस-इन-कोड-आप-कर रहे हैं.html) –

+0

क्रिप्टो * वास्तव में आसान * पेंच करने के लिए है। और उन तरीकों से पेंच जो पूरी तरह से अदृश्य हैं जब तक कि कोई उनका शोषण न करे। बजाय एक हार्ड-टू-स्क्रू-अप इंटरफ़ेस के साथ एक स्थापित लाइब्रेरी का उपयोग करें। –

+2

@ एनॉन। मैं अपना खुद का चतुर्थ भी चुनता हूं, कृपया आओ और मुझे मार दो। (संकेत: कुछ लोग जानते हैं कि वे क्या कर रहे हैं, आपके कोड में एईएस टाइप न करने की यह सामान्य सलाह बेवकूफ है।) – Luc

उत्तर

5

सबसे महत्वपूर्ण सीटीआर मोड के साथ चेतावनी है कि आप कभी नहीं, कभी फिर से उपयोग करने के लिए एक ही कुंजी के साथ एक ही काउंटर मूल्य। यदि आप ऐसा करते हैं, तो आपने प्रभावी ढंग से अपना सादा पाठ दिया है।

इसके साथ सहायता करने के लिए, सीटीआर मोड के कुछ वास्तविक विश्व कार्यान्वयन में ब्लॉक सिफर को पारित करने के लिए ब्लॉक को दो हिस्सों में विभाजित किया गया है, जिसे एक चतुर्थ और काउंटर के रूप में लेबल किया गया है (पूरी चीज को काउंटर के बजाय)। चतुर्थ यादृच्छिक रूप से उत्पन्न होता है, और काउंटर 0

इससे आपको कई संदेशों के लिए शून्य पर "काउंटर" भाग शुरू करने देता है, जब तक आप "IV" भाग का पुन: उपयोग नहीं करते।

ध्यान दें कि यह सिर्फ एक लेबलिंग सम्मेलन है। गणितीय रूप से, यह पूरी चीज को "काउंटर" कहने जैसा ही है, और प्रत्येक संदेश के लिए कुछ पूर्णांक के यादृच्छिक एकाधिक पर काउंटर शुरू करना।

मुझे यकीन नहीं है कि बाउंसी कैसल कार्यान्वयन विशेष रूप से कैसे काम कर रहा है - यह शायद आपको IV मान के साथ पूरे प्रारंभिक ब्लॉक, काउंटर और सभी को सेट करने दे रहा है। यह स्पष्ट रूप से आपके लिए एक समझदार IV उत्पन्न कर रहा है यदि आप एक आपूर्ति नहीं करते हैं, यही कारण है कि आप एक ही इनपुट के साथ अलग आउटपुट प्राप्त कर रहे हैं। निचली पंक्ति यह है कि यह अच्छा है, और वास्तव में आप जो चाहते हैं - सभी शून्यों की आपूर्ति खराब है, और जो भी आप चाहते हैं।

+0

धन्यवाद :) अब मुझे मिल गया – Antonys

0

सीटीआर मोड अनिवार्य रूप से एक चतुर्थ के बराबर है, और यह काउंटर का प्रारंभिक मूल्य है।

2

सीटीआर काउंटर के लगातार मूल्यों को एन्क्रिप्ट करके काम करता है। उस अनुक्रम के लिए पहला मान एक IV (IV का अर्थ है "प्रारंभिक मान" ...)। तो सीटीआर वास्तव में एक चतुर्थ का उपयोग करता है।

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

एक "आसान" जिस तरह से काउंटर पुनरावृत्ति से बचने की (लगता है कि "java.security.SecureRandom") अर्थात् सभी 16-बाइट दृश्यों संभव चतुर्थ के सेट, के बीच हमेशा एक क्रिप्टोग्राफी द्वारा सुरक्षित यादृच्छिक संख्या जनरेटर के साथ चतुर्थ चयन करने के लिए है। वह जगह पर्याप्त रूप से बड़ी है कि किसी बिंदु पर काउंटर वैल्यू का पुन: उपयोग करने का आपका जोखिम उपेक्षित किया जा सकता है।

बस पूरा होने के लिए, एक निश्चित चतुर्थ सहनशील है यदि आप सुनिश्चित करते हैं कि आप केवल एक बार एक दी गई कुंजी का उपयोग करते हैं। जब आप एक ही कुंजी के साथ समान काउंटर वैल्यू का पुन: उपयोग करते हैं तो सुरक्षा समस्याएं उत्पन्न होती हैं। हालांकि, प्रत्येक संदेश के लिए एक नई कुंजी होने के कारण कम से कम प्रत्येक संदेश के लिए एक नया चौथाई होना मुश्किल है।