هش کردن در رمزنگاری
آیا به دنبال یادگیری هش در رمزنگاری هستید؟ اگر این کار را انجام دهید ، پس به جای درست آمده اید.
در این مقاله ، ما بیشتر در مورد هش کردن کشف خواهیم کرد.
هاشینگ یک تکنیک علوم رایانه ای برای شناسایی اشیا or یا مقادیر از گروهی از اشیا values یا مقادیر است.
گیج کننده به نظر می رسد?
بیایید سعی کنیم با مثال درک کنیم.
خوب ، کالج ها و مدارس به هر یک از دانشجویان خود تعداد اختصاصی اختصاص می دهند. این عدد منحصر به فرد همان چیزی است که دانش آموز و اطلاعات مربوط به او را مشخص می کند. روشی که برای تولید عدد منحصر به فرد استفاده می شود هاشینگ است.
مثال مشهور دیگر کتابخانه هایی است که در قفسه ها تعداد زیادی کتاب پیدا خواهید کرد. هر کتاب در آنجا شماره شناسایی منحصر به فرد خود را دارد تا بتواند در کتابخانه عظیم واقع شود!
یک مثال مدرن از هش کردن ، بازیکنان بازی هستند که برای بازی ثبت نام می کنند. Valorant یک بازی رایگان برای بازی است که توسط Riot راه اندازی شده است. رایگان بودن به معنای این است که میلیون ها نفر بازی را انجام می دهند.
هر بازیکن با استفاده از یک مقدار شناسایی منحصر به فرد تولید می شود که با استفاده از یک الگوریتم هش تولید می شود.
در زیر سعی می کنیم آن را با جزئیات بیشتری درک کنیم.
هاشینگ چیست?
همانطور که در بالا گفته شد ، هاشینگ روش شناسایی یک شی از یک گروه است.
هر شی once یک بار شناسه منحصر به فرد می گیرد.
اما ، این از نظر فنی به چه معناست?
از نظر فنی ، یک تابع ریاضی از هر رشته ورودی به هر طول یک خروجی با طول ثابت ایجاد می کند.
معاملات بیت کوین در جایی هش می شوند که تراکنش ها شناسه منحصر به فرد دریافت می کنند.
اگر “سلام ، جهان” را وارد کنید در یک الگوریتم هش SHA-256, شما خروجی زیر را دریافت خواهید کرد:
ورودی: سلام دنیا!
خروجی: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
در اینجا SHA256 از ورودی داده شده تولید می کند. همانطور که مشاهده می کنید ، ما از الگوریتم هش Secure Hash Function (SHA-256) استفاده کردیم. این یکی از روشهای محبوب هش کردن است ، از جمله Message Direct (MD5) و Secure Hash Function (SHA1).
ویژگی های کلیدی عملکرد هش آن را قابل اعتماد می کند. بیایید آنها را در زیر لیست کنیم.
- مصمم → این بدان معنی است که در هر شرایطی خروجی برای ورودی داده شده یکسان خواهد بود.
- مقاوم در برابر تصویر resistant ویژگی مقاوم در برابر تصویر تضمین می کند که مقدار هش برای تولید مقدار ورودی مفید نیست.
- از نظر محاسباتی کارآمد functions توابع هش کارآمد هستند و برای اجرا به منابع محاسباتی زیادی احتیاج ندارند.
- نمی توان مهندسی کرد function عملکرد هش را نمی توان مهندسی کرد.
- مقاوم در برابر برخورد resistance مقاومت در برابر برخورد اطمینان می دهد که هیچ دو ورودی به یک خروجی منجر نمی شوند.
ما قبلاً Cryptographic Hashing را برای مبتدیان در اینجا آورده ایم. آنجا را بررسی کنید: Cryptographic Hashing: A Beginner’s Guide.
اما ، اگر برای کارهای پیشرفته اینجا باشید ، ناامید نخواهید شد.
عملکرد هاش و جداول هاش چیست؟ و چگونه کار می کنند?
در این بخش ، ما با جزئیات بیشتر عملکرد هش و جداول هش را بررسی خواهیم کرد. از نظر هش کردن ، توابع هش وجود دارد. این توابع وظیفه تبدیل ورودی های بزرگ به ورودی های ثابت کوچک را دارند. جداول هش خروجی ها را ذخیره می کنند.
در فرآیند هش کردن ، اشیا بر اساس جفت کلید / مقدار آنها به آرایه توزیع می شوند. بنابراین ، اگر آرایه ای از عناصر را به توابع هش انتقال دهید ، خروجی آرایه ای دریافت خواهید کرد که در آن هر یک از عناصر اکنون یک کلید به آن متصل شده است. جفت کلید / مقدار هنگام استفاده از عناصر در زمان واقعی بسیار مفید است زیرا زمان چشمگیر O (1) را ارائه می دهد.
برای اجرای توابع هش ، می توانید دو روش ترجیحی را حذف کنید.
- روش اول استفاده از یک تابع هش برای تبدیل یک عنصر به یک عدد صحیح است. در مرحله بعد ، می توان هنگام دسترسی به جدول هش ، از خروجی عدد صحیح برای دسترسی به عنصر استفاده کرد.
- مرحله دیگر قرار دادن عنصر در جدول هش و سپس بازیابی آن با استفاده از کلید هش شده است.
در روش دوم ، توابع به شرح زیر است:
hash = hash_function (کلید) index = hash٪ array_size
در اینجا ، اندازه های هش و آرایه از یکدیگر مستقل هستند. مقدار شاخص بر اساس اندازه آرایه محاسبه می شود. عملگر مدول (٪) ما را قادر به محاسبه مقدار می کند.
به عبارت ساده ، یک تابع هش می تواند به عنوان تابعی تعریف شود که بتواند مجموعه داده های اندازه دلخواه را به یک مجموعه داده با اندازه ثابت ترسیم کند. مجموعه داده های اندازه ثابت حاصل می توانند در جدول هش ذخیره شوند. بسیاری از نامها به مقادیری که توسط تابع هش برگردانده می شود. آنها را می توان مقادیر هش ، هش ، مجموع هش و کد هش نامید.
نوشتن یک عملکرد خوب هش
اگر می خواهید عملکرد یا مکانیزم هش خوبی ایجاد کنید ، باید نیازهای اساسی ایجاد آن را درک کنید. بیایید آنها را در زیر لیست کنیم:
- عملکرد هش باید آسان محاسبه شود. این بدان معنی است که برای اجرای آن نیازی به منابع زیادی نیست.
- عملکرد هش باید به طور یکنواخت توزیع شود. با این کار از جداول هش برای ذخیره مقادیر هش استفاده می شود تا خوشه بندی اتفاق نیفتد.
- آخرین نیاز این است که برخورد کمتری داشته باشیم یا اصلاً برخورد نکنیم. عدم برخورد به این معنی است که هیچ خروجی واحدی به دو ورودی ترسیم نمی شود.
از نظر فنی ، برخوردها بخشی از عملکرد هش است و به راحتی نمی توان آن را از عملکرد هش حذف کرد. هدف ایجاد یک عملکرد هش است که بتواند عملکرد خوب جدول هش را ارائه دهد و برخورد را از طریق تکنیک های تفکیک پذیری حل کند.
چرا به عملکرد خوب هاش نیاز داریم?
برای درک نیاز به یک عملکرد هش مفید ، یک مثال زیر را مرور کنیم.
بیایید فرض کنیم که می خواهیم یک جدول Hash با استفاده از تکنیک هش ایجاد کنیم که رشته های ورودی به صورت زیر باشد: “” agk “،” kag “،” gak “،” akg “،” kga “،” gka “}
اکنون ، یک تابع هش ایجاد می کنیم که به راحتی مقدار ASCII a (97) ، g (103) و k (107) را اضافه می کند و سپس یک مدول از مجموع را با 307 انجام می دهد.
واضح است که مجموع سه عدد نیز 307 است. این بدان معناست که اگر همه اعداد را جا به جا کنیم و سپس یک عمل مدول انجام دهیم ، همان نتیجه را خواهیم گرفت. نتیجه نهایی ذخیره سازی همه رشته ها با همان شماره شاخص خواهد بود. زمان الگوریتمی تابع هش نیز پیچیدگی O (n) خواهد بود که مطلوب نیست. به راحتی می توانیم نتیجه بگیریم که عملکرد هش که توصیف کردیم برای سناریوهای واقعی بهینه نیست.
برای رفع تابع هش ، می توان مجموع مقادیر ASCII هر عنصر را بر عدد اول دیگر ، 727 تقسیم کرد: با این کار ، خروجی متفاوتی برای آرایه رشته های ورودی داده شده خود دریافت خواهیم کرد..
یادگیری در مورد جداول هش
جداول هش در ذخیره نتیجه یک تابع هش ، که ایندکس را محاسبه می کند و سپس مقداری را در مقابل آن ذخیره می کند ، بسیار مفید هستند. نتیجه نهایی فرآیند محاسباتی سریعتر با پیچیدگی O (1) خواهد بود.
جداول هش به طور سنتی در حل مشکلاتی که به زمان O (n) نیاز دارند انتخاب خوبی است.
بنابراین ، اگر رشته ای با طول ثابت را برداشته و سپس سعی کنید فرکانس کاراکتر رشته را یاد بگیرید.
بنابراین ، اگر string = “aacddce” ، پس یک روش کلی این است که چندین بار از این رشته عبور کرده و هر فرکانس را ذخیره کنید.
# یک رشته ورودی ارائه دهید و تعداد دفعات کاراکترهای آن رشته را بشمارید
# الگوریتم زمان پیچیدگی 0 (n) است
temp_list = [] start = "آ" str = "ababcddefff" def alpha_zeta (): alpha = ‘a’ for i in range (0،26): temp_list.append (alpha) alpha = chr (ord (alpha) + 1) temp_list temp_list = alpha_zeta () #print (temp_list) def فرکانس_ کاراکتر (str ، لیست لیست temp): برای هر یک در temp_list: freq = 0 برای i in str: if (i == هر یک): freq = freq + 1 چاپ (هر یک ، freq) کاراکتر_ فرکانس (str ، temp_list)
خروجی برنامه فوق به شرح زیر خواهد بود:
a 2 b 2 c 1 d 2 e 1 f 3 g 0 h 0 i 0 .. ..
حالا ، بیایید یک جدول هش را در ++ C اجرا کنیم و فرکانس کاراکتر را حساب کنیم.
# استفاده از namespace std؛ int فرکانس [26]؛ int hashFunc (char c) {return (c – ‘a’)؛ } void countFre (رشته S) {for (int i = 0؛ i< S.length () ؛ ++ من) {int index = hashFunc (S [i])؛ فرکانس [فهرست] ++ ؛ } برای (int i = 0؛ i<26؛ ++ من) {cout << (char) (i + ‘a’) << » << فرکانس [من]<< endl؛ }} int main () {cout<<"سلام دنیا"؛ countFre ("abbaccbdd") }
خروجی برنامه به شرح زیر است:
a 2 b 3 c 2 d 2
پیچیدگی O (N) الگوریتم آن را در مقایسه با سایر رویکردهای خطی سریعتر می کند.
نحوه حل و فصل برخوردها
روشهای منحصر به فردی برای حل برخورد در توابع هش وجود دارد. یکی از روشهای معروف زنجیر زنی جداگانه است که به هش باز نیز معروف است. این با یک لیست پیوندی اجرا می شود که در آن هر یک از عناصر موجود در این زنجیره خود یک لیست پیوند یافته است. این روش امکان ذخیره عناصر را فراهم می کند و اطمینان حاصل می کند که برخی از عناصر تنها بخشی از لیست پیوندی خاص هستند و برخورد را حل می کنند. این بدان معناست که هیچ دو مقدار ورودی نمی توانند مقدار هش خروجی یکسانی داشته باشند.
کاوش هاش در پایتون
در این بخش ، ما به سرعت به جستجوی هش در پایتون خواهیم پرداخت. دلیل اینکه ما پایتون را انتخاب کرده ایم این است که آسان خوانده می شود و بدون دردسر زیادی توسط همه قابل استفاده است.
از آنجا که هش کردن یک عملکرد مشترک است ، از قبل در کتابخانه پایتون پیاده سازی شده است. با استفاده از ماژول می توانید یک شی object را به عنوان ورودی خود ارائه دهید و سپس مقدار هش شده را برگردانید.
نحو روش هش این است:
هش (شی)
همانطور که مشاهده می کنید ، یک پارامتر واحد را می گیرد که همان شی است. این شی می تواند عدد صحیح ، شناور یا رشته ای باشد.
مقدار برگشتی روش hash () به ورودی بستگی دارد. برای یک عدد صحیح ، ممکن است همان تعداد را برگرداند در حالی که برای اعشار و رشته متفاوت است.
بیایید چند نمونه را در زیر ببینید.
num = 10 deci = 1.23556 str1 = "نیتشی" چاپ (هش (شماره)) چاپ (هش (تصمیم)) چاپ (هش (str1))
خروجی کد فوق به شرح زیر است:
با این حال ، هش کردن را نمی توان برای همه انواع شی اعمال کرد. به عنوان مثال ، اگر به یاد داشته باشید که ما در اولین برنامه خود لیستی از a to z ایجاد کردیم. اگر بخواهیم آن را هش کنیم ، پنجره خروجی از طریق TypeError: unhashable type: ‘list’
برای اعمال هش به لیست اشیا ، باید از tuple استفاده کنید.
حروف صدادار = (‘a’، ‘e’، ‘i’، ‘o’، ‘u’) print (hash (vowels)) خروجی ⇒ -5678652950122127926
هش کردن در رمزنگاری
هش کردن برای رمزنگاری مفید است. بیت کوین از هش کردن برای ایجاد و مدیریت درختان مرکل استفاده می کند
همچنین ، هش کردن برای مدت زمان طولانی بخشی از رمزنگاری بوده است. با این حال ، بهترین مورد استفاده از هش ، هش کلمه عبور و ذخیره آنها است.
درختان مرکل
Merkle tree یک ساختار داده است که هنگام انجام تأیید صحت داده ها در یک مجموعه داده بزرگ ، مفید است. Bitcoin و Ethereum از درختان Merkle برای حل بسیاری از موانع فن آوری هنگام ذخیره سازی و دسترسی به داده ها در یک شبکه باز استفاده می کنند..
هر شبکه متمرکز نگران ذخیره و دسترسی به داده ها نیست زیرا تنها یک منبع برای دسترسی و ذخیره داده وجود دارد. با این حال ، وقتی شبکه غیرمتمرکز وجود دارد ، معادله تغییر می کند زیرا اکنون داده ها باید در میان صدها نفر از همتایان کپی شوند.
درختان مرکل با ارائه روشی مطمئن و کارآمد برای به اشتراک گذاری و تأیید داده ها در بین همسالان ، مشکل را حل می کنند.
مثال درخت مرکل
اما ، چرا ما در اینجا در مورد درختان مرکل بحث می کنیم؟ درختان مرکل از هش به عنوان قابلیت اصلی برای اتصال گره های مختلف و بلوک های داده استفاده می کنند.
Merkle Trees یک درخت وارونه است که می تواند کل مجموعه معاملات را خلاصه کند.
اگر می خواهید درباره درختان مرکل و چگونگی استفاده از هش کردن در رمزنگاری بیشتر بدانید ، راهنمای دقیق ما را مطالعه کنید: راهنمای درختان مرکل. در آنجا ، ما در مورد چگونگی اجرای درختان مرکل در بیت کوین و موارد دیگر استفاده کردیم.
فرآیند استخراج
روند استخراج همچنین از هش کردن بهره می برد. وقتی نوبت به استخراج بیت کوین می رسد ، در صورت تقاضا برای بلاکچین ، بلاک جدیدی به آن اضافه می شود.
برای افزودن بلاک به بلاکچین باید روشی را دنبال کرد. با ورود بلوک جدید ، مقدار هش بسته به محتوای بلوک تولید می شود. همچنین ، اگر هش تولید شده بیش از مشکل شبکه باشد ، فرایند افزودن بلاک به بلاکچین آغاز می شود.
پس از اتمام ، همه همتا در شبکه افزودن بلوک جدید را تأیید می کنند.
اما این به ندرت اتفاق می افتد زیرا مشکل شبکه ، در اکثر موارد ، همیشه در مقایسه با هش تولید شده بیشتر است. جنبه دیگری نیز وجود دارد که در فرآیند استخراج نقش اساسی دارد. این nonce است.
nonce به هش بلوک اضافه می شود و یک رشته دلخواه است. پس از اتمام ، رشته متصل شده با سطح دشواری مقایسه می شود. اگر سطح دشواری از رشته بهم پیوسته باشد ، تا زمانی که سطح دشواری بالاتر نباشد ، nonce تغییر می کند.
روند را می توان در مراحل زیر خلاصه کرد:
- هر زمان که بلاک جدیدی تولید یا گرفته شود ، محتویات برای ایجاد مقدار هش جدید هش می شوند,
- یک مقدار غیر جدید جدید ایجاد می شود و به هش اضافه می شود
- فرآیند هش کردن روی رشته جدیدی که با آن تماس گرفته شده انجام می شود
- سپس مقدار نهایی هش با سطح دشواری شبکه مقایسه می شود
- اگر مقدار نهایی هش کمتر از nonce باشد ، فرآیند دوباره تکرار می شود. این فرآیند فقط وقتی متوقف می شود که مقدار هش بیش از nonce باشد.
- بلوک هنگامی که سطح دشواری بالاتر است به زنجیره می پیوندد
- سپس معدنچیان مسئولیت استخراج بلوک جدید را بر عهده می گیرند و جوایز را بین خود تقسیم می کنند.
اصطلاح “نرخ هش” نیز از اینجا می آید. نرخ هش (نرخ هش) به نرخ انجام عملیات هش کردن گفته می شود. نرخ هش بالاتر به این معنی است که استخراج کنندگان برای شرکت در فرآیند استخراج به قدرت محاسبه بیشتری نیاز دارند.
نتیجه
این ما را به انتهای هش کردن ما در راهنمای عمیق رمزنگاری می رساند. ما هش کردن را به طور کامل پوشش دادیم و همچنین کد پشت آن را بررسی کردیم.
نظر شما در مورد آن چیست؟ نظر خود را در زیر وارد کنید و به ما اطلاع دهید.
# پرسش و پاسخ
هش کردن در رمزنگاری چیست?
در رمزنگاری ، هش یک روش برای تبدیل داده ها به یک رشته متن منحصر به فرد با استفاده از یک روش کارآمد است. همچنین ، هیچ محدودیتی در نوع داده یا اندازه آن وجود ندارد – هش کردن در همه آنها کار می کند.
چگونه از هش در رمزنگاری استفاده می شود?
رمزنگاری از رمزهای عبور هش به هش یا تولید شماره شناسایی منحصر به فرد استفاده می کند.