2010-04-15 12 views
14

मैंने हाल ही में ब्रूस शनीयर द्वारा एप्लाइड क्रिप्टोग्राफी की प्रतिलिपि उठाई और यह एक अच्छा पढ़ा गया है। अब मैं समझता हूं कि किताब के काम में कितने एल्गोरिदम उल्लिखित हैं, और मैं उनमें से कुछ को सी32-बिट परिवर्तनीय 32 बिट्स को स्थानांतरित करने के बारे में क्या बुरा है?

एक बात यह है कि कई एल्गोरिदम सामान्य हैं जो एक्स-बिट कुंजी को विभाजित कर रहे हैं कई छोटी वाई-बिट कुंजी। उदाहरण के लिए, ब्लोफिश की कुंजी, एक्स 64-बिट्स है, लेकिन आपको इसे दो 32-बिट हिस्सों में तोड़ने की आवश्यकता है; एक्सएल और एक्सआर।

यह वह जगह है जहां मैं अटक गया हूं। मैं सी के साथ काफी सभ्य हूं, लेकिन जब मैं बिटवाई ऑपरेटरों और इसी तरह की बात करता हूं तो मैं सबसे मजबूत नहीं हूं।

आईआरसी पर कुछ मदद के बाद, मैं इन दो मैक्रो के साथ आने में कामयाब रहे:

#define splitup(a, b, c) {b = a >> 32; c = a & 0xffffffff; } 
#define combine(a, b, c) {a = (c << 32) | a;} 

जहां एक 64 बिट्स और बी और सी 32 बिट कर रहे हैं। हालांकि, संकलक मुझे इस तथ्य के बारे में चेतावनी देता है कि मैं 32 बिट्स द्वारा 32 बिट वैरिएबल को स्थानांतरित कर रहा हूं।

मेरे सवालों का ये हैं:

  • क्या एक 32-बिट चर 32 बिट स्थानांतरण के बारे में बुरा है? मुझे लगता है कि यह अपरिभाषित है, लेकिन ये मैक्रोज़ काम कर रहे प्रतीत होते हैं।
  • इसके अलावा, क्या आप सुझाव देंगे कि मैं इस बारे में किसी अन्य तरीके से जाऊं?

जैसा कि मैंने कहा, मैं सी से काफी परिचित हूं, लेकिन थोड़ा सा ऑपरेटर और अभी भी मुझे सिरदर्द देता है।

संपादित

मैं पता लगा कि मेरी गठबंधन मैक्रो वास्तव में दो 32-बिट चर के संयोजन था, लेकिन केवल एक से 0 Oring, और एक परिणाम के रूप में एक हो रही।
तो, मेरे पिछले प्रश्नों के शीर्ष पर, मेरे पास अभी भी 64-बिट एक प्राप्त करने के लिए दो 32-बिट चर के संयोजन की विधि नहीं है; इसे करने के तरीके पर एक सुझाव की सराहना की जाएगी।

+4

+1, भयानक सवाल, सही तरीके से प्रारूपित करने के लिए समय निकालने के लिए धन्यवाद और स्टैक ओवरफ़्लो में आपका स्वागत है! –

+0

वैसे, मैं शर्त लगाता हूं कि आपके गठबंधन मैक्रो को बी के साथ ऑरिंग होना चाहिए, नहीं, है ना? – tloflin

उत्तर

18

हां, यह अपरिभाषित व्यवहार है।

आईएसओ/आईईसी 9899: 1999 6.5.7 बिटवाइस पारी ऑपरेटरों ¶3

पूर्णांक प्रोन्नति ऑपरेंड में से प्रत्येक पर प्रदर्शन कर रहे हैं। परिणाम का प्रकार प्रचारित बाएं ऑपरेंड का है। यदि दाएं ऑपरेंड का मान नकारात्मक है या प्रचारित बाएं ऑपरेंड की चौड़ाई से अधिक या बराबर है, तो व्यवहार अपरिभाषित है।

सी 11 उर्फ ​​आईएसओ/आईईसी 98 99: 2011 वही कहता है।

आपको पहले लक्ष्य पूर्णांक प्रकार में b डालना चाहिए। एक और मुद्दा यह है कि ऑपरेटर प्राथमिकताओं से आश्चर्य से बचने के लिए आपको मैक्रो पैरामीटर के चारों ओर कोष्ठक रखना चाहिए। इसके अतिरिक्त, कॉमा ऑपरेटर यहां बहुत उपयोगी है, जिससे आप ब्रेसिज़ से बच सकते हैं, ताकि मैक्रो को सामान्य कमांड के रूप में इस्तेमाल किया जा सके, अर्धविराम से बंद हो।

#define splitup(a,b,c) ((b) = (a) >> 32, (c) = (a) & 0xffffffff) 
#define combine(a,b,c) ((a) = ((unsigned long long)(b) << 32) | (c)) 

अतिरिक्त डाले `splitup ओवर-पागल compilers द्वारा परिशुद्धता नुकसान के बारे में चेतावनी मौन करने के लिए आवश्यक हो सकता है।

#define splitup(a,b,c) ((b) = (unsigned long)((a) >> 32), (c) = (unsigned long)((a) & 0xffffffff)) 

और कृपया उत्पादन कोड के लिए अपने स्वयं लिखित एन्क्रिप्शन का उपयोग करने के बारे में भी सोचें।

3

32-बिट परिवर्तनीय 32 बिट्स को स्थानांतरित करने के बारे में क्या बुरा है?

एन-बिट्स द्वारा इसे स्थानांतरित करने के बजाय 0 एन-बिट पूर्णांक को असाइन करना बेहतर है।

उदाहरण:

0 0 1 0 1 ----- 5 bit Integer 
0 1 0 1 0 ----- 1st shift 
1 0 1 0 0 ----- 2nd shift 
0 1 0 0 0 ----- 3rd shift 
1 0 0 0 0 ----- 4th shift 
0 0 0 0 0 ----- 5th shift (all the bits are shifted!) 

मैं अभी भी एक 64-बिट एक

प्राप्त करने के लिए दो 32-बिट चर के संयोजन की एक विधि की जरूरत नहीं है विचार करें:a 64 बिट, b और c 32 बिट हैं

a = b; 
a = a << 32; //Note: a is 64 bit 
a = a | c; 
+0

ओह, ठीक है। तो मेरा गठबंधन मैक्रो एक प्राप्त करने के लिए ओआरिंग 0 था; जो, यदि मैं सही हूं, तो इसका मतलब है कि यह वास्तव में एक 64-बिट चर बनाने के लिए दो 32-बिट चरों को संयोजित नहीं कर रहा था। रफ़ू। – masseyc

0

इस जब तक है कुछ "पहिया पुनर्रचना को समझने के लिए यह कैसे काम करता" परियोजना, अपने खुद के क्रिप्टो कार्यों को लागू नहीं है।

कभी।

काम करने के लिए उपलब्ध एल्गोरिदम का उपयोग करना मुश्किल है (और सही चुनने के लिए), कुछ घर उगाए गए क्रिप्टर एपीआई के उत्पादन में पैर डालकर खुद को गोली मारो। संभावना your encryption won't encrypt

+3

टिप के लिए धन्यवाद, लेकिन यह * उन लोगों में से एक है "यह समझने के लिए पहिया को पुनर्निर्मित करता है कि यह कैसे काम करता है" परियोजनाएं। :) – masseyc

+0

ठीक है, लेकिन जब आप पूरा कर लें तो कोड को नष्ट करना न भूलें: डी – Guillaume

+3

मुझे इस सलाह पर विश्वास नहीं है। – Joshua

10

32 बिट्स या उससे अधिक 32-बिट मान को स्थानांतरित करना सी और सी ++ में अपरिभाषित है। अपरिभाषित छोड़ने के कारणों में से एक यह है कि कुछ हार्डवेयर प्लेटफॉर्म पर 32-बिट शिफ्ट निर्देश केवल आपूर्ति की गई शिफ्ट गणना के 5 सबसे कम बिट्स को ध्यान में रखता है। इसका मतलब यह है कि जो भी शिफ्ट गिनती आप पास करते हैं, उसे मॉड्यूल 32 का अर्थ दिया जाएगा। इस तरह के प्लेटफॉर्म पर 32 तक स्थानांतरित करने का प्रयास वास्तव में 0 से बदल जाएगा, यानी बिल्कुल बदलाव नहीं किया जाएगा।

भाषा लेखक शिफ्ट करने से पहले शिफ्ट गणना का विश्लेषण करने के कार्य के साथ ऐसे मंच के लिए लिखे गए कंपाइलरों को बोझ नहीं करना चाहते थे। इसके बजाए, भाषा विनिर्देश कहता है कि व्यवहार अपरिभाषित है। इसका मतलब यह है कि यदि आप 32-बिट शिफ्ट से 32 (या अधिक) से 0 मान प्राप्त करना चाहते हैं, तो यह स्थिति आप को पहचानने और उसके अनुसार प्रक्रिया करने के लिए निर्भर है।

+6

शायद यह इंगित करने लायक है कि इस मामले में "कुछ प्लेटफार्म" में x86 शामिल है। – caf

+0

अविश्वसनीय ... कंप्यूटर्स को अंतर्निहित हार्डवेयर आर्किटेक्चर "सीमाएं" के लिए "क्षतिपूर्ति" करनी चाहिए ... क्या होगा यदि यह एक प्रोसेसर मौजूद होगा जो बिट शिफ्ट (विषम !!) को लागू नहीं कर रहा है? >> या << का पूरा परिणाम अपरिभाषित होगा ?! हास्यास्पद ... – ShinTakezou

+1

@ShinTakezou: कुछ कार्यक्रमों को 'x << (y & 31) 'का मूल्यांकन करने की आवश्यकता है। कभी-कभी कार्यक्रमों को 'y> = 32 की आवश्यकता होती है? 0: एक्स << वाई'। कुछ परिणाम के साथ भी उतने ही खुश होंगे। यदि मानक या तो व्यवहार के लिए अनिवार्य है, तो कम से कम कुछ प्लेटफार्मों के लिए कंपाइलर्स को उन कार्यक्रमों के लिए आवश्यक कोड उत्पन्न करना होगा, जिन पर ध्यान नहीं दिया गया कि उन्हें किस नतीजे मिले। इससे भी बदतर, जब विपरीत विपरीत परिणाम की आवश्यकता वाले प्रोग्राम प्लेटफ़ॉर्म पर चलते हैं जो "स्वाभाविक रूप से" प्रोग्राम चाहते थे, तो वापस लौटाएंगे, प्रोग्रामर को संकलक द्वारा पेश किए गए अवांछित अतिरिक्त कोड के प्रभावों को दूर करने के लिए कोड लिखना होगा। – supercat

0

32-बिट परिवर्तनीय 32 बिट्स को स्थानांतरित करने के बारे में क्या बुरा है?

क्या पहले से ही किया गया है के अलावा कहा, 32 वीं सा संकेत सा है, और आप गाते हैं, जिससे महत्वपूर्ण बिट खोने को संरक्षित करने के संकेत विस्तार मिल सकता है।

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