2011-02-13 17 views
8

से डीईएस कुंजी बनाएं मेरे पास 56 बिट बाइनरी स्ट्रिंग है जिसे मैं डीईएस एन्क्रिप्शन के लिए गुप्त कुंजी के रूप में उपयोग करना चाहता हूं।56 बिट बाइनरी स्ट्रिंग

मैं JCA डॉक्स वेबसाइट

byte[] desKeyData = { (byte)0x01, (byte)0x02, (byte)0x03, 
(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07, (byte)0x08 }; 
DESKeySpec desKeySpec = new DESKeySpec(desKeyData); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
SecretKey secretKey = keyFactory.generateSecret(desKeySpec); 

हालांकि इस कुंजी (7 के बजाय) के लिए 8 बाइट्स का उपयोग करता है पर निम्न कोड मिला। यह स्पष्ट नहीं है कि deskeyData [0] कम से कम महत्वपूर्ण बाइट या सबसे महत्वपूर्ण एक से मेल खाता है। साथ ही, क्या बाइट सरणी उत्पन्न करने के लिए सीधे 56 बिट स्ट्रिंग का उपयोग करना संभव है जिसका उपयोग इस उद्देश्य के लिए किया जा सकता है?

+1

एक 8-बाइट इनपुट सामान्यतः इसका मतलब है कि यह प्रत्येक बाइट के 7 कम से कम महत्वपूर्ण बिट्स का उपयोग कर रहा है। –

+0

और कौन सा बाइट सबसे महत्वपूर्ण है? 0 वें या 7 वां? – AnkurVj

+1

सबसे महत्वपूर्ण बात यह है कि दुनिया में क्यों हम अभी भी 2011 में डीईएस का उपयोग कर रहे हैं? ("पिछड़ा संगतता" का जवाब देने वाला पहला "आपको नहीं मिला-मेरा-पॉइंट-किया-आप?" बैज अर्जित करेगा – CAFxX

उत्तर

7

Wikipedia से:

कुंजी जाहिरा तौर पर 64 बिट्स के होते हैं; हालांकि, इनमें से केवल 56 वास्तव में एल्गोरिदम द्वारा उपयोग किए जाते हैं। समानता की जांच के लिए आठ बिट्स का उपयोग पूरी तरह से किया जाता है, और उसके बाद त्याग दिया जाता है। इसलिए प्रभावी कुंजी लंबाई 56 बिट्स है, और इसे कभी भी उद्धृत नहीं किया जाता है। चयनित कुंजी के प्रत्येक 8 वें बिट को त्याग दिया जाता है, यानी स्थिति 8, 16, 24, 32, 40, 48, 56, 64 को 64 बिट कुंजी से हटाकर 56 बिट कुंजी के पीछे छोड़ दिया जाता है।

तो, कम से कम महत्वपूर्ण बिट (अर्थात 0 बिट्स) कुंजी निर्माण के लिए इस्तेमाल नहीं कर रहे हैं, वे DESKeySpec.isParityAdjusted() द्वारा समता की जाँच के लिए इस्तेमाल किया जा सकता।

संपादित करें: सरल दिखा रहा है कि कम से कम महत्वपूर्ण बिट अनदेखी कर रहे हैं परीक्षण:

SecretKeyFactory sf = SecretKeyFactory.getInstance("DES"); 
byte[] in = "test".getBytes("UTF-8"); 

Cipher c1 = Cipher.getInstance("DES"); 
c1.init(Cipher.ENCRYPT_MODE, sf.generateSecret(new DESKeySpec(
    new byte[] {0x10,0x20,0x30,0x40,0x50,0x60,0x70,(byte) 0x80}))); 
byte[] r1 = c1.doFinal(in); 

Cipher c2 = Cipher.getInstance("DES"); 
c2.init(Cipher.ENCRYPT_MODE, sf.generateSecret(new DESKeySpec(
    new byte[] {0x11,0x21,0x31,0x41,0x51,0x61,0x71,(byte) 0x81}))); 
byte[] r2 = c2.doFinal(in); 

assertArrayEquals(r1, r2); 
+0

बिट पोजिशन 8,16 इत्यादि .. क्या इसका मतलब यह नहीं है कि प्रत्येक बाइट की सबसे महत्वपूर्ण बिट्स कम से कम महत्वपूर्ण बिट्स के बजाय? – AnkurVj

+0

एक से शुरू होने पर, समानता बिट्स प्रत्येक बाइट का सबसे महत्वपूर्ण है। – vz0

2

एक महत्वपूर्ण बिट एक है कि एक one या two's complement संख्या का संकेत बदलता है। सबसे कम या कम से कम महत्वपूर्ण बिट का विचार बाइट्स पर लागू नहीं किया जा सकता है।

एक्स्टावेट उत्तर के अनुसार, अनुक्रम के सभी 64 बिट्स से केवल श्रेणियों में बिट्स: (1..7), (9..15), (17..23), (25..31), (33..39), (41..47), (49..55), (57..63) वास्तविक कुंजी के रूप में उपयोग किए जाते हैं। उदाहरण के लिए, अनुक्रम पर 56 प्रासंगिक बिट्स 1 हो गए हैं: 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, सबसे महत्वपूर्ण बिट्स को समानता जांच के रूप में शून्य पर छोड़कर।

वास्तव में एक 7 बाइट्स को परिवर्तित करने के लिए, एक 8 बाइट अनुक्रम के लिए 56 बिट अनुक्रम आप this code का उपयोग कर सकते हैं।

+0

उस कोड से जिसका आप उल्लेख कर रहे हैं, एक समानता बिट सेट करना: 'परिणाम [7-परिणाम Ix/8] | = 1; '। इस मामले में समानता जांच के लिए कम महत्वपूर्ण बिट्स का उपयोग किया जाता है। – axtavt

+0

@axtavt अगर मैं अपनी 56 बिट बाइनरी स्ट्रिंग को एक बड़े एंडियन बाइट सरणी में विभाजित करता हूं, तो किसी भी बाइट का एमएसबी '1' हो सकता है हालांकि बाइट डेटा प्रकार इसकी अनुमति नहीं देता है (इसकी रेंज -2^7-1 से 2^7-1)। क्या इस प्रकार का सही समाधान कास्टिंग है? मैं जानना चाहता हूं कि अगर मैं इन्हें बाइट्स में डालता हूं तो क्या मैं अभी भी उसी कुंजी का उपयोग कर रहा हूं जिसका मैं उपयोग करना चाहता था? – AnkurVj

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