[Cryptography] हैश गठबंधन करने का डिफ़ॉल्ट तरीका XOR क्यों है?


Answers

एक्सहोर जब हैशिंग का उपयोग करने के लिए एक खतरनाक डिफ़ॉल्ट फ़ंक्शन है यह और और या उससे बेहतर है, लेकिन वह बहुत कुछ नहीं कहता।

एक्सोर सममित है, इसलिए तत्वों का क्रम खो जाता है। तो "bad" हैश को "dab" रूप में समान रूप से जोड़ना होगा।

xor नक्शे को समान मान शून्य, और आपको "सामान्य" मानों को शून्य पर मैप करने से बचना चाहिए:

अतः (a,a) 0 से मैप किए जाते हैं, और (b,b) को 0 से भी मैप किया जाता है। जैसे कि जोड़े को यादृच्छिकता से ज्यादा सामान्य माना जा सकता है, आप जितना चाहिए उतना शून्य पर कई टकरावों के साथ समाप्त होता है।

इन दो समस्याओं के साथ, एक्सरे एक हैश कॉर्नर के रूप में समाप्त होता है जो सतह पर आधा सभ्य दिखता है, लेकिन आगे निरीक्षण के बाद नहीं।

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

तो hash(a) + hash(b) उस में बेहतर है यदि a==b , तो उसके बजाय hash(a)<<1 बजाय 0

यह सममित रहता है हम एक साधारण लागत के लिए इस समरूपता को तोड़ सकते हैं:

hash(a)<<1 + hash(a) + hash(b)

उर्फ hash(a)*3 + hash(b) ( hash(a) गणना और एक बार संग्रहीत करने की सलाह दी जाती है यदि आप बदलाव का समाधान करते हैं)। 3 बजाय किसी भी अजीब निरंतर, एक size_t (या कश्मीर-बिट अहस्ताक्षरित निरंतर) को अपने आप के रूप में स्वनिर्धारित करेगा, जैसा कि अहस्ताक्षरित स्थिरांक पर नक्काशी कुछ गणित के लिए गणित 2^k लिए है, और किसी भी अजीब निरंतर 2^k लिए अपेक्षाकृत प्रमुख है।

एक भी प्रशंसक संस्करण के लिए, हम boost::hash_combine जांच कर सकते हैं, जो प्रभावी रूप से है:

size_t hash_combine( size_t lhs, size_t rhs ) {
  lhs^= rhs + 0x9e3779b9 + (lhs << 6) + (lhs >> 2);
  return lhs;
}

यहाँ हम एक जोड़े के साथ कुछ स्थानांतरित संस्करणों को एक स्थिर (जो कि मूल रूप से यादृच्छिक 0 एस और 1 एस - विशेषकर यह एक 32 बिट नियत बिंदु अंश के रूप में स्वर्ण अनुपात के व्युत्क्रम के साथ) कुछ अतिरिक्त और एक एक्सरे के साथ जोड़ता है। यह समरूपता को तोड़ता है, और कुछ "शोर" का परिचय देता है अगर आने वाले हथेले मूल्य खराब होते हैं (यानी, प्रत्येक घटक को 0 से बनाकर कल्पना करो- उपरोक्त इसे अच्छी तरह से संभालती है, प्रत्येक संयोजन के बाद 1 और 0 एस का धब्बा पैदा करता है। 0 )।

जिन लोगों को सी / सी ++ से परिचित नहीं है, एक size_t एक अहस्ताक्षरित पूर्णांक मान है जो कि स्मृति में किसी वस्तु के आकार का वर्णन करने के लिए काफी बड़ा है। 64 बिट सिस्टम पर, यह आमतौर पर एक 64 बिट हस्ताक्षरित पूर्णांक है 32 बिट सिस्टम पर, एक 32 बिट हस्ताक्षरित पूर्णांक।

Question

कहते हैं कि आपके पास दो हैश H(A) और H(B) और आप उन्हें जोड़ना चाहते हैं। मैंने पढ़ा है कि दो हैश गठबंधन करने का एक अच्छा तरीका XOR है, जैसे XOR( H(A), H(B) )

मैंने जो सबसे अच्छा स्पष्टीकरण पाया है, वह इन हॅश फ़ंक्शन दिशानिर्देशों पर संक्षिप्त रूप से छुआ है:

दो नंबरों को मोटे तौर पर यादृच्छिक वितरण के परिणाम के साथ दूसरे नंबरों के साथ एक्सरिंग करते हुए, लेकिन अब जो दो मानों पर निर्भर करता है।
...
* गठबंधन के लिए दो संख्याओं के प्रत्येक बिट पर, 0 आउटपुट होता है, यदि दो बिट बराबर होते हैं, दूसरे 1। दूसरे शब्दों में, 50% संयोजनों में, 1 आउटपुट होगा। इसलिए यदि दो इनपुट बिट्स में प्रत्येक के पास 0 या 1 होने का लगभग 50-50 मौका है, तो भी आउटपुट बिट भी होगा।

क्या आप अन्तरक्रिया और / या गणित को समझा सकते हैं कि क्यों XOR को हैश फ़ंक्शन (बजाय OR या अन्य आदि) के संयोजन के लिए डिफ़ॉल्ट ऑपरेशन होना चाहिए?




बाईं 2 कॉलमों को कवर करें और इन्हें आउटपुट के उपयोग के बारे में जानने का प्रयास करें।

 a | b | a AND b
---+---+--------
 0 | 0 |    0
 0 | 1 |    0
 1 | 0 |    0
 1 | 1 |    1

जब आपने 1-बिट देखा तो आपको यह पता लगाना चाहिए कि दोनों इनपुट 1 थे

अब XOR के लिए ऐसा ही करें

 a | b | a XOR b
---+---+--------
 0 | 0 |    0
 0 | 1 |    1
 1 | 0 |    1
 1 | 1 |    0

XOR इसके बारे में कुछ नहीं देता इनपुट




एक्सर हैश गठबंधन करने का "डिफ़ॉल्ट" तरीका हो सकता है, लेकिन ग्रेग हेगिल के जवाब में यह भी पता चलता है कि इसके नुकसान क्यों हैं: दो समान हॅश मानों के एक्सओर शून्य है। वास्तविक जीवन में, समान हैंश एक अपेक्षाकृत अपेक्षा की अपेक्षा अधिक आम हैं। आप तब पाते हैं कि इन (नहीं इतनी निराश) कोने के मामलों में, परिणामस्वरूप संयुक्त हैश हमेशा एक ही होते हैं (शून्य)। हैश टकराव बहुत ज्यादा होगा, आप जितना अपेक्षा की जा सकती है।

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




यदि आप एक पक्षपाती इनपुट के साथ एक यादृच्छिक इनपुट XOR , आउटपुट यादृच्छिक है। वही AND या OR लिए सही नहीं है उदाहरण:

00101001 XOR 00000000 = 00101001
00101001 AND 00000000 = 00000000
00101001 OR  11111111 = 11111111

जैसा कि @ ग्रेग हेगिल का उल्लेख है, भले ही दोनों निविष्टियां यादृच्छिक हैं, AND या का उपयोग करते हुए पक्षपाती उत्पादन में परिणाम होगा

इसका कारण यह है कि हम कुछ अधिक जटिल पर XOR उपयोग करते हैं कि, ठीक है, इसमें कोई ज़रूरत नहीं है: XOR पूरी तरह से काम करता है, और यह बहुत तेज गति से तेज-तेज़ है