encoding - SHA-1 हैश 40 वर्ण लंबा क्यों है यदि यह केवल 160 बिट है?




hash sha1 (4)

प्रश्न का शीर्षक यह सब कहता है। मैं SHA-1 का शोध कर रहा हूं और अधिकांश स्थानों पर मुझे 40 हेक्स वर्ण होने का समय लगता है जो मेरे लिए 640 बिट है। क्या इसे केवल 10 हेक्स वर्ण 160 बिट = 20byte के साथ ही प्रदर्शित नहीं किया जा सकता है। और एक हेक्स चरित्र 2 बाइट सही का प्रतिनिधित्व कर सकता है? यह दो बार कब तक होना चाहिए? मेरी समझ में मुझे क्या याद आ रही है।

और बेस 32 या बेस 36 का उपयोग करते हुए SHA-1 भी 5 या उससे कम वर्ण नहीं हो सकता है?


2 हेक्स वर्ण 0-255, यानी 0x00 == 0 और 0xFF == 255 से एक सीमा बनाते हैं। तो 2 हेक्स वर्ण 8 बिट हैं, जो आपके SHA पचाने के लिए 160 बिट बनाता है।


एसएचए -1 160 बिट्स है

यह 20 बाइट = 40 हेक्स वर्णों (बाइट प्रति 2 हेक्स वर्ण) का अनुवाद करता है


मुझे लगता है कि ओपी का भ्रम एक एसएए 1 हैश का प्रतिनिधित्व करने वाली स्ट्रिंग से आता है जो 40 बाइट्स लेता है (कम से कम यदि आप एएससीआईआईआई का उपयोग कर रहे हैं), जो 320 बिट्स (640 बिट्स नहीं) के बराबर है।

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

हालांकि आप बेस 64 का उपयोग कर सकते हैं, इस मामले में आपको 40 के बजाय 27-28 बाइट्स (या वर्ण) की आवश्यकता होगी ( इस पृष्ठ को देखें)।


मेरा जवाब केवल मेरे सिद्धांत में पिछले ओपी के भ्रम की सटीक उत्पत्ति के रूप में अलग है, और बच्चे के चरणों में मैं स्पष्टता प्रदान करता हूं।

इस्तेमाल किए गए एन्कोडिंग के आधार पर एक चरित्र विभिन्न बाइट्स लेता है ( यहां देखें )। इन दिनों कुछ संदर्भ हैं जब हम प्रति अक्षर 2 बाइट्स का उपयोग करते हैं, उदाहरण के लिए जब जावा में प्रोग्रामिंग ( यहां क्यों है )। इस प्रकार 40 जावा वर्ण 80 बाइट्स = 640 बिट्स के बराबर होंगे, ओपी की गणना, और 10 जावा वर्ण वास्तव में SHA-1 हैश के लिए सही मात्रा में जानकारी को समाहित करेंगे।

संभवतः हजारों संभावित जावा वर्णों के विपरीत, केवल 16 अलग-अलग हेक्स वर्ण हैं , अर्थात् 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ए, बी, सी, डी, ई और एफ लेकिन ये जावा वर्णों के समान नहीं हैं, और जावा वर्ण 0 से 9 और ए से एफ के एन्कोडिंग की तुलना में बहुत कम जगह लेते हैं। वे प्रतीकों को केवल 4 बिट्स द्वारा दर्शाए गए सभी संभावित मानों को इंगित करते हैं:

0  0000    4  0100    8  1000    C  1100
1  0001    5  0101    9  1001    D  1101
2  0010    6  0110    A  1010    E  1110
3  0011    7  0111    B  1011    F  1111

इस प्रकार प्रत्येक हेक्स चरित्र केवल आधा बाइट होता है, और 40 हेक्स वर्ण हमें 20 बाइट = 160 बिट्स देता है - एक SHA-1 हैश की लंबाई।





base32