3 पॉइंट द्वारा GN⁺ 2024-05-06 | 1 टिप्पणियां | WhatsApp पर शेयर करें

Hash Function Prospector

यह टूल पूर्णांक हैश फ़ंक्शन खोज को ऑटोमेट करने के लिए बनाया गया एक छोटा utility है। यह 9 रिवर्सिबल ऑपरेशनों में से यादृच्छिक रूप से चुनकर अरबों integer हैश फ़ंक्शन जेनरेट करता है। जेनरेट किए गए फ़ंक्शन JIT compile होकर चलते हैं और उनका Avalanche व्यवहार evaluate होता है। वर्तमान में सबसे अच्छा फ़ंक्शन C syntax में output होता है।

  • Avalanche score: किसी एक input बिट को पलटने पर औसतन output में कितने बिट अपनी स्थिति में स्थिर रहते हैं। score जितना कम होता है, उतना बेहतर। आदर्श स्थिति में score 0 होना चाहिए। यानी, एक input bit बदलने पर सभी output बिट 50% संभावना से पलटते हैं।
  • Prospector 32-bit और 64-bit दोनों integer हैश फ़ंक्शन बना सकता है। पूरी सूची के विकल्पों के लिए usage (-h) देखें। JIT compiler की वजह से केवल x86-64 supported है, लेकिन खोजे गए फ़ंक्शन कहीं भी इस्तेमाल किए जा सकते हैं।

खोजे गए हैश फंक्शन

Prospector और इसमें मौजूद अन्य helper utilities द्वारा दो उपयोगी classes के हैश फंक्शन खोजे गए हैं। दोनों xorshift-multiply-xorshift structure का उपयोग करते हैं, बस rounds अलग हैं।

2-राउंड फंक्शन

TheIronBorn ने इस structure के लिए best-known parameters खोजने हेतु combinatorial optimization का उपयोग किया।

  • यह 32-bit 2-राउंड permutation विशेष रूप से कम bias रखता है और प्रसिद्ध MurmurHash3 32-bit finalizer को भी छोटी margin से पीछे छोड़ देता है।
  • यह हैश फंक्शन structure Prospector द्वारा खोजा गया था, और इसके parameters hill climbing और genetic algorithm से tune किए गए हैं।

और भी कई अधिक low-bias 2-राउंड constants उपलब्ध हैं, जिनमें से कुछ lowbias32 से बेहतर हैं।

3-राउंड फंक्शन

इस structure में multiply-xorshift का एक अतिरिक्त round जोड़ने पर carefully चुने गए parameters के साथ theoretical bias limit तक पहुँचा जा सकता है। उदाहरण के लिए, यह hash function एक ideal PRF से distinguish नहीं किया जा सकता।

  • triple32 केवल hash(0) = 0 issue को fix नहीं करता, बल्कि bias को और भी कम करता है।
  • और भी कई low-bias 3-राउंड constants मौजूद हैं।

सटीक bias मापन

-E mode किसी दिए हुए हैश फंक्शन (-p या -l) का bias मापता है। डिफ़ॉल्ट रूप से Prospector, फ़ंक्शन का bias तेज़ी से estimate करने के लिए अनुमान का उपयोग करता है, लेकिन यह non-deterministic होता है और परिणामों में काफी noise आ सकता है। सटीक bias को exhaustive तरीके से मापने के लिए -e option उपयोग करें।

  • -p और pattern के साथ या hash() नाम वाले function वाली shared library और -l के साथ, टेस्ट करने के लिए function define किया जा सकता है।
  • 64-bit हैश फंक्शन के लिए पूर्ण और exhaustive टेस्ट उपलब्ध नहीं है क्योंकि इसमें बहुत अधिक समय लगता है।

रिवर्सिबल ऑपरेशन्स का चयन

निम्नलिखित reversible ops उपयोग होते हैं:

  • x = ~x;
  • x ^= constant;
  • x *= constant | 1; (केवल odd constant)
  • x += constant;
  • x ^= x >> constant;
  • x ^= x << constant;
  • x += x << constant;
  • x -= x << constant;
  • x <<<= constant; (left rotate)
  • x = bswap(x) (high byte और low byte swap)

तकनीकी रूप से x = ~x को x ^= constant से cover किया जा सकता है। हालांकि ~x अनूठा (distinct) है और खास तौर पर उपयोगी भी।

16-bit हैश

16-bit hashes के लिए अलग constraints होने के कारण इन्हें खोजने के लिए अलग tool hp16 उपलब्ध है।

  • 32-bit/64-bit Prospector की तुलना में यह implementation पूरी तरह portable है और लगभग हर सिस्टम पर रन हो सकता है।
  • 128KiB S-box बनाने और evaluate करने की सुविधा भी है।
  • 16-bit hashes शायद उन machines पर ज़्यादा काम के होंगे जहाँ fast multiplication instruction नहीं है, इसलिए खोज के दौरान कुछ ऑपरेशन छोड़ सकते हैं (-m, -r)।

कुछ दिलचस्प परिणाम:

  • 2-राउंड xorshift-multiply hash
  • 3-राउंड xorshift-multiply hash
  • बिना multiplication वाला hash (सिर्फ़ xorshift-add का उपयोग)

अच्छा 3-राउंड xorshift hash (hp16 -Xn3 के साथ छोटा search) एक अच्छे S-box (hp16 -S) के करीब आता है।

16-bit ऑपरेशन करते समय C integer promotion rules पर ध्यान देना ज़रूरी है। इस प्रोग्राम में output होने वाला C code आवश्यक होने पर 16-bit ऑपरेशन को unsigned int में promote करने का ध्यान रखता है।

GN⁺ की राय

  • हैश फंक्शन की सुरक्षा cryptography और computer security में बेहद अहम है, इसलिए ऐसा खोज tool शोध के लिए निश्चित रूप से मददगार है। खासकर random खोज के ज़रिये low-bias हैश फंक्शन खोज निकालना बहुत दिलचस्प है।

  • लेकिन केवल statistical properties के आधार पर किसी hash function की सुरक्षा सुनिश्चित नहीं मानी जा सकती। cryptographic hash function को PreImage Resistance, Second PreImage Resistance, Collision Resistance जैसी कई attack vectors के खिलाफ safe होना चाहिए, इसलिए उसका अलग से analysis भी ज़रूरी है।

  • 16-bit हैश फंक्शन IoT या embedded systems जैसी constrained environment में काम के हो सकते हैं। यह विशेष रूप से उल्लेखनीय है कि CPU बिना multiplication instruction के भी ADD/XOR/SHIFT का उपयोग करके hash फंक्शन बनाया जा सकता है।

  • Hash function design में hill climbing या genetic algorithm जैसी heuristic खोज तकनीकों का उपयोग करना भी एक ताज़ा idea है। crypto algorithm design में AI technology जोड़ने के प्रयास तेज़ी से बढ़ रहे हैं, और ये optimization तकनीकें आगे और अधिक महत्वपूर्ण भूमिका निभा सकती हैं।

  • हालांकि Hash Function की सीमाओं के कारण Avalanche गुण कितना भी अच्छा हो, इसे cryptographically safe कहना कठिन है; यह इस project की सीमा प्रतीत होती है। फिर भी ऐसे tools के माध्यम से existing hash फंक्शनों की समस्याओं का analysis करके सुधार में मदद मिल सकती है।

1 टिप्पणियां

 
GN⁺ 2024-05-06
Hacker News टिप्पणी
  • इस डेवलपर का कोड पसंद आने के कारण
    • JSON लाइब्रेरी, option parsing लाइब्रेरी, branchless UTF-8 डिकोडर, lock-free स्टैक, और trie लाइब्रेरी जैसी चीज़ें उन्हें बहुत अच्छी लगीं
    • ऊपर की सभी लाइब्रेरियों का Unlicense के तहत ओपन होना भी उन्हें पसंद आया
  • MurmurHash डेवलपर की टिप्पणी
    • उन्होंने multiply-shift-xor ऑपरेशन का इतने लंबे समय तक बिना टूटे चलना जारी रहना रोचक बताया
  • ऑटोमेटिक हैश फंक्शन खोज पर अपने विचार साझा किए
    • SMHasher3 के साथ इंटीग्रेट करके आउटपुट को स्वचालित रूप से इवैल्यूएट करना शायद बेहतर होगा
      • स्पीड के लिए सिर्फ कुछ टेस्ट रन करके जल्दी फ़ेल हो सकता है
    • 64-bit और 128-bit हैश तक इसे बढ़ाना भी अच्छा रहेगा (सर्च स्पेस बड़ा होगा)
    • उन्होंने Rain लाइब्रेरी के लिए 64-bit prime multiplication पर avalanche effect मापने वाला NodeJS कोड बनाया
  • 1brc समस्या को Go में इंप्लीमेंट करने के अनुभव पर चर्चा की
    • प्रत्येक स्टेशन को बिना collision के अलग bucket में डालने वाला custom perfect hash function खोजने की कोशिश की, लेकिन रनटाइम शुरू होने से पहले डेटा देखकर hash function को कस्टमाइज़ न कर पाने के नियम के कारण छोड़ दिया
    • उन्होंने एक टेस्ट टूल बनाया जो random constants ट्राई करता है और collision वाले bucket की संख्या तथा कुल collisions के आधार पर अब तक मिला best constant आउटपुट करता है
      • करीब 40% लोड फैक्टर पर केवल 2 collision values वाला सिर्फ 1 bucket तक घटा सका
      • अलग-अलग constants के बावजूद, स्थान बदलने की संख्या के लिए लगभग समान मान सबसे अच्छे-performing constant सेट में शामिल थे—यह काफी दिलचस्प था
  • पूछा गया कि यह कोड शानदार क्यों लगता है और इसका intended use-case क्या है
  • यह ठीक-ठीक क्या करता है—क्या यह best hash function खोजता है, अगर नहीं तो हर रन पर best function क्यों बदल जाती है?
  • किसी निश्चित integer रेंज के लिए अच्छा hash function खोजने के मेकनिज़्म के बारे में पूछा
    • उदाहरण के लिए, अगर 10,000 से 200,000 के बीच के integers ज्ञात हों और उन्हें optimal number of hash buckets पर hash करना हो
  • रिवर्सिबल ऑपरेशन तक सीमित करने का गणितीय लाभ है, लेकिन इससे कई ऑप्शंस हट जाते हैं, ऐसा कहा
    • पहले से ज्ञात input set के लिए perfect hashing पर भी सोचा था
    • सामान्यतः constants array का उपयोग होता है, लेकिन अगर inputs पहले से छोटे integers हों तो क्या और compress किया जा सकता है, यह पूछना चाहा
    • लगभग 100 बेसिक ऑपरेशन की सूची बनाई, लेकिन काम उबाऊ लगने लगा और project आगे नहीं बढ़ाया
  • दो multiplications में same constant इस्तेमाल करने पर code size कम होकर speed थोड़ी बढ़ सकती है, ऐसा सुझाव दिया
  • इन फंक्शनों का क्रिप्टोग्राफिक ऑपरेशनों में ठीक से काम न करना मानते हुए भी, मापे गए "bias" का क्रिप्टोएनालिसिस पर क्या असर पड़ता है—इस पर सवाल पूछे
    • कोई differential cryptography समझने वाला बताए तो अच्छा होगा
    • क्या कम bias वाला hash function कम rounds या कम कंप्यूटेशन में cryptanalysis को बायपास/neutralize कर सकता है?
    • क्या यह टूल बेहतर cryptographic hash functions खोजने में मदद कर सकता है?
  • समान प्रोजेक्ट का उल्लेख
    • स्पीड धीमी है (interpreter उपयोग होने से), लेकिन फंक्शन्स की क्वालिटी बेहतर है
    • हालांकि किसी बेहतर मौजूदा hash function से बेहतर नहीं मिल पाया