عملکرد هش کردن چیست؟ توابع هش رمزنگاری

الگوریتم های جستجو که ما در نظر گرفته ایم، معمولا بر اساس یک عمل مقایسه انتزاعی است. از این سری، روش توزیع شرح داده شده در "جداول نماد و درختان جستجوی باینری"، که در موقعیت I-th جدول ذخیره شده است، که به شما اجازه می دهد به طور مستقیم به آن مراجعه کنید. با توزیع جستجو، کلیدها به عنوان یک شاخص آرایه استفاده می شود، و نه operands از عملیات مقایسه؛ این روش بر اساس این واقعیت است که کلید ها دارای عدد صحیح متفاوت از همان محدوده به عنوان شاخص های جدول هستند. در این فصل، ما به HASHING (HASHING) نگاه خواهیم کرد - یک نسخه پیشرفته از جستجوی توزیع، که در برنامه های جستجوی معمول تر استفاده می شود، جایی که کلیدها خواص بسیار راحت ندارند. نتیجه نهایی برنامه این رویکرد این کاملا شبیه به روش های مبتنی بر مقایسه نیست - به جای حرکت از طریق ساختارهای داده فرهنگ لغت با مقایسه کلید های جستجوی کلیدی در عناصر، ما در حال تلاش برای اشاره به موارد موجود در جدول به طور مستقیم با انجام تبدیل کلید محاسبات به آدرس جدول.

الگوریتم های جستجو با استفاده از هشنگ شامل دو بخش جداگانه است. گام اول این است که محاسبه تابع هش (عملکرد هش)، که کلید جستجو را به جدول تبدیل می کند. در حالت ایده آل، کلیدهای مختلف باید در آدرس های مختلف نمایش داده شوند، اما اغلب دو یا چند کلید متفاوت می توانند همان آدرس را در جدول ارائه دهند. بنابراین، بخش دوم جستجو بر اساس روش هش کردن روند قطعنامه برخورد (رزولوشن برخورد) است که این کلیدها را پردازش می کند. در یکی از روش های حل اختلافات، که ما در این فصل در نظر می گیریم، لیست های متصل مورد استفاده قرار می گیرند، بنابراین استفاده مستقیم در شرایط پویا را پیدا می کند، زمانی که پیش بینی تعداد کلیدهای جستجو را پیش بینی می کند. در دو روش دیگر قطعنامه برخورد، به شدت به دست آمده است کارایی جستجو، از آنجا که عناصر در یک آرایه ثابت ذخیره می شوند. ما روش بهبود این روش ها را در نظر خواهیم گرفت، به شما این امکان را می دهد که از آنها استفاده کنید و در مواردی که پیش بینی می شود اندازه جدول پیش بینی شود.

هش کردن یک نمونه خوب از تعادل بین زمان و حافظه است. اگر هیچ محدودیتی در مقدار حافظه مورد استفاده وجود نداشته باشد، هر گونه جستجو را می توان با استفاده از یک دسترسی به حافظه، به سادگی با استفاده از کلید به عنوان یک آدرس حافظه، مانند توزیع جستجو انجام داد. با این حال، این مورد ایده آل معمولا غیر قابل دسترس است، زیرا کلید های طولانی ممکن است نیاز به مقدار زیادی از حافظه داشته باشند. از سوی دیگر، اگر هیچ محدودیتی وجود نداشته باشد زمان بین شروع و اتمام فرآیند تولید، با استفاده از روش جستجوی متوالی، امکان انجام حداقل حافظه وجود دارد. هش کردن راهی برای استفاده از حجم قابل قبول هر دو حافظه و زمان و دستیابی به تعادل بین این دو الزامات شدید است. به طور خاص، شما می توانید هر تعادل را پشتیبانی، به سادگی تغییر اندازه جدول، و بازنویسی کد و بدون انتخاب الگوریتم های دیگر.

هش کردن یکی از وظایف کلاسیک علوم کامپیوتر است: الگوریتم های مختلف آن به طور دقیق مورد مطالعه قرار می گیرند و به طور گسترده ای مورد استفاده قرار می گیرند. ما می بینیم که در همه فرض های سخت، شما می توانید برای پشتیبانی از عملیات برای پیدا کردن و چسباندن در جداول نماد با زمان اجرای ثابت، صرف نظر از اندازه جدول.

این مقدار مورد انتظار، بهینه عملکرد نظری بهینه برای هر پیاده سازی جدول نماد، اما هش هنوز دو دلیل اصلی نیست. اولا، زمان بین شروع و اتمام فرآیند تولید بستگی به طول کلید دارد که در برنامه های کاربردی واقعی با استفاده از کلید های طولانی می تواند قابل توجه باشد. ثانیا، هش کردن اجرای مؤثر عملیات دیگر را با جداول نماد، مانند انتخاب یا مرتب سازی ارائه نمی دهد. در این فصل، ما جزئیات این و سایر سوالات را در نظر خواهیم گرفت.

تابع هش

اول از همه، لازم است که کار محاسبه عملکرد هش را حل کنیم که کلید را به آدرس جدول تبدیل می کند. به طور معمول، پیاده سازی این محاسبات محاسباتی، پیچیدگی را نشان نمی دهد، اما هنوز لازم است مراقبت از مراقبت ها، به طوری که به مشکلات مختلف چالش های کم چالش کمک نمی کند. اگر یک جدول وجود داشته باشد که ممکن است شامل عناصر M باشد، شما نیاز به یک تابع دارید که کلید را به عدد صحیح در محدوده تبدیل می کند. عملکرد ایده آل هش باید به راحتی محاسبه شود و شبیه به یک تابع تصادفی باشد: برای هر گونه استدلال، نتایج به معنای باید معادل باشد.

تابع هش بستگی به نوع کلید دارد. به شدت صحبت کردن، یک تابع هش جداگانه نیاز به یک نوع کلید جداگانه دارد. برای افزایش بهره وری، معمولا برای جلوگیری از تبدیل به طور صریح از تبدیل انواع، تماس با ایده توجه باینری کلید در کلمه ماشین به عنوان یک عدد صحیح است که می تواند در محاسبات محاسباتی استفاده شود. هش کردن قبل از زبانهای سطح بالا ظاهر شد - در رایانه های اولیه، موضوع معمول بود که هر مقدار را به عنوان یک کلید رشته، سپس به عنوان یک عدد صحیح در نظر بگیریم. در برخی از زبان های سطح بالا، ایجاد برنامه هایی است که به ارائه کلیدها در یک کامپیوتر خاص بستگی دارد، زیرا چنین برنامه هایی اساسا وابسته به دستگاه هستند و بنابراین آنها به کامپیوتر دیگری انتقال می یابند. به طور معمول، توابع هش به فرآیند تبدیل کلیدی به عدد صحیح بستگی دارند، بنابراین، به طور همزمان به طور همزمان به استقلال و کارآیی ماشین در پیاده سازی هاشینگ کمک می کند. به عنوان یک قانون، کلیدهای عدد صحیح ساده یا کلید های نقطه شناور را می توان با استفاده از یک عملیات دستگاه تبدیل کرد، اما کلیدهای رشته و سایر انواع کلیدهای مرکب نیاز به هزینه های بالا و توجه بیشتری به کارایی دارند.

احتمالا ساده ترین وضعیت زمانی است که کلید ها عدد با نقطه شناور از محدوده ثابت هستند. به عنوان مثال، اگر کلیدها اعداد هستند، 0 و کوچکتر 1، می توان آن را به سادگی با m ضرب کرد، نتیجه را به یک عدد صحیح کوچکتر تبدیل کرد و آدرس را در محدوده بین 0 تا 1 قرار دهید. این مثال در شکل نشان داده شده است. 14.1 اگر کلیدها بیشتر از S و کمتر از T باشند، می توانند مقیاس بندی شوند، کسر S و تقسیم بر روی TS، به عنوان یک نتیجه از آنها به محدوده مقادیر بین 0 و 1، و سپس ضرب به M و دریافت می شود آدرس در جدول


شکل. 14.1

برای تبدیل عددی ها با نقطه شناور در محدوده بین 0 تا 1 به شاخص های جدول، اندازه آن 97، ضرب این اعداد توسط 97. در این مثال، سه درگیری رخ داده است: برای شاخص های برابر با 17، 53 و 76. مقادیر هش توسط بازده های کلیدی بزرگان تعیین می شود، تخلیه های جوان هر نقش ایفا نمی کنند. یکی از اهداف توسعه یک تابع هش این است که چنین عدم تعادل را از بین ببرد تا هر تخلیه در طول محاسبه در نظر گرفته شود.

اگر کلیدها عدد صحیح هستند، آنها می توانند به یک عدد نقطه شناور تبدیل شوند و به 2 W تقسیم شوند تا عدد نقطه شناور را در محدوده 0 تا 1 به دست آورید و سپس به M، به عنوان در پاراگراف قبلی ضرب شود. اگر عملیات نقطه شناور زمان زیادی را اشغال کند، و اعداد خیلی زیاد نیستند که منجر به سرریز شود، نتیجه مشابهی را می توان با استفاده از عملیات ریاضی عددی بدست آورد: شما باید کلید را به m ضرب کنید، و سپس تغییر را به راست بر روی W تخلیه به تقسیم 2 w (یا اگر ضرب منجر به سرریز، تغییر، و سپس ضرب). چنین روش هایی برای هش کردن بی فایده هستند، مگر اینکه کلیدها به طور یکنواخت توسط محدوده توزیع شوند، زیرا مقدار هش تنها توسط ارقام پیشرو کلید تعیین می شود.

ساده تر I. روش موثر برای عدد صحیح W-bit - یکی از روش های شاخرتی که اغلب استفاده شده از هش کردن - انتخاب به عنوان یک جدول اندازه کوچک یک عدد ساده و محاسبه باقی مانده از تقسیم به M، I.E. h (k) \u003d k mod m برای هر عدد صحیح k. این تابع تابع هش مدولار نامیده می شود. محاسبه بسیار آسان برای محاسبه (k٪ m در C ++)، و برای رسیدن به توزیع یکنواخت مقادیر کلیدی بین مقادیر کوچکتر M مفید است. یک مثال کوچک در شکل نشان داده شده است. 14.2


شکل. 14.2

در سه ستون سمت راست، نتیجه کلید های 7 بیتی نشان داده شده در سمت چپ با استفاده از توابع زیر نشان داده شده است:

v٪ 97 (سمت چپ)

v٪ 100 (مرکز) و

(int) (a * v)٪ 100 (راست)،

جایی که A \u003d .618033. اندازه جدول جدول برای این توابع به ترتیب 97، 100 و 100 است. مقادیر به صورت تصادفی به نظر می رسد (از آنجا که کلیدها تصادفی هستند). عملکرد دوم (v٪ 100) تنها از دو رقم راست راست از کلیدها استفاده می کند و بنابراین برای کلیدهای غیر تصادفی می تواند عملکرد کم را نشان دهد.

هشینگ مدولار به کلیدهای نقطه شناور اعمال می شود. اگر کلیدها متعلق به یک محدوده کوچک باشند، می توانند به تعداد از محدوده بین 0 تا 1، 2 W برای به دست آوردن مقادیر عدد صحیح W-bit مقیاس شوند و سپس از عملکرد هش مدولار استفاده کنید. یکی دیگر از گزینه ها این است که به سادگی از یک صفحه کلید دوتایی مدولار استفاده کنید (در صورت موجود بودن).

هشینگ مدولار در همه موارد اعمال می شود، زمانی که دسترسی به بیت هایی که کلیدها از آن استفاده می شود، صرف نظر از اینکه آیا آنها عدد صحیح هستند، نشان دهنده علامت گذاری شده توسط کلمه ماشین، دنباله ای از نمادها بسته بندی شده در کلمه ماشین، و یا توسط هر یک از دیگر نشان داده می شود گزینه احتمالی. دنباله ای از نمادهای تصادفی بسته بندی شده به کلمه ماشین دقیقا همانند کلیدهای عدد صحیح تصادفی نیست، زیرا تمام تخلیه ها برای کدگذاری استفاده نمی شود. اما هر دو این نوع (و هر نوع دیگری از کلید رمزگذاری شده به گونه ای به گونه ای که به شکل دستگاه متصل می شوند) می توان به عنوان شاخص های تصادفی در یک جدول کوچک نگاه کرد.

دلیل اصلی انتخاب به عنوان یک جدول اندازه S هش از یک عدد ساده برای هش کردن مدولار در شکل نشان داده شده است. 14.3. در این مثال، داده های نمادین با کدگذاری 7 بیتی، کلید به عنوان یک عدد با پایه 128 تفسیر می شود - یک رقم برای هر شخصیت در کلید. در حال حاضر کلمه مربوط به شماره 1816567 است، که همچنین می تواند به عنوان نوشته شده است

از آنجا که نمادهای کد ASCII N، O و W مربوط به اعداد 1568 \u003d 110، 1578 \u003d 111 و 1678 \u003d 119 است. اندازه جدول M \u003d 64 برای این نوع کلید ناموفق است، از آنجایی که به مقدار X اضافه می شود، چندین 64 (یا 128)، مقدار X MOD 64 را تغییر نمی دهد - برای هر کلید، ارزش تابع هش است ارزش 6 رقم آخر این کلید. البته، یک تابع هش خوب باید تمام تخلیه های کلیدی را به ویژه برای کلیدهای نمادین مورد توجه قرار دهد. شرایط مشابه ممکن است رخ دهد زمانی که M حاوی چند ضلعی است، که درجه 2 است. ساده ترین راه اجتناب از این - یک شماره ساده را انتخاب کنید.


شکل. 14.3.

در هر ردیف از این جدول، شما: کلمه 3 حرف، ارائه این کلمه در کد ASCII به عنوان یک شماره 21 بیتی در فرم های اکتان و اعشاری و توابع هش مدولار استاندارد برای اندازه های جداول 64 و 31 (دو ستون افراطی در سمت راست). اندازه جدول 64 منجر به نتایج نامطلوب می شود، زیرا تنها تخلیه های کلیدی راست برای به دست آوردن مقدار هش استفاده می شود و حروف به کلمات زبان معمول به طور ناهموار توزیع می شوند. به عنوان مثال، تمامی کلمات با حرف Y مربوط به مقدار هش 57 است. و برعکس، یک مقدار ساده از 31 باعث اختلافات کمتر در جدول بیش از دو برابر کوچکتر می شود.

هشیش مدولار بسیار آسان برای پیاده سازی است، به جز اینکه اندازه جدول باید یک عدد ساده باشد. برای برخی از برنامه های کاربردی، شما می توانید محتوا با یک تعداد ساده کوچک شناخته شده یا جستجو در لیستی از اعداد اول معروف به طوری که نزدیک به اندازه مورد نظر جدول است. به عنوان مثال، اعداد 2 T - 1 هستند، ساده هستند t \u003d 2، 3، 5، 7، 13، 17، 19 و 31 (و هیچ ارزش دیگری وجود ندارد< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не تنها دلیلکه در آن اندازه جدول ارزش یک عدد ساده است؛ یکی دیگر از دلایل در بخش 14.4 در نظر گرفته شده است.


شکل. 14.4

این جدول بزرگترین تعداد ساده کوچکتر از 2 نان است، زیرا می تواند برای توزیع جدول پویا هش استفاده شود، زمانی که لازم است اندازه جدول یک عدد ساده باشد. برای هر مقدار مثبت داده شده در محدوده پوشش داده شده، این جدول می تواند مورد استفاده قرار گیرد برای تعیین یک عدد ساده که از آن کمتر از 2 بار متفاوت است.

یکی دیگر از تجسم کلیدهای INTEGER ترکیبی از روش های چندگانه و مدولار است: شما باید کلید را به ثابت در محدوده بین 0 و 1 افزایش دهید، و سپس بخش Module M. به عبارت دیگر، باید از تابع استفاده کنید. بین مقادیر، متر و پایه موثر سیستم شماره کلیدی، رابطه ای وجود دارد که از لحاظ نظری می تواند منجر به رفتار غیرمعمول شود، اما اگر از یک مقدار دلخواه استفاده می کنید، در ضمیمه واقعی بعید است که هیچ مشکلی داشته باشید. اغلب، به عنوان یک، مقدار f \u003d 0.618033 ... (بخش طلایی) انتخاب شده است.

بسیاری از تغییرات دیگر در این موضوع مورد مطالعه قرار گرفته اند، به ویژه توابع هش که می توانند با استفاده از دستورالعمل های دستگاه کارآمد مانند انتخاب تغییر و ماسک (به لینک ها مراجعه کنند) مورد استفاده قرار می گیرند.

در بسیاری از برنامه های کاربردی که از جداول نماد استفاده می کنند، کلیدها اعداد نیستند و لزوما کوتاه نیستند؛ اغلب خطوط الفبایی هستند که می توانند بسیار طولانی باشند. خوب، چگونگی محاسبه عملکرد هش برای یک کلمه به عنوان Averylongkey؟

در کد 7 بیتی ASCII، این کلمه مربوط به شماره 84 بیتی \\ begin (align *) 97 \\ cdot 128 ^ (11) و + 118 \\ cdot 128 ^ (10) + 101 \\ cdot 128 ^ (9) + 114 \\ CDOT 128 ^ (8) + 121 \\ CDOT 128 ^ (7) \\\\ & + 108 \\ CDOT 128 ^ (6) + 111 \\ CDOT 128 ^ (5) + 110 \\ CDOT 128 ^ (4) + 103 \\\\ cdot 128 ^ (3) \\\\ & + 107 \\ cdot 128 ^ (2) + 101 \\ cdot 128 ^ (1) + 121 \\ cdot 128 ^ (0)، \\ end (align *)

که بیش از حد بزرگ است به طوری که توابع حساب های معمول را می توان با آن در اکثر کامپیوترها انجام می شود. و اغلب لازم است که کلید های بسیار طولانی را اداره کند.

برای محاسبه عملکرد هش مدولار برای کلیدهای طولانی، آنها به یک قطعه در هر قطعه تبدیل می شوند. شما می توانید از خواص محاسباتی تابع ماژول استفاده کنید و از الگوریتم Gorner استفاده کنید (به بخش 4.9 "نوع داده های انتزاعی را ببینید"). این روش بر اساس روش دیگری برای ضبط اعداد مربوط به کلیدها است. برای مثال مورد توجه، ما عبارت زیر را بنویسیم: \\ شروع (align *) (((((((((((((97 / CDOT 128 ^ (11) و + 118) \\ cdot 128 ^ (10) + 101) \\ cdot 128 ^ (9) + 114) \\ cdot 128 ^ (8) + 121) \\ cdot 128 ^ (7) \\\\ & + 108) \\ cdot 128 ^ (6) + 111) \\ cdot 128 ^ (5) + 110) \\ CDOT 128 ^ (4) + 103) \\ cdot 128 ^ (3) \\\\ & + 107) \\ cdot 128 ^ (2) + 101) \\ cdot 128 ^ (1) + 121. \\ end (align *)

به عبارت دیگر، یک عدد دهدهی مربوط به رمزگذاری کاراکتر رشته می تواند زمانی که آن را از چپ به راست مشاهده کرد، محاسبه کنید، مقدار انباشته شده به 128 را ضرب کنید و سپس مقدار کد نماد بعدی را اضافه کنید. در مورد یک رشته طولانی، این روش محاسبه در نهایت منجر به یک بزرگ بزرگ می شود که می تواند در تمام کامپیوتر ارائه شود. با این حال، این تعداد ضروری نیست، زیرا تنها (کوچک) باقی مانده از بخش آن بر روی M مورد نیاز است. نتیجه می تواند به دست آید، بدون حتی حفظ ارزش انباشته، زیرا در هر زمان، محاسبات را می توان با چند بار متولد می شود - هر بار که شما ضرب و افزایشی را انجام می دهید، لازم است که فقط باقی مانده از ماژول بخش M را ذخیره کنید. نتیجه همانند اگر ما توانایی محاسبه را داشته باشیم یک شماره طولانی و سپس بخش را انجام دهید (نگاه کنید به ورزش 14.10). این مشاهدات منجر به یک روش محاسباتی مستقیم برای محاسبه توابع هش مدولار برای خطوط طولانی می شود - برنامه 14.1 را ببینید. این برنامه از یک دیگر استفاده می کند، آخرین گره: به جای پایه 128، از شماره 127 ساده استفاده می کند. دلیل این تغییر در پاراگراف بعدی در نظر گرفته شده است.

راه های بسیاری برای محاسبه توابع هش تقریبا با هزینه های مشابه برای هشینگ مدولار با استفاده از روش Gorner (یک یا دو یا دو عملیات ریاضی برای هر نماد در کلید). برای کلیدهای تصادفی، این روش ها عملا از یکدیگر متفاوت نیستند، اما کلیدهای واقعی به ندرت تصادفی هستند. احتمال هزینه های کم هزینه های کم برای دادن کلیدهای واقعی، منجر به بررسی الگوریتم های هشیشای تصادفی می شود، زیرا ما نیاز به توابع هش داریم که شاخص های جدول تصادفی را بدون توجه به توزیع کلیدی ایجاد می کنند. دشوار نیست که سازماندهی تصادفی را سازماندهی کند، زیرا لازم نیست به معنای واقعی کلمه به تعریف هشیش مدولار پایبند باشد - فقط برای محاسبه تعداد کل کوچکتر M، تمام تخلیه های کلیدی مورد استفاده قرار گرفت.

m \u003d 96 و a \u003d 128 (در بالای صفحه)

m \u003d 97 و a \u003d 128 (مرکز) و

m \u003d 96 و a \u003d 127 (در زیر)

توزیع ناهموار در اولین مورد، نتیجه استفاده ناهموار نامه ها و حفظ ناهموار به علت این واقعیت است که اندازه جدول و ضریب چندگانه 32. دو نمونه دیگر به صورت تصادفی به نظر می رسد، از آنجا که اندازه جدول و ضریب تعداد دو طرفه ساده هستند.

برنامه 14.1 یکی از راه های انجام این کار را نشان می دهد: استفاده از یک پایه ساده به جای درجه 2 و یک عدد صحیح مربوط به نمایندگی ASCII از رشته. در شکل 14.5 شکل. 14.5 نشان داده شده است که چگونه این تغییر توزیع را برای کلیدهای رشته معمولی بهبود می بخشد. مقادیر تئوری هش ایجاد شده توسط برنامه 14.1 می تواند نتایج بدی را برای اندازه های جدول که متعدد 127 باشد (اگر چه در عمل احتمالا تقریبا غیر قابل تشخیص است)؛ برای ایجاد یک الگوریتم تصادفی، می توان مقدار ضریب را به صورت تصادفی انتخاب کرد. یک رویکرد کارآمدتر، استفاده از مقادیر تصادفی ضرایب در محاسبه و مقادیر تصادفی مختلف برای هر شماره کلیدی است. این رویکرد یک الگوریتم تصادفی به نام Hashing Universal (Hashing Universal) می دهد.

از لحاظ تئوری، تابع هش ایده آل جهانی یک تابع است که احتمال برخورد بین دو کلید مختلف در یک جدول با ابعاد M دقیقا برابر با 1 / متر است. می توان ثابت کرد که استفاده به عنوان یک ضریب A در برنامه 14.1 مقدار دلخواه خود را ثابت نمی کند، و توالی مقادیر تصادفی تصادفی، هش مدولار را به یک تابع هش جهانی تبدیل می کند. با این حال، هزینه تولید یک عدد تصادفی جدید برای هر نماد در کلید معمولا غیر قابل قبول است. در عمل، امکان دستیابی به مصالحه ای که در برنامه 14.1 نشان داده شده است، بدون نگه داشتن آرایه ای از اعداد تصادفی مختلف برای هر نماد کلیدی، و تغییر ضرایب با استفاده از نسل یک توالی شبه تصادفی ساده، امکان پذیر است.

ما خلاصه خواهیم کرد: برای پیاده سازی یک جدول کاراکتر انتزاعی برای استفاده از هش کردن، ابتدا باید رابط نوع انتزاعی را گسترش دهید، آن را در عملیات هش قرار دهید، که کلید های اعداد صحیح غیر منفی را نشان می دهد، اندازه جدول کوچکتر M.

به عنوان بخشی از این مقاله، به شما خواهم گفت هش چیست؟چرا لازم است، جایی که و چگونه از آن استفاده می شود، و همچنین نمونه های شناخته شده ترین.

چالش های بسیاری در زمینه فناوری اطلاعات برای حجم داده ها بسیار مهم است. به عنوان مثال، اگر شما نیاز به مقایسه دو فایل با اندازه 1 کیلوبایت و دو فایل از 10 گیگابایت دارید، آن زمان کاملا متفاوت است. بنابراین، الگوریتم هایی که اجازه می دهند با ارزش های کوتاه تر و فدرال کار کنند بسیار محبوب هستند.

یکی از این فن آوری ها هشنگی است، که هنگام حل جرم وظایف، استفاده از آن را پیدا کرده است. اما، من فکر می کنم شما، به عنوان یک کاربر عادی، هنوز غیر قابل درک است، چه نوع جانور برای آنچه که نیاز دارد. بنابراین، من سعی خواهم کرد تمام ساده ترین کلمات را توضیح دهم.

توجه داشته باشید: مواد برای کاربران معمولی طراحی شده اند و شامل بسیاری از جنبه های فنی نیستند، اما برای آشنایی اولیه از آن بیش از اندازه کافی نیست.

هش یا هش کردن چیست؟

من با شرایط شروع خواهم کرد.

تابع هش، عملکرد کنفرانس - این یک ویژگی خاص است که به شما اجازه می دهد تا متون طول دلخواه را به یک کد طول ثابت تبدیل کنید (معمولا رکورد دیجیتال کوتاه).

هش کردن - این روند تحول متون منبع است.

هش، کد هش، ارزش هش، هش مجموع - این مقدار خروجی تابع هش است، یعنی بلوک نتیجه طول ثابت است.

همانطور که می بینید، اصطلاحات یک توضیح چند شکل دارد که از آن دشوار است که بدانیم چرا لازم است. بنابراین، من بلافاصله یک نمونه کوچک را ارائه می دهم (در مورد برنامه های دیگر کمی بعدا می گوید). فرض کنید شما 2 فایل 10 گیگابایت دارید. چگونه می توانید به سرعت پیدا کنید که کدام یک نیاز دارد؟ شما می توانید نام فایل را استفاده کنید، اما تغییر نام آن آسان است. شما می توانید تاریخ را تماشا کنید، اما پس از کپی کردن فایل های فایل ممکن است یکسان یا در توالی های دیگر باشد. اندازه، چگونگی درک آن، کمی می تواند کمک کند (به ویژه اگر ابعاد همزمان باشد یا به مقادیر دقیق بایت نگاه نکنید).

در اینجا این است که شما به این بسیار هش نیاز دارید، که یک بلوک کوتاه است که از متن منبع فایل تولید می شود. این دو فایل 10 گیگابایت دارای دو کد هش متفاوت، اما کوتاه (چیزی شبیه به "ACCAC43535" و "BBB3232A42") خواهد بود. با استفاده از آنها، شما می توانید به سرعت متوجه شوید فایل مورد نظرحتی پس از کپی کردن و تغییر نام.

توجه داشته باشید: با توجه به این واقعیت که هش در کامپیوتر جهان و در اینترنت یک مفهوم بسیار شناخته شده است، اغلب همه چیز مربوط به هش است، به این کلمه بسیار کاهش می یابد. به عنوان مثال، عبارت "من از هش MD5" در ترجمه به این معنی است که در سایت یا جایی دیگر توسط الگوریتم هش کردن استاندارد MD5 استفاده می شود.

خواص هش

در حال حاضر، من به شما در مورد خواص توابع هش به شما می گویم، به طوری که شما برای درک جایی که استفاده می شود و برای آنچه شما نیاز دارید، آسان تر است. اما اولین تعریف دیگر.

برخورد - این وضعیت زمانی است که مقدار یک و همان مقدار هش برای دو متن مختلف به دست می آید. همانطور که می دانید، هنگامی که یک بلوک طول ثابت، تعداد محدودی از مقادیر احتمالی دارد و بنابراین تکرار امکان پذیر است.

و اکنون به خواص توابع هش:

1. متن را می توان به متن هر اندازه عرضه کرد، و خروجی یک بلوک داده ثابت ثابت است. این از تعریف پیروی می کند.

2. مجموع هش از همان متون باید یکسان باشد. در غیر این صورت، چنین توابع به سادگی بی فایده هستند - این شبیه به یک عدد تصادفی است.

3. یک تابع اتصال خوب باید توزیع خوبی داشته باشد. به این ترتیب که اگر اندازه هش خروجی، به عنوان مثال، 16 بایت است، پس اگر این تابع تنها 3 مقادیر مختلف را برای هر متنی بازبینی کند، پس هیچ تأثیری بر چنین عملکرد و این 16 بایت (16 بایت 2 ^ 128 گزینه ها، که تقریبا 3، 4 * 10 ^ 38 درجه است).

4. چگونه عملکرد به کوچکترین تغییرات در متن منبع پاسخ می دهد. یک مثال ساده 1 حرف را در یک فایل 10 گیگابایتی تغییر داد، مقدار تابع باید متفاوت باشد. اگر چنین نیست، پس از آن بسیار مشکل است که چنین عملکرد را اعمال کنید.

5. احتمال وقوع برخورد. یک پارامتر بسیار پیچیده محاسبه شده تحت شرایط خاص. اما، ماهیت او این است که چه نقطه ای از عملکرد هش است، اگر مجموع هش ناشی از آن اغلب هماهنگ باشد.

6. نرخ محاسبه هاها. در صورتی که برای مدت زمان طولانی محاسبه شود، از عملکرد کنفرانس بسیار زیاد است؟ نه، چون پس از آن فایل ها به راحتی قابل مقایسه یا استفاده از رویکرد دیگری هستند.

7. پیچیدگی بازگرداندن داده های منبع از مقدار هش. این ویژگی مشخص تر از کل است، زیرا در همه جا ضروری نیست. با این حال، برای الگوریتم های معروف ترین، این ویژگی ارزیابی می شود. به عنوان مثال، فایل منبع شما به سختی می توانید از این تابع دریافت کنید. با این حال، اگر مشکل برخورد صورت گیرد (به عنوان مثال، شما باید هر متن را پیدا کنید که مربوط به چنین هش است)، پس این ویژگی ممکن است مهم باشد. به عنوان مثال، کلمه عبور، اما کمی بعد.

8. کد منبع باز یا بسته شده برای چنین کارکردی. اگر کد باز نباشد، پیچیدگی بازیابی اطلاعات، یعنی رمزنگاری، در مورد مسئله باقی می ماند. بخشی از این، این یک مشکل با رمزگذاری است.

حالا شما می توانید به سوال بروید "و چرا این همه؟"

چرا به هش نیاز دارید؟

اهداف اصلی توابع هش تنها سه (یا هدف آنها) هستند.

1. یکپارچگی داده ها را بررسی کنید. که در این مورد همه چیز ساده است، چنین تابع باید به سرعت محاسبه شود و به شما اجازه می دهد تا به سرعت بررسی کنید، به عنوان مثال، فایل دریافت شده از اینترنت در طول انتقال آسیب دیده بود.

2. افزایش سرعت جستجوی داده ها. اندازه بلوک ثابت اجازه می دهد تا شما را به مزایای بسیاری در حل وظایف جستجو. در این مورد، ما در مورد آنچه که صرفا فنی است صحبت می کنیم، استفاده از توابع هش می تواند تاثیر مثبتی بر عملکرد داشته باشد. برای چنین توابع، احتمال برخورد و توزیع خوب بسیار مهم است.

3. برای نیازهای رمزنگاری. این گونه توابع کانولوشن در زمینه های امنیتی مورد استفاده قرار می گیرند، جایی که مهم است که نتایج به جای جایگزینی و یا جایی که لازم است که وظیفه به دست آوردن تا حد ممکن را حل کند، دشوار است. اطلاعات مفید از هش

کجا و چگونه هش اعمال می شود؟

همانطور که احتمالا قبلا حدس زده اید، هش در هنگام حل وظایف بسیار زیاد اعمال می شود. در اینجا برخی از آنها هستند:

1. کلمه عبور معمولا در فرم باز ذخیره نمی شود، بلکه به شکل مبالغ هش، که اجازه می دهد تا اطمینان از درجه بالاتر از امنیت. پس از همه، حتی اگر مهاجم دسترسی به چنین پایگاه داده ای دریافت کند، هنوز هم باید زمان زیادی را صرف انتخاب متون مناسب برای این کدهای هش داشته باشد. در اینجا مشخصه "پیچیدگی بازگرداندن داده های اولیه از ارزش های هش" است.

توجه داشته باشید: من به شما توصیه می کنم با چند نکته برای بهبود امنیت رمزهای عبور، با مقاله آشنا شوید.

2. در برنامه نویسی، از جمله پایگاه های داده. البته، اغلب ما در مورد ساختارهای داده ای که اجازه می دهیم صحبت می کنیم جستجوی سریع. جنبه فنی خالص

3. هنگامی که داده های انتقال داده ها (از جمله اینترنت). بسیاری از پروتکل ها مانند TCP / IP عبارتند از زمینه های بررسی ویژه حاوی مقدار هش از پیام منبع به طوری که اگر یک شکست در جایی رخ داده است، آن را بر انتقال داده تاثیر نمی گذارد.

4. برای الگوریتم های مختلف ایمنی مرتبط. به عنوان مثال، هش در امضاهای دیجیتال الکترونیکی استفاده می شود.

5. برای تأیید یکپارچگی فایل ها. اگر شما توجه کردید، اغلب ممکن است به فایل های موجود در اینترنت (به عنوان مثال، بایگانی ها) شرح های اضافی با کد هش این اندازه گیری نه تنها به طوری که شما به طور تصادفی فایل را اجرا نمی کنید که در هنگام دانلود از اینترنت آسیب دیده است، بلکه سادگی میزبانی وجود دارد. در چنین مواردی، شما می توانید به سرعت هش را بررسی کنید و در صورت لزوم، فایل را بیش از حد اضافه کنید.

6. گاهی اوقات، توابع هش برای ایجاد شناسه های منحصر به فرد (به عنوان بخشی) استفاده می شود. به عنوان مثال، هنگام صرفه جویی در تصاویر و یا به سادگی فایل ها، شما معمولا از هش در نام ها همراه با تاریخ و زمان استفاده می کنید. این به شما اجازه می دهد تا فایل ها را با همان نام بازنویسی نکنید.

در واقع، دورتر، اغلب توابع هش در آن استفاده می شود فناوری اطلاعات. به طور عمده به دلیل این واقعیت است که مقدار داده ها و قدرت بیشتر کامپیوترهای ساده به شدت رشد کرد در مورد اول، ما بیشتر در مورد جستجو هستیم، و در دوم ما بیشتر در مورد مسائل امنیتی هستیم.

توابع هش معروف

معروف ترین سه تابع هش زیر است.

حاشیه نویسی: در این سخنرانی، مفهوم تابع هش فرموله شده است، و همچنین بررسی کوتاه الگوریتم برای تشکیل توابع هش. علاوه بر این، امکان استفاده از الگوریتم های بلوک برای رمزگذاری برای ایجاد یک تابع هش در نظر گرفته شده است.

هدف از سخنرانی: برای آشنا شدن با مفهوم "تابع هش"، و همچنین با اصول چنین توابع.

مفهوم تابع هش

عملکرد هش (عملکرد هش) یک تابع ریاضی یا دیگر نامیده می شود، که برای خطوط طول دلخواه، برخی از عدد صحیح یا رشته دیگری از طول ثابت را محاسبه می کند. ریاضی، می توان آن را مانند این نوشته شده است:

جایی که M پیام اصلی است که گاهی اوقات نامیده می شود حاضر، و h - نتیجه به نام عملکرد هش (و همچنین کد هش یا پیام هضم (از انگلیسی. پیام هضم)).

معنای عملکرد هش، تعیین ویژگی مشخصه نمونه است - معنای عملکرد هش. این مقدار معمولا یک اندازه ثابت ثابت دارد، به عنوان مثال، 64 یا 128 بیت. کد هش ممکن است برای حل هر کاری بیشتر تحلیل شود. به عنوان مثال، هش کردن می تواند برای مقایسه داده ها مورد استفاده قرار گیرد: اگر دو کد هش متفاوت باشند، آرایه ها تضمین شده اند؛ اگر همان - آرایه ها به احتمال زیاد یکسان هستند. به طور کلی، مکاتبات یکپارچه بین داده های منبع و کد هش به دلیل این واقعیت است که تعداد توابع هش همیشه کمتر از گزینه های ورودی است. بنابراین، بسیاری از پیام های ورودی وجود دارد که به همان کد هش می دهند (چنین شرایطی نامیده می شود کلوخه) احتمال وقوع برخورد ها نقش مهمی در ارزیابی کیفیت توابع هش دارد.

توابع هش به طور گسترده ای در رمزنگاری مدرن استفاده می شود.

ساده ترین تابع هش را می توان با استفاده از عملیات "مجموع ماژول 2" به صورت زیر تهیه کرد: ما رشته ورودی را به دست می آوریم، ما تمام بایت ها را با استفاده از ماژول 2 و نتیجه نتیجه بایت به عنوان هش فوچر می کنیم. طول عملکرد هش در این مورد 8 بیت صرف نظر از اندازه پیام ورودی خواهد بود.

به عنوان مثال، اجازه دهید پیام اصلی به نمای دیجیتال ترجمه شود، زیر (در فرمت هگزادسیمال):

ما پیام را به نگاه باینری انتقال خواهیم داد، بایت ها را به یکدیگر بنویسید و بیت ها را در هر ستون توسط ماژول 2 قرار دهید:

0011 1110 0101 0100 1010 0000 0001 1111 1101 0100 ---------- 0110 0101

نتیجه (0110 0101 (2) یا 65 (16)) و ارزش تابع هش خواهد بود.

با این حال، چنین عملکرد هش را نمی توان برای اهداف رمزنگاری استفاده کرد، به عنوان مثال برای تشکیل امضای الکترونیکاز آنجایی که محتوای پیام امضا شده را بدون تغییر ارزش های چکمه آسان تغییر دهید، آسان است.

بنابراین، عملکرد هش در نظر گرفته شده برای برنامه های رمزنگاری مناسب نیست. در رمزنگاری، عملکرد هش خوب است اگر دشوار است برای ایجاد دو نوع با همان عملکرد هش، و همچنین اگر خروجی تابع به صراحت وابسته به ورودی نیست.

ما الزامات اساسی برای توابع هش رمزنگاری را تشکیل می دهیم:

  • تابع هش باید به یک پیام از هر اندازه قابل استفاده باشد؛
  • محاسبه مقدار تابع باید به اندازه کافی سریع انجام شود؛
  • با یک تابع هش شناخته شده، باید برای پیدا کردن یک نمونه اولیه مناسب، دشوار باشد (تقریبا غیرممکن)
  • با یک پیام شناخته شده، M باید سخت باشد برای پیدا کردن یک پیام دیگر M با همان مقدار از عملکرد هش، مانند پیام منبع؛
  • برای پیدا کردن هر جفت پیام های تصادفی تصادفی با همان تابع هش دشوار است.

یک تابع هش ایجاد کنید که مطابق تمام الزامات ذکر شده کار آسان نیست. همچنین لازم است به یاد داشته باشید که عملکرد تابع بر روی عملکرد اندازه دلخواه دریافت می شود و نتیجه هش نباید به همان اندازه برای این اندازه های مختلف مشابه باشد.

در حال حاضر، در عمل، عملکرد پردازش پیام ورودی به عنوان توابع هش استفاده می شود، و مقدار هش محاسبه H I برای هر بلوک M از پیام ورودی در وابستگی نوع

h i \u003d h (m i، h i-1)

جایی که H I-1 نتیجه ای است که در هنگام محاسبه عملکرد هش به دست آمده است بلوک قبلی داده های ورودی.

در نتیجه، عملکرد تابع هش H N یک تابع از تمام بلوک های ورودی N است.

استفاده از رمزگذاری الگوریتم های بلوک برای تشکیل یک تابع هش

شما می توانید از یک بلوک به عنوان یک تابع هش استفاده کنید. اگر بلوک های مورد استفاده توسط الگوریتم بلوک رمزنگاری، پس از آن عملکرد هش بر اساس آن قابل اعتماد خواهد بود.

ساده ترین راه استفاده از یک الگوریتم بلوک برای به دست آوردن کد هش، رمزگذاری پیام در حالت CBC است. در این مورد، پیام به عنوان توالی بلوک هایی که طول آن برابر با طول بلوک الگوریتم رمزگذاری است، نشان داده شده است. در صورت لزوم، آخرین واحد به صفر های راست تکمیل می شود، به طوری که واحد طول مورد نظر است. هش آخرین بلوک متن رمزگذاری شده خواهد بود. با توجه به استفاده از یک الگوریتم رمزنگاری بلوک قابل اعتماد، مقدار هش حاصل از آن ویژگی های زیر را دارد:

  • تقریبا غیر ممکن است بدون دانستن محاسبه کلید رمزگذاری ارزش های هش برای یک آرایه باز داده شده از اطلاعات؛
  • عملا غیر ممکن است بدون شناخت کلید رمزنگاری از داده های باز تحت ارزش هش مشخص شده غیر ممکن باشد.

مقدار Houshing به این ترتیب معمولا نامیده می شود imitovka یا تصدیق کننده و برای بررسی یکپارچگی پیام استفاده می شود. بنابراین، شبیه ساز یک ترکیب کنترل است که به داده های باز و اطلاعات کلیدی مخفی بستگی دارد. هدف از استفاده از Imitovka این است که تشخیص تمام تغییرات تصادفی یا عمدی در آرایه اطلاعات. مقدار به دست آمده از عملکرد هش هنگام پردازش پیام ورودی به پیام در لحظه ای که شناخته شده است، پیام صحیح است. گیرنده یکپارچگی پیام را با محاسبه تقلید از پیام دریافت شده بررسی می کند و آن را با کد هش حاصل می شود که باید به صورت ایمن منتقل شود. یکی از آنها راه های ایمن شاید رمزگذاری Imitovka کلید بسته شده فرستنده، I.E. ایجاد یک امضا همچنین ممکن است الگوریتم کد هش به دست آمده برای رمزگذاری متقارن را رمزگذاری کند، اگر فرستنده و گیرنده دارای کلید کلی رمزنگاری متقارن باشند.

فرآیند مشخص شده به دست آوردن و استفاده از Imitovka در استاندارد داخلی GOST 28147-89 شرح داده شده است. استاندارد ارائه می دهد برای استفاده از 32 بیت جوان از بلوک به دست آمده در خروجی عملیات رمزگذاری کل پیام در حالت کلاچ بلوک رمز برای نظارت بر یکپارچگی پیام فرستاده شده است. به همان شیوه، هر بلوک را می توان برای تولید imitavka استفاده کرد الگوریتم رمزنگاری متقارن.

یکی دیگر از راه های ممکن برای استفاده از یک رمز عبور برای تولید یک کد هش، زیر است. پیام منبع در بلوک های سری پردازش می شود. آخرین بلوک، در صورت لزوم، توسط صفر تکمیل می شود، گاهی اوقات در آخرین بلوک شما طول پیام را در فرم مشخص می کنید اعداد دودویی. در هر مرحله، مقدار هش را که در مرحله قبلی به دست آمده، رمزگذاری می شود، با توجه به بلوک پیام فعلی به عنوان کلید. آخرین مقدار رمزگذاری شده وارد شده، هش نهایی خواهد بود.

در حقیقت، چندین طرح دیگر برای استفاده از یک رمزنگاری بلوک برای ایجاد یک تابع هش. اجازه دهید m یک واحد بلوک منبع باشد، سلام - ارزش تابع هش در مرحله I-Level، F یک بلوک از الگوریتم رمزنگاری است که در حالت جایگزینی ساده استفاده می شود - عملیات اضافه شده از ماژول 2. سپس امکان پذیر است به عنوان مثال، طرح های تشکیل تابع هش زیر:

در تمام این نمودارها، طول مقدار هش تولید شده برابر طول بلوک در طول رمزگذاری است. همه اینها، و همچنین برخی از طرح های دیگر برای استفاده از الگوریتم بلوک برای رمزگذاری برای محاسبه مقادیر هش می تواند در عمل استفاده شود.

معایب اصلی توابع هش طراحی شده بر اساس الگوریتم های بلوک نسبتا سرعت کم کار کن رمزنگاری مورد نیاز نیز می تواند برای تعداد کمی از عملیات بر روی داده های ورودی تضمین شود. الگوریتم های هاس سریع تر وجود دارد که به طور مستقل از خراش طراحی شده اند، بر اساس الزامات مقاومت مرموز (شایع ترین آنها - MD5، SHA-1، SHA-2 و GOST R 34.11-94).


هش چیست؟تابع هش به نام تحول ریاضی اطلاعات در یک رشته کوتاه کوتاه، خاص است.

چرا شما به آن نیاز دارید؟تجزیه و تحلیل با استفاده از توابع هش اغلب برای نظارت بر یکپارچگی فایل های مهم استفاده می شود. سیستم عامل، برنامه های مهم، داده های مهم. کنترل را می توان هر دو به صورت مورد نیاز و به صورت منظم انجام داد.

چگونه انجام می شود؟در ابتدا، تعیین کنید که یکپارچگی کدام فایل ها باید نظارت شود. برای هر فایل، محاسبه شده است برای محاسبه مقدار هش خود را بیش از یک الگوریتم ویژه در حالی که حفظ نتیجه. پس از زمان مورد نیاز، محاسبه مشابهی انجام می شود و نتایج مقایسه می شود. اگر مقادیر متفاوت باشد، به این معنی است که اطلاعات موجود در فایل تغییر کرده است.

چه ویژگی هایی باید عملکرد هش داشته باشند؟

  • باید بتواند تحولات داده های دلخواه خود را ثابت کند؛
  • باید یک الگوریتم باز داشته باشد تا رمزنگاری آن را مورد بررسی قرار دهد؛
  • باید یک طرفه باشد، یعنی، با تعیین داده های منبع، هیچ قابلیت ریاضی وجود ندارد.
  • باید "مقاومت" درگیری ها، یعنی، این نباید مقادیر مشابه با داده های مختلف ورودی را ارائه دهد؛
  • نباید نیاز به منابع محاسباتی بزرگ داشته باشد؛
  • با کوچکترین تغییر در داده های ورودی، نتیجه باید به طور قابل توجهی تغییر کند.

الگوریتم های هش کردن محبوب چیست؟توابع هش زیر در حال حاضر استفاده می شود:

  • CRC - کد اضافی چرخه یا چکمه. الگوریتم بسیار ساده است، دارای تعداد زیادی از تغییرات بسته به طول خروجی مورد نیاز. رمزنگاری نیست!
  • MD 5 یک الگوریتم بسیار محبوب است. مثل او نسخه پیشین MD 4 یک تابع رمزنگاری است. اندازه Hesha 128 بیت.
  • SHA -1 همچنین بسیار محبوب رمزنگاری است. اندازه Hesha 160 بیت.
  • GOST R 34.11-94 - استاندارد رمزنگاری روسی برای محاسبه توابع هش. اندازه Hesha 256 بیت.

چه زمانی می توان این الگوریتم ها از یک مدیر سیستم استفاده می کنند؟اغلب هنگام بارگیری هر محتوایی، مانند برنامه های تولید کننده، موسیقی، فیلم ها یا سایر اطلاعات موجود است. مبالغ کنترلمحاسبه شده با توجه به یک الگوریتم خاص. به دلایل ایمنی، پس از دانلود، لازم است که محاسبه مستقل عملکرد هش را انجام دهیم و ارزش را با آنچه که در وب سایت یا برنامه به فایل نشان داده شده، مقایسه کنیم. آیا تا به حال این کار را انجام دادید؟

چه چیزی راحت تر برای شمارش هش؟در حال حاضر تعداد زیادی از خدمات مشابه از هر دو پرداخت شده و رایگان برای استفاده وجود دارد. من شخصا حستاب را دوست داشتم اول، ابزار در هنگام نصب در قالب یک برگه به \u200b\u200bخواص فایل ها تعبیه شده است، دوم، به شما اجازه می دهد تا تعداد زیادی از الگوریتم های هش را انتخاب کنید، و ثالث برای استفاده شخصی غیر تجاری رایگان است.

روسی چیست؟همانطور که در بالا ذکر شد، استاندارد Hashing GOST R 34.11-94 وجود دارد که در همه جا در بسیاری از تولید کنندگان ابزار امنیتی اطلاعات استفاده می شود. یکی از این وجوه برنامه تثبیت و کنترل وضعیت اصلی است. بسته نرم افزاری "ثابت". این برنامه وسیله ای برای کنترل اثربخشی استفاده از SZI است.

FIX (نسخه 2.0.1) برای ویندوز 9x / nt / 2000 / xp

  • چک کردن چک های فایل های مشخص شده توسط یکی از 5 الگوریتم اجرا شده را محاسبه کنید.
  • تثبیت و کنترل بعدی وضعیت اصلی بسته نرم افزاری.
  • مقایسه نسخه های بسته نرم افزاری.
  • تثبیت و کنترل کاتالوگ ها.
  • نظارت بر تغییرات در فایل های مشخص شده (دایرکتوری ها).
  • تشکیل گزارش ها در فرمت های TXT، HTML، SV.
  • این محصول دارای گواهینامه FSTEC در NDV 3 شماره 913 تا ژوئن 1 تا 1 ژوئن 2013 است.

و چگونه در مورد EDS؟نتیجه محاسبه عملکرد همراه با کلید مخفی کاربر وارد ورودی الگوریتم رمزنگاری می شود، جایی که امضای دیجیتال الکترونیکی محاسبه می شود. به طور دقیق، عملکرد هش بخشی از الگوریتم EDS نیست، اما اغلب این به طور خاص انجام می شود، به منظور حذف حمله با استفاده از کلید عمومی.

در حال حاضر، بسیاری از برنامه های تجارت الکترونیک به شما این امکان را می دهند که کلید مخفی کاربر را در منطقه بسته بندی شده بسته (Rutoken، Etoken) ذخیره کنید بدون توانایی فنی آن از آنجا. خود نشانه دارای یک منطقه بسیار محدود حافظه است که در کیلوبایت اندازه گیری می شود. برای امضای سند امکان انتقال سند به خود نشانه وجود ندارد، بلکه انتقال هش سند به نشانه و در خروج برای دریافت EDS بسیار ساده است.

سوالات:

1. مفهوم عملکرد هش.

2. از الگوریتم های بلوک برای رمزگذاری استفاده کنید تا یک تابع هش را تشکیل دهید.

3. بررسی الگوریتم ها برای تشکیل توابع هش.

1. مفهوم تابع هش

تابع هش(عملکرد هش) یک تابع ریاضی یا دیگر نامیده می شود، که برای خطوط طول دلخواه، برخی از عدد صحیح یا یک رشته دیگر از طول ثابت را محاسبه می کند. ریاضی، می توان آن را مانند این نوشته شده است:

h. \u003d h (m) ,

جایی که M. - پیام منبع به نام گاهی اوقات حاضر ، ولی h. - نتیجه به عنوان مقدار تابع هش (و همچنین کد هش یا پیام هضم (از انگلیسی. پیام هضم)).

معنای عملکرد هش، تعیین ویژگی مشخصه نمونه است - معنای عملکرد هش. این مقدار معمولا یک اندازه ثابت ثابت دارد، به عنوان مثال، 64 یا 128 بیت. کد هش ممکن است برای حل هر کاری بیشتر تحلیل شود. به عنوان مثال، هش کردن می تواند برای مقایسه داده ها مورد استفاده قرار گیرد: اگر دو کد هش متفاوت باشند، آرایه ها تضمین شده اند؛ اگر همان - آرایه ها به احتمال زیاد یکسان هستند. به طور کلی، مکاتبات یکپارچه بین داده های منبع و کد هش به دلیل این واقعیت است که تعداد توابع هش همیشه کمتر از گزینه های ورودی است. بنابراین، بسیاری از پیام های ورودی وجود دارد که به همان کد هش می دهند (چنین شرایطی نامیده می شود کلوخه ) احتمال وقوع برخورد ها نقش مهمی در ارزیابی کیفیت توابع هش دارد.

توابع هش به طور گسترده ای در رمزنگاری مدرن استفاده می شود.

ساده ترین تابع هش را می توان با استفاده از "مجموع عملیات ماژول 2" به صورت زیر کامپایل کرد: ما رشته ورودی را به دست می آوریم، ما تمام بایت ها را با استفاده از ماژول 2 و نتیجه نتیجه بایت به عنوان مقدار هش Fuch به دست می آوریم. طول عملکرد هش در این مورد 8 بیت صرف نظر از اندازه پیام ورودی خواهد بود.

به عنوان مثال، اجازه دهید پیام اصلی به نمای دیجیتال ترجمه شود، زیر (در فرمت هگزادسیمال):

2 ب1 4 A.9 5 F.E.4

ما پیام را به نگاه باینری انتقال خواهیم داد، بایت ها را به یکدیگر بنویسید و بیت ها را در هر ستون توسط ماژول 2 قرار دهید:

0010 1011

0001 0100

1010 1001

0101 1111

1110 0100

——————-

0010 1101

نتیجه: 0010 1101 یا 2 D. و این ارزش عملکرد هش خواهد بود.

با این حال، چنین عملکرد هش نمی تواند برای اهداف رمزنگاری مورد استفاده قرار گیرد، به عنوان مثال، برای تشکیل یک امضا الکترونیکی، به عنوان آن را نسبتا آسان برای تغییر محتوای پیام امضا شده بدون تغییر ارزش چکمه.

بنابراین، تابع هش تست مناسب برای برنامه های رمزنگاری نیست. در رمزنگاری، عملکرد هش خوب است اگر دشوار است که دو نوع را با همان عملکرد هش ایجاد کنید، و همچنین اگر خروجی عملکرد وابستگی صریح به ورودی نداشته باشد.

ما الزامات اساسی برای توابع هش رمزنگاری را تشکیل می دهیم:

· تابع هش باید به یک پیام از هر اندازه قابل استفاده باشد؛

· محاسبه مقدار تابع باید به اندازه کافی سریع انجام شود؛

· با معنای شناخته شده عملکرد هش، باید برای پیدا کردن یک نمونه اولیه مناسب باشد (تقریبا غیر ممکن است) M. ;

· با یک پیام شناخته شده M. برای پیدا کردن یک پیام دیگر باید دشوار باشد. m ' با همان مقدار تابع هش، مانند پیام منبع؛

· برای پیدا کردن هر جفت پیام های تصادفی تصادفی با همان عملکرد هش دشوار است.

یک تابع هش ایجاد کنید که مطابق تمام الزامات ذکر شده کار آسان نیست. همچنین لازم است به یاد داشته باشید که عملکرد تابع بر روی عملکرد اندازه دلخواه دریافت می شود و نتیجه هش نباید به همان اندازه برای این اندازه های مختلف مشابه باشد.

در حال حاضر، در عمل، توابع به عنوان توابع هش استفاده می شود، پردازش پیام ورودی ورودی پشت واحد و محاسبه هش- سلام. برای هر بلوک m I. پیام ورودی در وابستگی

h i \u003d h (m i، h i-1)

جایی که h i-1 - نتیجه به دست آمده در هنگام محاسبه عملکرد هش برای بلوک قبلی داده های ورودی به دست آمده است.

در نتیجه، عملکرد عملکرد هش h N. یک تابع از همه است n. بلوک های ورودی

2. از رمزگذاری الگوریتم های بلوک استفاده کنید تا یک تابع هش را تشکیل دهید.

به عنوان یک تابع هش، شما می توانید از یک الگوریتم بلوک برای رمزگذاری متقارن استفاده کنید. اگر الگوریتم بلوک استفاده شود، یک استنتاج رمزنگاری است، سپس تابع هش بر اساس آن قابل اعتماد خواهد بود.

ساده ترین راه استفاده از یک الگوریتم بلوک برای به دست آوردن کد هش، رمزگذاری پیام در حالت CBC است ( Cipher CHAINY CHAINY - حالت کلاچ CIGHERTEX) در این مورد، پیام به عنوان توالی از بلوک هایی که طول آن برابر با طول واحد الگوریتم رمزگذاری است، نشان داده شده است. در صورت لزوم، آخرین واحد به صفر های راست تکمیل می شود، به طوری که واحد طول مورد نظر است. هش آخرین بلوک متن رمزگذاری شده خواهد بود. با توجه به استفاده از یک الگوریتم رمزنگاری قابل اعتماد، هش به دست آمده ویژگی های زیر را دارد:

· عملا غیر ممکن است بدون دانستن محاسبه کلید رمزنگاری ارزش هش برای یک آرایه باز داده شده از اطلاعات؛

· عملا غیر ممکن است بدون دانستن کلید رمزنگاری کلید داده های باز برای مقدار هش مشخص شده غیر ممکن است.

فروتنانه شکل گرفته به این روش معمولا نامیده می شود imitovka یا تصدیق کننده و برای بررسی یکپارچگی پیام استفاده می شود. بنابراین، شبیه ساز یک ترکیب کنترل است که به داده های باز و اطلاعات کلیدی مخفی بستگی دارد. هدف از استفاده از Imitovka این است که تشخیص تمام تغییرات تصادفی یا عمدی در آرایه اطلاعات. مقدار به دست آمده از عملکرد هش هنگام پردازش پیام ورودی به پیام در لحظه ای که شناخته شده است، پیام صحیح است. گیرنده یکپارچگی پیام را با محاسبه تقلید از پیام دریافت شده بررسی می کند و آن را با کد هش حاصل می شود که باید به صورت ایمن منتقل شود. یکی از این روش های ایمن ممکن است رمزگذاری ایمان فرستنده را با یک کلید بسته، I.E. ایجاد یک امضا همچنین ممکن است الگوریتم کد هش به دست آمده برای رمزگذاری متقارن را رمزگذاری کند، اگر فرستنده و گیرنده دارای کلید کلی رمزنگاری متقارن باشند.

فرآیند مشخص شده به دست آوردن و استفاده از Imitovka در استاندارد داخلی GOST 28147-89 شرح داده شده است. استاندارد ارائه می دهد برای استفاده از 32 بیت جوان از بلوک به دست آمده در خروجی عملیات رمزگذاری کل پیام در حالت کلاچ بلوک رمز برای نظارت بر یکپارچگی پیام فرستاده شده است. به همان شیوه، هر الگوریتم بلوک برای رمزگذاری متقارن می تواند برای تشکیل Imitavka استفاده شود.

یکی دیگر از راه های ممکن برای استفاده از یک رمز عبور برای تولید یک کد هش، زیر است. پیام منبع در بلوک های سری پردازش می شود. آخرین بلوک در صورت لزوم با صفر تکمیل می شود، گاهی اوقات طول پیام به صورت یک عدد دودویی به آخرین بلوک مربوط می شود. در هر مرحله، هش را رمزگذاری می کنید، که در مرحله قبلی به دست آمده است، بلوک پیام فعلی را به عنوان کلید دریافت می کند. آخرین مقدار رمزگذاری شده وارد شده، هش نهایی خواهد بود.

بنابراین، اگر طرح رمزگذاری پیام معمولی باشد M. با استفاده از رمز عبور بلوک f. بر روی کلید به ما ثبت نام کردیم e \u003d f (m، k) سپس طرح کد هش h. با توجه به الگوریتم شرح داده شده در بالا، شما می توانید تصور کنید که چگونه

سلام. = f. ( سلام. -1 , M. )

به عنوان یک کد هش اولیه h 0 ثابت کن رمزگذاری در حالت جایگزینی ساده انجام می شود. استفاده كردن روش مشخص شده اندازه بلوک همزمان با طول کلید است و اندازه مقدار هش طول واحد خواهد بود.

راه دیگری برای استفاده از یک رمز عبور بلوک در حالت جایگزینی ساده نیز امکان پذیر است: عناصر پیام با مقادیر هش به دست آمده در مرحله قبلی رمزگذاری می شوند:

سلام. = f. ( M. , سلام. -1 ,)

در حقیقت، چندین طرح دیگر برای استفاده از یک رمزنگاری بلوک برای ایجاد یک تابع هش. بیایید m I. - بلوک پیام منبع، سلام. - ارزش تابع هش بر روی من. -مرحله، f. - الگوریتم بلوک برای رمزگذاری مورد استفاده در حالت جایگزینی ساده - عملیات اضافه شده از ماژول 2. پس از آن، ممکن است، به عنوان مثال، توابع هش زیر تشکیل طرح:

در تمام این نمودارها، طول مقدار هش تولید شده برابر طول بلوک در طول رمزگذاری است. همه اینها، و همچنین برخی از طرح های دیگر برای استفاده از الگوریتم بلوک برای رمزگذاری برای محاسبه مقادیر هش می تواند در عمل استفاده شود.

ضرر اصلی توابع هش طراحی شده بر اساس الگوریتم های بلوک، سرعت نسبتا کم است. رمزنگاری مورد نیاز نیز می تواند برای تعداد کمی از عملیات بر روی داده های ورودی تضمین شود. الگوریتم های هاس سریع تر (رایج ترین آنها - MD5، SHA-1، SHA-2 و GOST R 34.11-94) وجود دارد.

3. بررسی الگوریتم ها برای تشکیل توابع هش.

در حال حاضر، الگوریتم های ویژه ویژه ارائه شده و عملا برای محاسبه عملکرد هش استفاده می شود. مشهورترین الگوریتم های MD5، SHA-1، SHA-2 و سایر نسخه های SHA و همچنین الگوریتم داخلی که در GOST R 34.11-94 مشخص شده اند، هستند.

الگوریتم MD5 در اوایل دهه 90 از قرن بیستم به عنوان یک نتیجه از بهبود الگوریتم تشکیل HASH MD4 ظاهر شد. نمادها به نام "MD" میانگین پیام هضم - خلاصه ای از پیام. نویسنده الگوریتم های MD4 و MD5 - R. Rivest (R.rivest). در نتیجه استفاده از MD5، یک هش 128 بیتی برای یک پیام دلخواه تشکیل شده است. داده های ورودی توسط 512 بلوک بیت پردازش می شود. الگوریتم از ابتدایی استفاده می کند عملیات منطقی (Inversion، Conjunction، افزودن ماژول 2، تغییرات چرخه ای، و غیره)، و همچنین علاوه بر محاسبات معمولی. تکرار جامع این توابع ابتدایی الگوریتم تضمین می کند که نتیجه پس از پردازش به خوبی مخلوط شده است. بنابراین، بعید است که دو پیام انتخاب شده توسط شانس همان کد هش داشته باشند. الگوریتم MD5 دارای ویژگی های زیر است: هر بیت از مقدار هش نتیجه حاصل از هر بیت ورودی است. اعتقاد بر این است که MD5 قوی ترین تابع هش برای مقدار 128 بیتی هش است.

الگوریتم شاعر الگوریتم هش امن - الگوریتم هش ایمن) توسط موسسه ملی استانداردها و فناوری (NIST) ایالات متحده توسعه داده شد و به عنوان یک استاندارد اطلاعات فدرال آمریکایی در سال 1993 منتشر شد. SHA-1، و همچنین MD5، بر اساس الگوریتم MD4. SHA-1 یک هش 160 بیتی را بر اساس پردازش منبع 512 بلوک بیت تشکیل می دهد. الگوریتم SHA-1 همچنین از عملیات منطقی و محاسباتی ساده استفاده می کند. مهمترین تفاوت بین SHA-1 از MD5 این است که کد هش SHA-1 32 بیت طولانی تر از کد هش MD5 است. اگر فرض کنیم هر دو الگوریتم در سختی برای رمزنگاری یکسان هستند، SHA-1 یک الگوریتم مقاوم تر است. با استفاده از حمله توسط نیروی درشت (حمله پیشانی)، ایجاد یک پیام دلخواه است که کد هش را ارائه می دهد، و همچنین برای ایجاد دو پیام با همان کد هش سخت تر است.

در سال 2001، موسسه ملی استانداردها و فن آوری های ایالات متحده، سه تابع هش را به عنوان یک استاندارد با طول بیشتر از کد هش به دست آوردند تا در SHA-1. اغلب این توابع هش SHA-2 یا SHA-256، SHA-384 و SHA-512 نامیده می شود (طول هش کد ایجاد شده توسط الگوریتم ها در عنوان مشخص شده است). این الگوریتم ها نه تنها به طول کد هش ایجاد می شود، بلکه از توابع داخلی و طول بلوک پردازش شده (در SHA-256 طول واحد - 512 و طول بلوک SHA-384 و SHA-512 استفاده می شود 1024 بیت است) پیشرفت های تدریجی الگوریتم SHA منجر به افزایش مقاومت مرموز خود می شود. علیرغم تفاوت های الگوریتم های مورد بررسی از یکدیگر، همه آنها توسعه بیشتر SHA-1 و MD4 هستند و ساختار مشابهی دارند.

در روسیه، GOST P34.11-94 تصویب شده است، که یک استاندارد داخلی برای توابع هش است. ساختار آن بسیار متفاوت از ساختار الگوریتم های SHA-1.2 یا MD5 است که بر اساس الگوریتم MD4 است. طول کد هش ایجاد شده توسط الگوریتم GOST R 34.11-94 256 بیت است. الگوریتم به طور پیوسته توسط پیام منبع توسط بلوک های 256 بیت به سمت راست چپ پردازش می شود. پارامتر الگوریتم، بردار شروع هش است - مقدار ثابت دلخواه نیز 256 بیت است. در الگوریتم، GOST R 34.11-94، عملیات جایگزینی، برش، افزودن محاسباتی، اضافه کردن ماژول 2. به عنوان تابع کمکی GOST 34.11-94 با استفاده از الگوریتم با توجه به GOST 28147-89 در حالت جایگزینی ساده استفاده می کند.

4. مورد نیاز برای توابع هش

تابع هش یک تابع یک طرفه طراحی شده برای دریافت یک فایل، پیام های "اثر انگشت"، پیام ها یا برخی از بلوک داده ها نامیده می شود.

کد هش توسط تابع ایجاد شده است n. :

h \u003d h (m)

جایی که M. پیامی از طول دلخواه و h. این یک کد هش ثابت است.

الزامات مورد نیاز را که عملکرد هش باید مطابقت داشته باشد را در نظر بگیرید تا بتوان آن را به عنوان یک شناسه پیام استفاده کرد. یک مثال بسیار ساده از عملکرد هش را در نظر بگیرید. سپس ما چندین روش را به ساخت عملکرد هش تجزیه و تحلیل می کنیم.

تابع هش n. این برای تأیید اعتبار استفاده می شود باید خواص زیر را داشته باشد:

1. عملکرد هش n. این باید به بلوک داده ای از هر زمان اعمال شود.

2. عملکرد هش n. خروجی طول ثابت را ایجاد می کند.

3. n (m) نسبتا به راحتی (برای زمان چندجملهای) برای هر مقدار محاسبه می شود M. .

4. برای هر کد هش داده شده h. این به وضوح غیر ممکن است برای پیدا کردن M. به طوری که h (m) \u003d h .

5. برای هر گونه داده شده h. این محاسباتی غیرممکن است که این را پیدا کنید

H. (y) \u003d h (x).

6. به طور محاسباتی امکان پیدا کردن یک جفت دلخواه ( h. , y. ) به طوری که h (y) \u003d h (x) .

سه ویژگی اول نیاز به عملکرد هش برای ایجاد یک کد هش برای هر پیام.

اموال چهارم، الزامات یک طرفه از توابع هش را تعیین می کند: آسان برای ایجاد یک کد هش برای این پیام، اما عدم بازسازی پیام در این کد هش غیر ممکن است. این ویژگی مهم است اگر احراز هویت با استفاده از تابع هش شامل یک مقدار مخفی باشد. با این وجود، ارزش مخفی خود ممکن است ارسال نشود، اگر عملکرد هش یک طرفه نیست، دشمن به راحتی می تواند ارزش مخفی را به صورت زیر کشف کند. هنگامی که انتقال انتقال، مهاجم یک پیام دریافت می کند M. و کد هش C \u003d H (SAB || M) . اگر مهاجم بتواند عملکرد هش را کنترل کند، بنابراین، بنابراین، می تواند دریافت کند SAB || m \u003d h-1 (c) . از آنجا که مهاجم اکنون می داند و M. و SAB || M. ، دريافت كردن SAB کاملا ساده است

اموال پنجم تضمین می کند که پیام دیگری را پیدا کنید که ارزش آن از عملکرد هش با ارزش عملکرد هش همخوانی دارد این پیام. این امر هنگام استفاده از یک کد هش رمزگذاری شده، از تأیید کننده تأیید کننده جلوگیری می کند. در این مورد، حریف می تواند پیام را بخواند و بنابراین کد هش خود را ایجاد می کند. اما از آنجا که دشمن یک کلید مخفی ندارد، توانایی تغییر پیام را ندارد تا دریافت کننده آن را پیدا نکند. اگر این ملک اجرا نشود، مهاجم توانایی انجام دنباله ای از اقدامات زیر را دارد: برای جلوگیری از پیام و کد هش رمزگذاری شده آن، کد پیام هش را محاسبه کنید، یک پیام جایگزین را با همان کد هش ایجاد کنید، پیام اصلی را جایگزین کنید به جعلی از آنجا که کدهای هش این پیام ها هماهنگ هستند، گیرنده جایگزینی را تشخیص نمی دهد.

تابع هش که پنج ویژگی اول را برآورده می کند، یک تابع هش ساده یا ضعیف است. اگر اموال ششم انجام شود، این تابع یک تابع هش قوی نامیده می شود. اموال ششم از حملات کلاس محافظت می کند، که به عنوان حمله "تولد" شناخته می شود.

5. توابع هش ساده

تمام توابع هش به صورت زیر انجام می شود. مقدار ورودی (پیام، فایل، و غیره) به عنوان یک دنباله در نظر گرفته می شود n. بلوک های - مقدار ورودی به صورت متوالی در پشت واحد پردازش می شود و ایجاد می شود. m. ارزش کد هش.

یکی از ساده ترین نمونه های تابع هش، Xor Bitwise از هر بلوک است:

با I. - من. کد هش بیت، 1 <= i <= n .

k. - عدد n. ورودی بلوک ورودی

ب IJ من. بیت ب ج مسدود کردن.

سپس کل پیام رمزگذاری شده است، از جمله کد هش، در حالت CCS برای ایجاد بلوک های رمزگذاری شده Y1، Y2، ...، YN + 1. با تعریف، من دارم:

اما XN + 1 یک کد هش است:

از آنجا که اجزاء در برابری قبلی را می توان در هر جهت محاسبه کرد، بنابراین کد هش تغییر نخواهد کرد اگر بلوک های رمزگذاری شده دوباره مرتب شوند.

استاندارد اولیه پیشنهاد شده توسط NIST از یک XOR ساده استفاده کرد که به بلوک های پیام 64 بیتی مورد استفاده قرار گرفت، سپس کل پیام با استفاده از حالت CCS رمزگذاری می شود.

"تولد پارادوکس"

قبل از بررسی توابع هش پیچیده تر، لازم است که یک حمله خاص به توابع هش ساده را تجزیه و تحلیل کنید.

به اصطلاح "پارادوکس تولد" به شرح زیر است. فرض کنید، تعداد مقادیر خروجی عملکرد هش n. به همان اندازه n. . عدد باید باشد k. به ارزش خاص ایکس. و ارزش ها y1 YK احتمال این که حداقل یک یی برابری انجام شود

h (x) \u003d h (y)

بیش از 0.5 است.

برای یکی Y. احتمال این که h (x) \u003d h (y) ، برابر 1 / n. .

بر این اساس، احتمال آن ، برابر 1 - 1 / n .

اگر شما ایجاد کنید k. مقادیر، احتمال این که هیچ تصادفی برابر با محصول احتمالات مربوط به یک مقدار باشد، I.E. (1 - 1 / n) k .

در نتیجه، احتمال حداقل یک تصادف برابر است

1 - (1 - 1 / n) k

بنابراین ما متوجه شدیم که برای m. کد هش شده به اندازه کافی انتخاب شده است 2m-1 پیام ها به طوری که احتمال تصادف کدهای هش بیشتر از 0.5 بود.

در حال حاضر کار زیر را در نظر بگیرید: نشان دادن p (n، k) احتمال این که در مجموعه ای از k. عناصر هر کدام از آنها می توانند n. مقادیر، حداقل دو برابر با مقادیر مشابه وجود دارد. چه باید برابر باشد k. به p (n، k) بیشتر خواهد بود 0,5 ?

تعداد روش های مختلف برای انتخاب عناصر به گونه ای است که دو برابر، برابر نیست

n (n - 1) ... (n - k + 1) \u003d n! / (n-k)!

تمام راه های ممکن برای انتخاب عناصر برابر است n k.

احتمال این که هیچ دو برابر نشده باشد n! / (n - k)! n k

احتمال این که یک تکراری وجود دارد

1 - n! / (n-k)! nk P (n، k) \u003d 1 - n! / ((n - k)! x nk) \u003d 1 - (n x (n - 1) x ... x (n - k-1)) / nk \u003d 1 - [(n - 1) / n x (n-2) / n x ... x (n - k + 1) / n] \u003d 1 - [(1- 1 / n) x (1 - 2 / n) x ... x (1 - (k-1) / n)]

اگر کد هش طول داشته باشد m. بیت، به عنوان مثال تایید کنید 2 متر ارزش ها، T.

نتیجه مشابهی به نام "پارادوکس تولد" نامیده می شود، زیرا طبق استدلال های فوق به منظور احتمال هماهنگی روزهای تولد دو نفر بیشتر از 0.5 سال، تنها 23 نفر در گروه وجود دارد. این نتیجه به نظر می رسد عالی است، شاید به این دلیل که برای هر فرد فرد در گروه احتمال این که تولد شخص دیگری در گروه با تولد او همخوانی دارد، بسیار کوچک است.

اجازه دهید ما به بررسی خواص توابع هش بازگردیم. فرض کنید کد هش 64 بیتی استفاده می شود. می توان در نظر داشت که کاملا کافی است و بنابراین طول امن برای کد هش است. به عنوان مثال، اگر کد هش رمزگذاری شده باشد از جانب ارسال شده با پیام مناسب رمزگذاری مناسب M. ، پس دشمن باید پیدا شود m ' به طوری که

n (m) \u003d n (m) ,

به منظور جایگزینی پیام و فریب گیرنده. به طور متوسط، دشمن باید از طریق 263 پیام از بین برود تا این را پیدا کند که کد هش برابر با پیام گیرنده است.

با این وجود، انواع مختلف حملات بر اساس "پارادوکس تولد" امکان پذیر است. استراتژی زیر امکان پذیر است:

1. دشمن ایجاد می کند 2 متر / 2 گزینه های پیام، که هر کدام دارای معنای مشخصی هستند. دشمن همان تعداد پیام ها را تهیه می کند، هر کدام از آنها جعلی است و در نظر گرفته شده است که این پیام را جایگزین کند.

2. دو مجموعه پیام ها در جستجوی یک جفت پیام با همان کد هش مقایسه می شود. احتمال موفقیت در مطابقت با "پارادوکس تولد" بیش از 0.5 است. اگر جفت مناسب پیدا نشود، پیام های اضافی و پیام های جعلی تا زمانی که بخار یافت می شود ایجاد می شود.

3. مهاجم فرستنده نسخه اولیه پیام را برای امضا ارائه می دهد. پس از آن این امضا می تواند به یک گزینه جعلی برای انتقال به گیرنده متصل شود. از آنجا که هر دو گزینه دارای همان کد هش هستند، همان امضا ایجاد خواهد شد. دشمن در موفقیت اعتماد به نفس خواهد داشت، حتی نمی داند کلید رمزگذاری.

بنابراین، اگر کد هش 64 بیتی استفاده شود، پیچیدگی لازم محاسبات حدود 232 است.

در نتیجه، ما توجه داریم که طول کد هش باید بسیار بزرگ باشد. طول برابر با 64 بیت در حال حاضر امن نیست. ترجیح داده می شود که طول سفارش 100 بیت را تشکیل می دهد.

با استفاده از زنجیره ای از بلوک های رمزگذاری شده

توابع هش های مختلف بر اساس ایجاد یک زنجیره ای از بلوک های رمزگذاری شده وجود دارد، اما بدون استفاده از یک کلید مخفی. یکی از این توابع هش توسط رابین پیشنهاد شد. پیغام M. تقسیم بر بلوک های طول ثابت M1، M2 ،. . . ، mn و با استفاده از یک الگوریتم رمزنگاری متقارن، مانند DES، برای محاسبه کد هش G. به روش زیر:

h 0 - معنای اولیه n I. = e mi G. = H N.

این شبیه به استفاده از رمزگذاری در حالت CSA است، اما در این مورد هیچ کلید مخفی وجود ندارد. همانطور که در مورد هر تابع هش ساده، این الگوریتم حساس به "حمله تولد" است، و اگر الگوریتم رمزنگاری DES و تنها یک کد هش 64 بیتی ایجاد شده است، سیستم کاملا آسیب پذیر است.

ممکن است حملات دیگری مانند "تولد" وجود داشته باشد، که حتی اگر دشمن به تنها یک پیام و کد هش رمزگذاری شده مربوطه دسترسی داشته باشد، امکان پذیر نیست و نمی تواند چند جفت پیام و کد های هش رمزگذاری شده را دریافت کند. سناریوی زیر امکان پذیر است: فرض کنید دشمن یک پیام را با یک شناسه معتبر به صورت یک کد هش رمزگذاری شده متوقف کرد و شناخته شده است که کد هش رمزگذاری نشده دارای طول است m. بیت ها بعد، دشمن باید اقدامات زیر را انجام دهد:

· استفاده از الگوریتم شرح داده شده در بالا، محاسبه کد هش رمزگذاری نشده G. .

· ایجاد یک پیام جعلی در فرم Q1، Q2 ،. . . ، QN-2 .

· محاسبه n i \u003d qi برای 1 <= i <= N-2 .

· ايجاد كردن 2 متر / 2 بلوک های تصادفی H. و برای هر بلوک H. محاسبه e h. . ایجاد علاوه بر این 2 متر / 2 بلوک به اندازه کافی Y. و برای هر بلوک Y. محاسبه d y [g] جایی که D. - عملکرد تزئینات مربوط به E. . بر اساس "پارادوکس تولد" می توان گفت که با درجه بالایی از احتمال، این توالی شامل بلوک ها خواهد بود H. و Y. به طوری که e x \u003d d y [y] .

· ایجاد یک پیام Q1، Q2 ،. . . ، QN-2، X، Y . این پیام یک کد هش دارد G. و بنابراین، می توان آن را با یک تایید کننده رمزگذاری شده استفاده کرد.

این نوع حمله به عنوان یک حمله "جلسه در وسط" شناخته می شود. در مطالعات مختلف، روش های ظریف تر برای افزایش یک رویکرد مبتنی بر زنجیره بلوک ارائه می شود. به عنوان مثال، Devis و قیمت گزینه زیر را شرح دادند:

گزینه دیگری امکان پذیر است:

با این حال، هر دو این طرح ها نیز دارای آسیب پذیری در حملات مختلف هستند. در یک مورد کلی تر، می توان نشان داد که برخی از فرم "حمله تولد" با هر یک از الگوریتم هش موفق است، که شامل استفاده از زنجیره ای از بلوک های رمز شده بدون استفاده از یک کلید مخفی است.

تحقیقات بیشتری برای پیدا کردن رویکردهای دیگر برای ایجاد توابع هش کردن هدف قرار گرفت.

تابع هش MD5

الگوریتم Digest پیام MD5 را در نظر بگیرید (RFC 1321) که توسط Ron Rivesom از MIT توسعه یافته است.

منطق اعدام MD5

الگوریتم یک طول دلخواه را در ورودی دریافت می کند و یک پیام 128 پیام را به عنوان خروجی ایجاد می کند. الگوریتم شامل مراحل زیر است:

شکل. 8.1منطق اعدام MD5

مرحله 1: اضافه کردن بیت های گم شده

این پیام به گونه ای تکمیل شده است که طول آن برابر با 448 Modulo 512 () باشد. این به این معنی است که طول پیام اضافه شده توسط 64 بیت کمتر از تعداد، 512 است. علاوه بر این همیشه انجام می شود، حتی اگر پیام طول دلخواه را داشته باشد. به عنوان مثال، اگر طول پیام 448 باشد، توسط 512 بیت تا 960 بیت تکمیل شده است. بنابراین، تعداد بیت ها اضافه شده است در محدوده 1 تا 512 است.

اضافه کردن شامل یک واحد است که تعداد مورد نیاز صفرها به شرح زیر است.

مرحله 2: اضافه کردن طول

نمایش 64 بیتی از طول منبع (قبل از اضافه کردن) پیام ها در بیت ها به نتیجه گام اول پیوست می شود. اگر طول اولیه بیشتر از 264 باشد، تنها 64 بیت گذشته استفاده می شود. بنابراین، این فیلد شامل طول پیام منبع توسط ماژول 2 64 است.

به عنوان یک نتیجه از دو مرحله اول، یک پیام ایجاد شده است، طول آن متعدد 512 بیت است. این پیام پیشرفته به عنوان توالی بلوک های 512 بیتی Y 0، Y 1 نشان داده شده است. . .، y l-1، در حالی که طول کل پیام پیشرفته برابر با بیت های L * 512 است. بنابراین، طول پیام پیشرفته دریافت شده بیش از شانزده کلمه 32 بیتی است.

شکل. 8.2ساختار یک پیام پیشرفته

مرحله 3: راه اندازی MD-Buffer

یک بافر 128 بیتی برای ذخیره نتایج متوسط \u200b\u200bو نهایی از عملکرد هش استفاده می شود. بافر را می توان به عنوان چهار رکورد 32 بیتی (A، B، C، D) نشان داد. این رجیسترها توسط شماره های هگزادسیمال زیر آغاز می شود:

a \u003d 01234567 b \u003d 89abcdef c \u003d fedcba98 d \u003d 76543210

مرحله 4: پردازش توالی بلوک های 512 بیتی (16 ساله)

اساس الگوریتم یک ماژول است که شامل چهار تيمار چرخه ای است که به عنوان HMD5 نشان داده شده است. چهار چرخه دارای یک ساختار مشابه هستند، اما هر چرخه از عملکرد منطقی ابتدایی خود استفاده می کند که به ترتیب توسط F F F، F G، F H و F I نشان داده شده است.

شکل. 8.3.پردازش بلوک 512 بیتی بعدی

هر چرخه به عنوان ورودی ورودی 512 بیتی 512 بیتی Y Q، در حال حاضر پردازش شده است، و مقدار 128 بیتی بافر ABCD، که یک مقدار هضم متوسط \u200b\u200bاست، و محتوای این بافر را تغییر می دهد. هر چرخه همچنین از بخش چهارم جدول 64 عنصر T، بر اساس عملکرد گناه استفاده می کند. عنصر I-th که توسط T [I] نشان داده شده است، برابر با کل قسمت 22 * \u200b\u200bABS (SIN (I)) برابر است، من در رادیان ها تنظیم شده ام. از آنجا که ABS (SIN (I)) یک عدد بین 0 تا 1 است، هر عنصر T کل است که می تواند توسط 32 بیت نشان داده شود. جدول مجموعه ای "تصادفی" از مقادیر 32 بیتی را فراهم می کند که باید هر گونه منظم را در داده های ورودی حذف کند.

برای به دست آوردن MD Q + 1، عملکرد چهار دوره توسط ماژول 2 32 با MD Q تشکیل شده است علاوه بر این به طور مستقل برای هر یک از چهار کلمه در بافر انجام می شود.

CLS S یک تغییر چرخه ای به سمت چپ بیت های 32 بیتی است.

X [K] - M - K-O 32 بیتی کلمه در بلوک پیام Q-OHM 512.

t [i-o، i-o، کلمه 32 بیتی در ماتریس T.

+ - اضافه کردن ماژول 2 32.

در هر یک از چهار دوره الگوریتم، یکی از چهار عملکردهای منطقی ابتدایی استفاده می شود. هر ویژگی ابتدایی سه کلمه 32 بیتی را در ورودی دریافت می کند و خروجی یک کلمه 32 بیتی ایجاد می کند. هر تابع بسیاری از عملیات منطقی دسته ای است، به عنوان مثال بیت خروجی n یک تابع از بیت N-B از سه ورودی است. توابع ابتدایی عبارتند از:

آرایه ای از کلمات 32 بیتی X حاوی مقدار بلوک ورودی 512 بیتی فعلی است که در حال حاضر پردازش شده است. هر چرخه 16 بار اجرا می شود، و از آنجا که هر بلوک از پیام ورودی در چهار دوره پردازش می شود، هر واحد ورودی بر اساس نمودار نشان داده شده در شکل پردازش می شود. 4، 64 بار اگر بلوک ورودی 512 بیتی را به صورت شانزده کلمه 32 بیتی ارسال کنید، هر کلمه 32 بیتی ورودی چهار بار استفاده می شود، یک بار در هر چرخه، و هر عنصر جدول T، شامل 64 بیتی است واژه ها تنها یک بار استفاده می شود. پس از هر مرحله از چرخه، یک حرکت چرخه ای به سمت چپ چهار کلمه A، B، C و D اتفاق می افتد. در هر مرحله، تنها یکی از چهار کلمه از تغییرات بافر ABCD است. در نتیجه، هر کلمه بافر 16 بار متغیر است، و سپس 17 بار در پایان برای به دست آوردن خروجی نهایی این واحد.

هضم

2. سرعت: اجرای برنامه الگوریتم باید به سرعت انجام شود. به طور خاص، الگوریتم باید به اندازه کافی سریع بر روی یک معماری 32 بیتی باشد. بنابراین، الگوریتم بر اساس یک مجموعه ساده از عملیات ابتدایی بیش از کلمات 32 بیتی است.

3. سادگی و فشرده سازی: الگوریتم باید در توصیف و آسان به برنامه، بدون برنامه های بزرگ و یا کلمات کلیدی ساده باشد. این ویژگی ها نه تنها مزایای برنامه های آشکار، بلکه از لحاظ امنیت نیز مطلوب است، زیرا تجزیه و تحلیل نقاط ضعف احتمالی بهتر است یک الگوریتم ساده داشته باشید.

4. مورد نظر توسط معماری Little-Endian: برخی از معماری های پردازنده (مانند Intel 80xxx خط)، کلمات را به سمت چپ بندر بایت پایین بایت (Little-Endian) ذخیره کنید. دیگران (مانند Sun Sparcstation) بایت های راست کلمه را در موقعیت آدرس های بایت جوان نگه دارید (ثابت MD4 بزرگ MD4 در چرخه اول اعمال نمی شود. یک ثابت اضافی مشابه برای هر مرحله در چرخه دوم استفاده می شود. دیگری اضافی ثابت برای هر یک از مراحل در چرخه سوم استفاده می شود. کد هش یک تابع از هر بیت ورودی است. تکرار پیچیده توابع ابتدایی FF F، FG، FH و FI تضمین می کند که نتیجه به خوبی مخلوط شده است؛ به این معناست که بعید به نظر می رسد که دو پیام انتخاب شده با شانس حتی اگر آنها الگوهای مشابهی مشابه داشته باشند، هضم مشابهی داشتند، که ارزش خروجی مشابهی را ایجاد می کرد. این به این معنی است که اجرای MD5 بر روی بلوک تک 512 بیت منجر به خروجی مشابه برای دو مقدار ورودی مختلف در بافر ABCD. در حالی که روش گسترش این رویکرد برای حمله موفق MD5 وجود ندارد.