Apa itu fungsi hashing. Fungsi hash kriptografi

Algoritma pencarian yang kami pertimbangkan biasanya didasarkan pada operasi perbandingan abstrak. Dari seri ini, metode distribusi dijelaskan dalam "tabel simbol dan pohon pencarian biner", yang disimpan di posisi I-th tabel, yang memungkinkan Anda untuk merujuknya secara langsung. Dengan mendistribusikan pencarian, tombol-tombol digunakan sebagai indeks array, dan bukan operan operasi perbandingan; Metode itu sendiri didasarkan pada fakta bahwa tombol adalah bilangan bulat yang berbeda dari kisaran yang sama dengan indeks tabel. Dalam bab ini, kita akan melihat hashing (hashing) - versi diperpanjang dari pencarian distribusi, digunakan dalam aplikasi pencarian yang lebih khas, di mana kunci tidak memiliki sifat yang nyaman. Hasil akhir dari aplikasi pendekatan ini Ini sama sekali tidak mirip dengan metode berdasarkan perbandingan - alih-alih bergerak melalui struktur data kamus dengan membandingkan tombol pencarian utama dalam elemen, kami mencoba untuk merujuk pada item di tabel secara langsung dengan melakukan konversi tombol aritmatika ke alamat.

Algoritma pencarian menggunakan hashing terdiri dari dua bagian yang terpisah. Langkah pertama adalah menghitung fungsi hash (fungsi hash), yang mengubah tombol pencarian ke tabel. Idealnya, kunci yang berbeda harus ditampilkan pada berbagai alamat, tetapi seringkali dua atau lebih tombol berbeda dapat memberikan alamat yang sama di tabel. Oleh karena itu, bagian kedua dari pencarian dengan metode hashing adalah proses resolusi tabrakan (resolusi tabrakan), yang memproses kunci tersebut. Dalam salah satu metode resolusi konflik, yang akan kami pertimbangkan dalam bab ini, daftar yang terhubung digunakan, sehingga mendapati penggunaan langsung dalam situasi dinamis ketika sulit untuk memprediksi jumlah tombol pencarian. Dalam dua metode lain dari resolusi tabrakan, sangat dicapai performa. Cari, karena elemen disimpan dalam array tetap. Kami akan mempertimbangkan metode peningkatan metode ini, memungkinkan Anda untuk menggunakannya dan dalam kasus di mana tidak mungkin untuk memprediksi ukuran tabel di muka.

Hashing adalah contoh yang baik dari keseimbangan antara waktu dan memori. Jika tidak ada batasan pada jumlah memori yang digunakan, pencarian apa pun dapat dilakukan dengan hanya menggunakan satu akses memori, cukup gunakan tombol sebagai alamat memori, seperti halnya mendistribusikan pencarian. Namun, kasus ideal ini biasanya tidak dapat dicapai, karena tombol panjang mungkin membutuhkan sejumlah besar memori. Di sisi lain, jika tidak ada batasan lead time., Mungkin dilakukan dengan memori minimum, menggunakan metode pencarian berurutan. Hashing adalah cara untuk menggunakan volume memori dan waktu yang dapat diterima, dan mencapai keseimbangan antara dua persyaratan ekstrem ini. Secara khusus, Anda dapat mendukung saldo, cukup mengubah ukuran tabel, dan tidak menulis ulang kode dan tanpa memilih algoritma lain.

Hashing adalah salah satu tugas klasik dari ilmu komputer: berbagai algoritma ini dipelajari secara rinci dan banyak digunakan. Kami akan melihat bahwa sama sekali tidak ada asumsi keras, Anda dapat berharap untuk dukungan untuk operasi untuk menemukan dan menempel di tabel simbol dengan waktu eksekusi konstan, terlepas dari ukuran tabel.

Nilai yang diharapkan ini adalah kinerja teoritis optimal untuk setiap implementasi tabel simbol, tetapi hash masih bukan obat mujarab untuk dua alasan utama. Pertama, lead time. Tergantung pada panjang kuncinya, yang dalam aplikasi nyata menggunakan tombol panjang dapat menjadi signifikan. Kedua, hashing tidak memberikan implementasi yang efektif dari operasi lain dengan tabel simbol, seperti memilih atau menyortir. Dalam bab ini, kami akan mempertimbangkan secara rinci pertanyaan ini dan lainnya.

Fungsi hash.

Pertama-tama, perlu untuk menyelesaikan tugas menghitung fungsi hash yang mengubah tombol ke alamat tabel. Biasanya, implementasi perhitungan aritmatika ini tidak mewakili kompleksitas, tetapi masih perlu untuk mematuhi perawatan, agar tidak mengalami berbagai perangkap yang menantang rendah. Jika ada tabel yang mungkin berisi elemen M, Anda memerlukan fungsi yang mengubah tombol ke bilangan bulat dalam kisaran. Fungsi hash yang ideal harus mudah dihitung dan mirip dengan fungsi acak: untuk segala argumen, hasilnya dalam arti harus setara.

Fungsi hash tergantung pada jenis tombol. Secara ketat, fungsi hash terpisah membutuhkan tipe kunci terpisah. Untuk meningkatkan efisiensi, biasanya diinginkan untuk menghindari konversi jenis yang secara eksplisit, menghubungi gagasan pertimbangan presentasi biner kunci dalam kata mesin sebagai bilangan bulat yang dapat digunakan dalam perhitungan aritmatika. Hashing muncul sebelum bahasa tingkat tinggi - pada komputer awal adalah masalah yang biasa untuk mempertimbangkan nilai apa pun sebagai tombol string, kemudian sebagai bilangan bulat. Dalam beberapa bahasa tingkat tinggi, sulit untuk membuat program yang bergantung pada presentasi kunci di komputer tertentu, karena program-program tersebut pada dasarnya tergantung pada mesin, dan oleh karena itu mereka sulit dipindahkan ke komputer lain. Biasanya, fungsi hash bergantung pada proses konversi utama ke dalam bilangan bulat, oleh karena itu, sulit untuk secara bersamaan memberikan independensi dan efisiensi mesin dalam implementasi hashing. Sebagai aturan, tombol integer sederhana atau tombol tipe titik mengambang dapat dikonversi hanya menggunakan satu operasi mesin, tetapi tombol string dan jenis lain dari tombol majemuk membutuhkan biaya tinggi dan lebih memperhatikan efisiensi.

Mungkin situasi paling sederhana adalah ketika tombol adalah angka dengan titik apung dari kisaran tetap. Misalnya, jika tombolnya adalah angka, besar 0 dan lebih kecil 1, dapat dikalikan dengan M, membulatkan hasil ke bilangan bulat yang lebih kecil dan mendapatkan alamat dalam kisaran antara 0 dan M - 1; Contoh ini ditunjukkan pada Gambar. 14.1. Jika tombol lebih besar dari S dan kurang dari T, mereka dapat diskalakan, mengurangi dan membagi pada TS, sebagai akibatnya mereka jatuh ke dalam kisaran nilai antara 0 dan 1, dan kemudian mengalikan m dan dapatkan alamat di tabel.


Ara. 14.1.

Untuk mengonversi angka dengan titik apung dalam kisaran antara 0 dan 1 ke indeks tabel, ukurannya adalah 97, mengalikan angka-angka ini oleh 97. Dalam contoh ini, tiga konflik terjadi: untuk indeks sebesar 17, 53 dan 76. Nilai hash ditentukan oleh pelepasan kunci Tetua, pelepasan yang lebih muda tidak memainkan peran apa pun. Salah satu tujuan mengembangkan fungsi hash adalah dengan menghilangkan ketidakseimbangan sehingga setiap pelepasan diperhitungkan selama perhitungan.

Jika tombol-tombol bit bit, mereka dapat dikonversi ke nomor titik apung dan dibagi 2 w untuk mendapatkan angka floating point dalam kisaran antara 0 dan 1, dan kemudian mengalikan m, seperti pada paragraf sebelumnya. Jika operasi floating-point menempati banyak waktu, dan jumlahnya tidak begitu tinggi untuk mengarah ke overflow, hasil yang sama dapat diperoleh dengan menggunakan operasi aritmatika integer: Anda perlu mengalikan tombol ke M, dan kemudian melakukan shift ke Tepat pada w dibuang untuk membagi 2 W (atau, jika perkalian mengarah ke overflow, shift, dan kemudian multiplikasi). Metode seperti itu tidak berguna untuk hashing, kecuali tombol didistribusikan secara seragam oleh kisaran, karena nilai hash ditentukan hanya dengan digit utama kunci.

Lebih sederhana I. metode yang efektif Untuk bintik-bit - salah satu metode hashing yang mungkin paling sering digunakan - pilihan sebagai tabel M berukuran angka sederhana dan menghitung residu untuk membagi ke M, I.E. h (k) \u003d k mod m untuk tombol integer k. Fungsi ini disebut fungsi hash modular. Sangat mudah untuk menghitung (K% m di C ++), dan efektif untuk mencapai distribusi nilai-nilai kunci yang seragam antara nilai-nilai M. Contoh kecil ditunjukkan pada Gambar. 14.2.


Ara. 14.2.

Di tiga kolom kanan, hasil tombol 7-bit yang ditampilkan di sebelah kiri ditampilkan menggunakan fungsi-fungsi berikut:

v% 97 (kiri)

v% 100 (pusat) dan

(int) (A * V)% 100 (kanan),

dimana a \u003d .618033. Ukuran tabel untuk fungsi-fungsi ini masing-masing 97, 100 dan 100. Nilai terlihat acak (karena tombol acak). Fungsi kedua (v% 100) hanya menggunakan dua digit kanan yang ekstrem dan karenanya untuk tombol non-acak dapat menunjukkan kinerja rendah.

Hashing modular berlaku untuk tombol floating point. Jika kunci termasuk dalam kisaran kecil, mereka dapat ditingkatkan menjadi angka-angka dari kisaran antara 0 dan 1, 2 W untuk mendapatkan nilai bit bit, dan kemudian menggunakan fungsi hash modular. Pilihan lain adalah dengan hanya menggunakan presentasi kunci biner fungsi hash modular (jika tersedia).

Hashing modular diterapkan dalam semua kasus ketika akses ke bit dari mana tombol terdiri, terlepas dari apakah mereka bilangan bulat yang diwakili oleh kata mesin, urutan simbol yang dikemas dalam kata mesin, atau diwakili oleh yang lain opsi yang mungkin. Urutan simbol acak dikemas ke dalam kata mesin tidak persis sama dengan tombol integer acak, karena tidak semua pelepasan digunakan untuk pengkodean. Tetapi kedua jenis ini (dan jenis kunci lain yang dikodekan sedemikian rupa agar sesuai dengan kata mesin) dapat dibuat agar terlihat seperti indeks acak dalam tabel kecil.

Alasan utama untuk pemilihan sebagai tabel hash yang berukuran angka sederhana untuk hashing modular ditunjukkan pada Gambar. 14.3. Dalam contoh ini, data simbolik dengan pengkodean 7-bit, kuncinya ditafsirkan sebagai angka dengan basis 128 - dengan satu digit untuk setiap karakter dalam tombol. Sekarang kata sesuai dengan angka 1816567, yang juga dapat ditulis sebagai

karena simbol kode ASCII N, O dan W sesuai dengan angka 1568 \u003d 110, 1578 \u003d 111 dan 1678 \u003d 119. Ukuran tabel m \u003d 64 untuk jenis kunci ini tidak berhasil, sejak menambah nilai x, beberapa 64 (atau 128), tidak mengubah nilai x mod 64 - untuk kunci apa pun, nilai fungsi hash adalah nilai 6 digit terakhir dari kunci ini. Tentu saja, fungsi hash yang baik harus memperhitungkan semua debit utama, terutama untuk kunci simbolis. Situasi serupa dapat terjadi ketika M berisi pengganda, yang merupakan gelar 2. Cara paling sederhana Hindari ini - pilih sebagai nomor sederhana.


Ara. 14.3.

Di setiap baris tabel ini, Anda adalah: kata 3 huruf, presentasi kata ini dalam kode ASCII sebagai angka 21-bit dalam forman oktan dan desimal dan fungsi hash modular standar untuk ukuran tabel 64 dan 31 (dua kolom ekstrem di sebelah kanan). Ukuran tabel 64 mengarah pada hasil yang tidak diinginkan, karena hanya pelepasan utama paling kanan yang digunakan untuk mendapatkan nilai hash, dan huruf-huruf dalam kata-kata bahasa yang biasa didistribusikan secara tidak merata. Misalnya, semua kata yang diberkahi dengan huruf Y sesuai dengan nilai hash 57. Dan, sebaliknya, nilai sederhana 31 menyebabkan lebih sedikit konflik dalam tabel lebih dari dua kali lebih kecil.

Hashing modular sangat mudah diimplementasikan, kecuali bahwa ukuran tabel harus berupa angka yang sederhana. Untuk beberapa aplikasi, Anda dapat puas dengan nomor sederhana yang diketahui kecil atau mencari dalam daftar bilangan prima terkenal sedemikian rupa yang dekat dengan ukuran tabel yang diinginkan. Misalnya, angkanya 2 t - 1, sederhana t \u003d 2, 3, 5, 7, 13, 17, 19 dan 31 (dan tidak ada nilai lain t< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не alasan satu-satunyaDi mana ukuran tabel layak untuk membuat angka sederhana; Alasan lain dipertimbangkan dalam Bagian 14.4.


Ara. 14.4.

Tabel ini adalah angka sederhana terbesar yang lebih kecil dari 2 n, untuk Dapat digunakan untuk distribusi tabel hash dinamis bila perlu ukuran tabel adalah angka yang sederhana. Untuk setiap nilai positif dalam kisaran yang tercakup, tabel ini dapat digunakan untuk menentukan angka sederhana yang berbeda dari 2 kali.

Perwujudan lain dari tombol integer adalah kombinasi metode multiplikasi dan modular: Anda perlu mengalikan kunci konstanta dalam kisaran antara 0 dan 1, dan kemudian membuat pembagian dengan modul M. dengan kata lain, Anda harus menggunakan fungsinya. Antara nilai, m dan basis efektif dari sistem nomor kunci, ada hubungan yang secara teoritis dapat menyebabkan perilaku anomali, tetapi jika Anda menggunakan nilai arbitrer A, di annex nyata. Tidak mungkin memiliki masalah. Seringkali, sebagai, nilai f \u003d 0,618033 ... (bagian emas) dipilih.

Banyak variasi lain telah dipelajari pada topik ini, khususnya, fungsi hash yang dapat diimplementasikan menggunakan instruksi mesin yang efisien seperti pemilihan shift dan mask (lihat tautan).

Dalam banyak aplikasi yang menggunakan tabel simbol, tombol bukan angka dan belum tentu pendek; Lebih sering adalah garis alfanumerik yang bisa sangat panjang. Nah, bagaimana cara menghitung fungsi hash untuk sebuah kata sebagai averylongkkey?

Dalam kode ASCII 7-bit, kata ini sesuai dengan angka 84-bit \\ 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) + (4) + 103 \\ CDOT 128 ^ (3) \\\\ & + 107 \\ CDOT 128 ^ (2) + 101 \\ CDOT 128 ^ (1) + 121 \\ CDOT 128 ^ (0), \\ end (end),

yang terlalu besar sehingga fungsi aritmatika yang biasa dapat dilakukan dengan itu di sebagian besar komputer. Dan seringkali diperlukan untuk menangani dan kunci lebih lama.

Untuk menghitung fungsi hash modular untuk tombol panjang, mereka dikonversi menjadi fragmen per fragmen. Anda dapat menggunakan sifat aritmatika dari fungsi modul dan menggunakan algoritma Gorner (lihat bagian 4,9 "abstrak tipe data"). Metode ini didasarkan pada metode perekaman lain yang sesuai dengan tombol. Sebagai contoh yang sedang dipertimbangkan, kami menulis ekspresi berikut: \\ Beginyu (align *) (((((((((((((((((((97 \\ cdot 128 ^ (11) & + 118) \\ (10) + 101) \\ CDOT 128 ^ (9) + 114) \\ CDOT 128 ^ (8) + 121) \\ CDOT 128 ^ (7) \\\\ & + 108) \\ CDOT 128 ^ (6) \\ CDOT 128 ^ (5) \\ CDOT 128 ^ (5) + 110) \\ CDOT 128 ^ (4) + 103) \\ CDOT 128 ^ (3) \\\\ & + 107) \\ CDOT 128 ^ (2) + 101) \\ CDOT 128 ^ (1) + 121. \\ end (1) *)

Artinya, angka desimal yang sesuai dengan pengkodean karakter string dapat dihitung ketika dilihat dari kiri ke kanan, mengalikan nilai akumulasi menjadi 128, dan kemudian menambahkan nilai kode dari simbol berikutnya. Dalam kasus string panjang, metode perhitungan ini pada akhirnya akan menghasilkan yang besar yang dapat diajukan sama sekali di komputer. Namun, angka ini tidak diperlukan karena hanya residu (kecil) yang diperlukan dari divisi pada M. Hasilnya dapat diperoleh, tanpa menjaga nilai akumulasi, karena Kapan saja, perhitungan dapat dibuang oleh beberapa M - setiap kali Anda melakukan perkalian dan penambahan, perlu menyimpan hanya residu dari modul Divisi M. Hasilnya akan sama dengan kami memiliki kemampuan untuk menghitung Angka yang panjang dan kemudian melakukan divisi (lihat. Latihan 14.10). Pengamatan ini mengarah pada metode aritmatika langsung untuk menghitung fungsi hash modular untuk garis panjang - lihat Program 14.1. Program ini menggunakan yang lain, knotting terakhir: Alih-alih basis 128, ia menggunakan angka sederhana 127. Alasan untuk perubahan ini dipertimbangkan dalam paragraf berikutnya.

Ada banyak cara untuk menghitung fungsi hash kira-kira dengan biaya yang sama dengan hashing modular menggunakan metode Gorner (satu atau dua operasi aritmatika Untuk setiap simbol di kunci). Untuk kunci acak, metode ini praktis tidak berbeda satu sama lain, tetapi kunci nyata jarang acak. Kemungkinan dengan biaya rendah biaya untuk memberikan kunci nyata tipe acak mengarah pada pertimbangan algoritma hashing acak, karena kami membutuhkan fungsi hash yang membuat indeks tabel acak terlepas dari distribusi utama. Tidak sulit untuk mengatur pengacakan, karena tidak perlu secara harfiah mematuhi definisi hashing modular - perlu hanya untuk menghitung seluruh jumlah M yang lebih kecil, semua debit utama digunakan.

M \u003d 96 dan A \u003d 128 (di atas)

M \u003d 97 dan A \u003d 128 (tengah) dan

M \u003d 96 dan A \u003d 127 (di bawah)

Distribusi yang tidak merata pada kasus pertama adalah hasil dari penggunaan huruf dan pelestarian ketidakmampuan yang tidak merata karena fakta bahwa ukuran tabel dan pengganda multiplier 32. Dua contoh lain terlihat acak, karena ukuran tabel dan penggandaan adalah angka yang saling sederhana.

Program 14.1 menunjukkan salah satu cara untuk melakukan ini: menggunakan basis sederhana alih-alih derajat 2 dan integer yang sesuai dengan representasi ascii dari string. Pada Gambar. 14.5 Gambar. 14.5 Ditunjukkan bagaimana perubahan ini meningkatkan distribusi untuk tombol string yang khas. Nilai hash secara teoritis yang dibuat oleh program 14.1 dapat memberikan hasil yang buruk untuk ukuran tabel yang berukuran 127 (walaupun dalam praktiknya mungkin hampir tidak terlihat); Untuk membuat algoritma acak, dimungkinkan untuk memilih nilai pengganda secara acak. Pendekatan yang bahkan lebih efisien adalah dengan menggunakan nilai-nilai acak koefisien dalam perhitungan dan berbagai nilai acak untuk setiap angka kunci. Pendekatan ini memberikan algoritma acak yang disebut hashing universal (hashing universal).

Secara teoritis, fungsi hash universal yang ideal adalah fungsi yang merupakan probabilitas tabrakan antara dua tombol berbeda dalam tabel dengan dimensi m persis sama dengan 1 / m. Dapat dibuktikan bahwa penggunaan sebagai koefisien A dalam program 14.1 tidak memperbaiki nilai sewenang-wenang, dan urutan nilai acak yang berbeda mengkonversi hashing modular menjadi fungsi hash universal. Namun, biaya menghasilkan angka acak baru untuk setiap simbol pada kuncinya biasanya tidak dapat diterima. Dalam praktiknya, dimungkinkan untuk mencapai kompromi yang ditunjukkan pada program 14.1, tanpa menjaga array angka acak yang berbeda untuk setiap simbol utama, dan memvariasikan koefisien menggunakan generasi urutan pseudo-acak sederhana.

Kami akan menyimpulkan: untuk mengimplementasikan tabel karakter abstrak untuk menggunakan hashing, pertama-tama Anda perlu memperluas antarmuka tipe abstrak, memutarnya pada operasi hash, yang menampilkan tombol ke bilangan bulat non-negatif, ukuran tabel M.

Sebagai bagian dari artikel ini, saya akan memberi tahu Anda apa itu Hash.Mengapa dibutuhkan, di mana dan bagaimana itu digunakan, serta contoh-contoh paling terkenal.

Banyak tantangan di bidang teknologi informasi sangat penting untuk volume data. Misalnya, jika Anda perlu membandingkan dua file dengan ukuran 1 KB dan dua file dari 10 GB, maka itu benar-benar berbeda. Oleh karena itu, algoritma yang memungkinkan untuk beroperasi dengan nilai yang lebih pendek dan luas dianggap sangat populer.

Salah satu teknologi seperti hashing, yang telah menemukan penggunaannya ketika memecahkan massa tugas. Tapi, saya pikir Anda, sebagai pengguna biasa, masih tidak bisa dipahami, binatang seperti apa yang dibutuhkannya. Karena itu, saya akan mencoba menjelaskan semua kata termudah.

Catatan: Bahan dirancang untuk pengguna biasa dan tidak mengandung banyak aspek teknis, namun, untuk sosialisasi dasarnya lebih dari cukup.

Apa itu hash atau hashing?

Saya akan mulai dengan persyaratan.

Fungsi hash, fungsi konvolusi - Ini adalah fitur khusus yang memungkinkan Anda untuk mengkonversi teks panjang sewenang-wenang ke kode panjang tetap (biasanya catatan digital pendek).

Hashing. - Ini adalah proses transformasi teks sumber.

Hash, Hash Code, Nilai Hash, Hash-Sum - Ini adalah nilai output dari fungsi hash, yaitu, blok yang dihasilkan adalah panjang tetap.

Seperti yang Anda lihat, ketentuan ini memiliki deskripsi beberapa bentuk, dari mana sulit untuk memahami mengapa itu semua diperlukan. Oleh karena itu, saya akan segera memberikan contoh kecil (tentang aplikasi lain akan memberi tahu sedikit nanti). Misalkan Anda memiliki 2 file 10 GB. Bagaimana Anda dapat dengan cepat menemukan yang dibutuhkan? Anda dapat menggunakan nama file, tetapi mudah untuk mengganti nama. Anda dapat menonton tanggal, tetapi setelah menyalin file file mungkin sama atau dalam urutan lain. Ukurannya, bagaimana Anda sendiri mengerti, sedikit dapat membantu (terutama jika dimensi bertepatan atau Anda tidak melihat nilai byte yang tepat).

Di sinilah Anda membutuhkan hash ini, yang merupakan blok pendek yang dihasilkan dari teks sumber file. Kedua file ini 10 GB akan memiliki dua kode hash yang berbeda, tetapi pendek (sesuatu seperti "ACCAC43535" dan "BBB3232A42"). Menggunakannya, Anda dapat dengan cepat mencari tahu file yang diinginkan.Bahkan setelah menyalin dan mengubah nama.

Catatan: Karena fakta bahwa hash di komputer dunia dan di Internet adalah konsep yang sangat terkenal, maka seringkali semua yang terkait dengan hash, dikurangi dengan kata ini. Misalnya, frasa "Saya menggunakan hash md5" dalam terjemahan berarti bahwa di situs atau di tempat lain digunakan oleh algoritma hashing dari standar MD5.

Properti Hash.

Sekarang, saya akan memberi tahu Anda tentang sifat-sifat fungsi hash, sehingga lebih mudah bagi Anda untuk memahami di mana ia digunakan dan untuk apa yang Anda butuhkan. Tetapi definisi lain pertama.

Tabrakan - Ini adalah situasi ketika satu dan jumlah hash yang sama diperoleh untuk dua teks yang berbeda. Seperti yang Anda ketahui, sekali blok panjang tetap, ia memiliki jumlah nilai yang mungkin terbatas, dan oleh karena itu pengulangan dimungkinkan.

Dan sekarang ke properti fungsi hash:

1. Teks dapat dipasok ke teks dengan ukuran apa pun, dan output adalah blok data panjang tetap. Ini mengikuti dari definisi.

2. Jumlah hash dari teks yang sama harus sama. Jika tidak, fungsi-fungsi seperti itu tidak berguna - ini mirip dengan angka acak.

3. Fungsi konvolusi yang baik harus memiliki distribusi yang baik. Setuju bahwa jika ukuran hash output, misalnya, adalah 16 byte, maka jika fungsi hanya mengembalikan 3 nilai berbeda untuk teks apa pun, maka tidak berpengaruh pada fungsi seperti itu dan 16 byte (16 byte ini 2 ^ 128 Opsi, yaitu sekitar 3, 4 * 10 ^ 38 derajat).

4. Seberapa baik fungsi merespons perubahan sedikit pun dalam teks sumber. Contoh sederhana. Mengubah 1 huruf dalam file 10 GB, nilai fungsi harus berbeda. Jika tidak demikian, maka itu sangat bermasalah untuk menerapkan fungsi seperti itu.

5. Probabilitas terjadinya tabrakan. Parameter yang sangat kompleks dihitung dalam kondisi tertentu. Tetapi, esensinya adalah bahwa apa gunanya fungsi hash, jika jumlah hash yang dihasilkan akan sering bertepatan.

6. Tingkat perhitungan hasha. Berapa lot dari fungsi konvolusi jika untuk waktu yang lama untuk dihitung? Tidak, karena maka file lebih mudah untuk membandingkan atau menggunakan pendekatan lain.

7. Kompleksitas memulihkan data sumber dari nilai hash. Karakteristik ini lebih spesifik daripada secara keseluruhan, karena tidak perlu di mana-mana. Namun, untuk algoritma paling terkenal, karakteristik ini dievaluasi. Misalnya, file sumber yang hampir tidak dapat Anda dapatkan dari fungsi ini. Namun, jika masalah tabrakan berlangsung (misalnya, Anda perlu menemukan teks yang sesuai dengan hash seperti itu), maka karakteristik ini mungkin penting. Misalnya, kata sandi, tetapi sedikit kemudian.

8. membuka atau menutup kode sumber untuk fungsi seperti itu. Jika kode tidak terbuka, kompleksitas pemulihan data, yaitu cryptostility, tetap dipertanyakan. Sebagian, ini masalah dengan enkripsi.

Sekarang Anda dapat mengajukan pertanyaan "dan mengapa itu semua?".

Mengapa Anda membutuhkan hash?

Tujuan utama fungsi hash hanya tiga (atau lebih tepatnya tujuan mereka).

1. Periksa integritas data. DI kasus ini Semuanya sederhana, fungsi seperti itu harus dihitung dengan cepat dan memungkinkan Anda untuk memeriksa dengan cepat, misalnya, file yang diunduh dari Internet tidak rusak selama transfer.

2. Menumbuhkan kecepatan pencarian data. Ukuran blok tetap memungkinkan Anda untuk mendapatkan banyak keuntungan dalam menyelesaikan tugas pencarian. Dalam hal ini, kita berbicara tentang apa yang murni secara teknis, penggunaan fungsi hash dapat memiliki efek positif pada kinerja. Untuk fungsi-fungsi seperti itu, kemungkinan tabrakan dan distribusi yang baik sangat penting.

3. Untuk kebutuhan kriptografi. Spesies ini Fungsi konvolusi digunakan pada bidang keamanan, di mana penting bahwa hasilnya sulit untuk diganti atau di mana perlu untuk memperumit tugas untuk mendapatkan sebanyak mungkin. informasi berguna dari hash.

Di mana dan bagaimana hash diterapkan?

Karena Anda mungkin sudah menebak hash berlaku ketika memecahkan banyak tugas. Ini beberapa dari mereka:

1. Kata sandi biasanya disimpan tidak dalam formulir terbuka, tetapi dalam bentuk jumlah hash, yang memungkinkan untuk memastikan tingkat keamanan yang lebih tinggi. Lagi pula, bahkan jika penyerang akan menerima akses ke database seperti itu, ia masih harus menghabiskan banyak waktu untuk mengambil teks yang sesuai dengan kode hash ini. Ini adalah karakteristik "Kompleksitas memulihkan data awal dari nilai hash".

Catatan: Saya menyarankan Anda untuk berkenalan dengan artikel oleh beberapa tips untuk meningkatkan keamanan kata sandi.

2. Dalam pemrograman, termasuk basis data. Tentu saja, paling sering kita berbicara tentang struktur data yang memungkinkan pencarian Cepat. Aspek teknis murni.

3. Ketika data mentransmisikan data (termasuk Internet). Banyak protokol, seperti TCP / IP termasuk bidang pemeriksaan khusus yang berisi jumlah hash pesan sumber sehingga jika terjadi kegagalan di suatu tempat, itu tidak mempengaruhi transfer data.

4. Untuk berbagai algoritma terkait keselamatan. Misalnya, hash digunakan dalam tanda tangan digital elektronik.

5. Untuk memverifikasi integritas file. Jika Anda memperhatikan, sering kali dapat memenuhi file di Internet (misalnya, Arsip) deskripsi Tambahan dengan kode hash. Ukuran ini diterapkan tidak hanya agar Anda tidak secara tidak sengaja menjalankan file yang rusak saat mengunduh dari internet, tetapi juga ada kesederhanaan hosting. Dalam kasus seperti itu, Anda dapat dengan cepat memeriksa hash dan jika diperlukan, maka overdo file.

6. Terkadang, fungsi hash digunakan untuk membuat pengidentifikasi unik (sebagai bagian). Misalnya, saat menyimpan gambar atau hanya file, Anda biasanya menggunakan hash dalam nama bersama dengan tanggal dan waktu. Ini memungkinkan Anda untuk tidak menimpa file dengan nama yang sama.

Sebenarnya, semakin jauh, semakin sering fungsi hash digunakan teknologi Informasi. Terutama karena fakta bahwa jumlah data dan kekuatan paling banyak komputer sederhana Sangat menggeram. Dalam kasus pertama, kami lebih tentang pencarian, dan pada saat kedua kami lebih tentang masalah keamanan.

Fungsi hash terkenal.

Yang paling terkenal adalah tiga fungsi hash berikut.

Anotasi: Dalam kuliah ini, konsep fungsi hash dirumuskan, juga ulasan singkat Algoritma untuk pembentukan fungsi hash. Selain itu, dianggap memiliki kemungkinan menggunakan algoritma blok untuk enkripsi untuk membentuk fungsi hash.

Tujuan dari kuliah: untuk berkenalan dengan konsep "fungsi hash", serta dengan prinsip-prinsip fungsi tersebut.

Konsep fungsi hash

Fungsi hash (fungsi hash) Fungsi matematika atau lainnya disebut, yang untuk garis panjang sewenang-wenang menghitung beberapa bilangan bulat atau serangkaian panjang tetap lainnya. Secara matematis, dapat ditulis seperti ini:

di mana m adalah pesan asli yang disebut kadang-kadang menyajikan, dan H - hasilnya disebut fungsi hash (juga kode hash atau pesan Digest. (dari bahasa Inggris. ingest Pesan.)).

Arti fungsi hash adalah untuk menentukan fitur karakteristik sampel - makna fungsi hash. Nilai ini biasanya memiliki ukuran tetap tertentu, misalnya, 64 atau 128 bit. Kode hash dapat dianalisis lebih lanjut untuk menyelesaikan tugas apa pun. Misalnya, hashing dapat digunakan untuk membandingkan data: Jika dua kode hash berbeda, array dijamin; Jika array yang sama kemungkinan besar sama. Secara umum, korespondensi yang tidak ambigu antara data sumber dan kode hash tidak disebabkan oleh fakta bahwa jumlah fungsi hash selalu kurang dari opsi input. Oleh karena itu, ada banyak pesan input yang memberikan kode hash yang sama (situasi seperti itu disebut collikia.). Probabilitas terjadinya tabrakan memainkan peran penting dalam menilai kualitas fungsi hash.

Fungsi hash banyak digunakan dalam kriptografi modern.

Fungsi hash paling sederhana dapat disiapkan menggunakan operasi "jumlah modul 2" sebagai berikut: Kami memperoleh string input, kami melipat semua byte dengan modul 2 dan hasil byte kembali sebagai hash fuch. Panjang fungsi hash akan dalam hal ini 8 bit terlepas dari ukuran pesan input.

Misalnya, biarkan pesan asli diterjemahkan ke dalam tampilan digital, berikut (dalam format heksadesimal):

Kami akan mentransfer pesan ke tampilan biner, menulis byte satu sama lain dan meletakkan bit di setiap kolom dengan modul 2:

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

Hasilnya (0110 0101 (2) atau 65 (16)) dan akan menjadi nilai fungsi hash.

Namun, fungsi hash seperti itu tidak dapat digunakan untuk keperluan kriptografi, misalnya untuk membentuk tanda tangan elektronikKarena mudah untuk mengubah konten pesan yang ditandatangani tanpa mengubah nilai checksum.

Oleh karena itu, fungsi hash yang dianggap tidak cocok untuk aplikasi kriptografi. Dalam kriptografi, fungsi hash dianggap baik jika sulit untuk membuat dua jenis dengan fungsi hash yang sama, serta jika output fungsi tidak tergantung secara eksplisit pada pintu masuk.

Kami merumuskan persyaratan dasar untuk fungsi hash kriptografi:

  • fungsi hash harus berlaku untuk pesan dengan ukuran apa pun;
  • perhitungan nilai fungsi harus dilakukan dengan cukup cepat;
  • dengan fungsi hash yang terkenal, itu harus sulit (hampir tidak mungkin) untuk menemukan prototipe yang sesuai;
  • dengan pesan yang terkenal, M harus sulit untuk menemukan pesan lain M 'dengan nilai yang sama dari fungsi hash, seperti pesan sumber;
  • seharusnya sulit untuk menemukan pasangan berbagai pesan acak dengan fungsi hash yang sama.

Buat fungsi hash yang memenuhi semua persyaratan yang tercantum bukanlah tugas yang mudah. Juga perlu diingat bahwa fungsi fungsi diterima pada fungsi ukuran sewenang-wenang, dan hasil hash tidak boleh sama dengan ukuran yang berbeda ini.

Saat ini, dalam praktiknya, fungsi memproses pesan input digunakan sebagai fungsi hash, dan menghitung nilai hash H I untuk setiap blok dari pesan input pada ketergantungan jenis

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

di mana h i-1 adalah hasil yang diperoleh ketika menghitung fungsi hash untuk blok sebelumnya. Memasukan data.

Akibatnya, hasil fungsi hash H N adalah fungsi dari semua blok input N.

Gunakan enkripsi algoritma blok untuk membentuk fungsi hash

Anda dapat menggunakan blok sebagai fungsi hash. Jika blok yang digunakan oleh algoritma blok kriptografis, maka fungsi hash berdasarkan itu akan dapat diandalkan.

Cara paling sederhana untuk menggunakan algoritma blok untuk mendapatkan kode hash adalah enkripsi pesan dalam mode CBC. Dalam hal ini, pesan tersebut diwakili sebagai urutan blok yang panjangnya sama dengan panjang blok algoritma enkripsi. Jika perlu, unit terakhir dilengkapi dengan zero kanan, sehingga unit panjang yang diinginkan adalah. Hash akan menjadi blok teks terenkripsi terakhir. Tunduk pada penggunaan algoritma enkripsi blok yang andal, nilai hash yang dihasilkan akan memiliki sifat-sifat berikut:

  • hampir tidak mungkin tanpa mengetahui perhitungan kunci enkripsi nilai hash untuk array informasi yang diberikan;
  • ini praktis tidak mungkin tanpa mengetahui pemilihan kunci enkripsi data terbuka di bawah nilai hash yang ditentukan.

Nilai rumah yang terbentuk dengan cara ini biasanya disebut imitovka. atau authenticator. dan digunakan untuk memeriksa integritas pesan. Dengan demikian, simulator adalah kombinasi kontrol yang tergantung pada data terbuka dan informasi kunci rahasia. Tujuan menggunakan Imitovka adalah untuk mendeteksi semua perubahan acak atau disengaja dalam susunan informasi. Nilai yang diperoleh dengan fungsi hash saat memproses pesan input dilampirkan pada pesan saat ini ketika diketahui bahwa pesannya benar. Penerima memeriksa integritas pesan dengan menghitung imitansi pesan yang diterima dan membandingkannya dengan kode hash yang dihasilkan, yang harus ditransmisikan dengan cara yang aman. Salah satu dari itu cara aman Mungkin enkripsi imitovka kunci tertutup Pengirim, I.E. Menciptakan tanda tangan. Dimungkinkan juga untuk mengenkripsi algoritma Hash Code yang diperoleh untuk enkripsi simetris jika pengirim dan penerima memiliki kunci umum enkripsi simetris.

Proses yang ditentukan untuk memperoleh dan menggunakan Imitovka dijelaskan dalam GOST standar domestik 28147-89. Standard menawarkan untuk menggunakan 32 bit yang lebih muda dari blok yang diperoleh pada output operasi enkripsi seluruh pesan dalam mode cipher blok clutch untuk memantau integritas pesan yang dikirim. Dengan cara yang sama, blok apa pun dapat digunakan untuk menghasilkan imitavka algoritma enkripsi simetris.

Cara lain yang mungkin untuk menggunakan cipher blok untuk menghasilkan kode hash adalah yang berikut. Pesan sumber diproses di blok seri. Blok terakhir, jika perlu, dilengkapi dengan nol, kadang-kadang di blok terakhir Anda mengaitkan panjang pesan dalam formulir angka biner.. Pada setiap tahap, mengenkripsi nilai hash yang diperoleh pada tahap sebelumnya, mengambil blok pesan saat ini sebagai kunci. Nilai terenkripsi yang dimasukkan terakhir akan menjadi hash terakhir.

Bahkan, beberapa skema lagi untuk menggunakan cipher blok untuk membentuk fungsi hash. Biarkan saya menjadi unit blok sumber, hai - nilai fungsi hash pada tahap i-level, F adalah blok algoritma enkripsi yang digunakan dalam mode penggantian sederhana - pengoperasian penambahan modul 2. Maka mungkin, Misalnya, skema formasi fungsi hash berikut:

Dalam semua diagram ini, panjang nilai hash yang dihasilkan sama dengan panjang blok selama enkripsi. Semua ini, serta beberapa skema lain untuk menggunakan algoritma blok untuk enkripsi untuk menghitung nilai hash dapat digunakan dalam praktik.

Kerugian utama dari fungsi hash yang dirancang berdasarkan algoritma blok relatif kecepatan rendah Kerja. Cryptoscope yang diperlukan juga dapat dipastikan untuk sejumlah besar operasi pada data input. Ada algoritma hashing yang lebih cepat yang dirancang secara independen dari awal, berdasarkan persyaratan resistansi kriptik (yang paling umum dari mereka - MD5, SHA-1, SHA-2 dan GOST R 34.11-94).


Apa itu hash?Fungsi hash disebut transformasi matematika informasi dalam string panjang yang pendek dan panjang.

Mengapa Anda membutuhkannya?Analisis menggunakan fungsi hash sering digunakan untuk memantau integritas file penting. sistem operasi, program penting, data penting. Kontrol dapat dilakukan sesuai kebutuhan dan secara teratur.

Bagaimana itu dilakukan?Pada awalnya, tentukan integritas mana file mana harus dipantau. Untuk setiap file, dihitung untuk menghitung nilai hash-nya atas algoritma khusus sambil mempertahankan hasilnya. Setelah waktu yang diperlukan, perhitungan serupa dibuat dan hasilnya dibandingkan. Jika nilai-nilai berbeda, itu berarti informasi yang terkandung dalam file telah diubah.

Karakteristik apa yang harus memiliki fungsi hash?

  • harus dapat melakukan transformasi data panjang sewenang-wenang untuk diperbaiki;
  • harus memiliki algoritma terbuka sehingga cryptoscope-nya dapat dieksplorasi;
  • harus satu sisi, yaitu, seharusnya tidak ada kemampuan matematika dengan menentukan data sumber;
  • harus "menolak" konflik, yaitu, seharusnya tidak memberikan nilai yang sama dengan data input yang berbeda;
  • seharusnya tidak memerlukan sumber daya komputasi besar;
  • dengan perubahan sedikit pun dalam data input, hasilnya harus berubah secara signifikan.

Apa algoritma hashing populer?Fungsi hash berikut saat ini digunakan:

  • CRC - Kode berlebih siklik atau checksum. Algoritma sangat sederhana, miliki sejumlah besar variasi tergantung pada panjang output yang diperlukan. Bukan kriptografi!
  • MD 5 adalah algoritma yang sangat populer. Seperti dia versi sebelumnya MD 4 adalah fungsi kriptografi. Hesha size 128 bit.
  • SHA -1 juga merupakan gunting kriptografi yang sangat populer. Hesha ukuran 160 bit.
  • GOST R 34.11-94 - Standar kriptografi Rusia untuk menghitung fungsi hash. Hesha ukuran 256 bit.

Kapan algoritma ini dapat menggunakan administrator sistem?Seringkali saat mengunduh konten apa pun, seperti program dari pabrikan, musik, film, atau informasi lainnya hadir. kontrol jumlahdihitung sesuai dengan algoritma tertentu. Untuk alasan keamanan, setelah mengunduh, perlu untuk melakukan perhitungan independen dari fungsi hash dan membandingkan nilai dengan apa yang ditunjukkan pada situs web atau dalam aplikasi ke file. Apakah Anda pernah melakukannya?

Apa yang lebih nyaman untuk menghitung hash?Sekarang ada sejumlah besar utilitas serupa dari dayar dan bebas untuk digunakan. Saya pribadi menyukai Hashtab. Pertama, utilitas selama instalasi tertanam dalam bentuk tab ke properti file, kedua, memungkinkan Anda memilih sejumlah besar algoritma hashing, dan ketiga gratis untuk penggunaan non-komersial pribadi.

Apa itu bahasa Rusia?Seperti disebutkan di atas di Rusia, ada standar hashing gost r 34.11-94, yang digunakan di mana-mana di banyak produsen alat keamanan informasi. Salah satu dana ini adalah program pemasangan dan kontrol dari keadaan semula. paket perangkat lunak "Memperbaiki". Program ini adalah sarana untuk mengendalikan efektivitas penerapan SZI.

Fix (versi 2.0.1) untuk Windows 9x / NT / 2000 / XP

  • Hitung cek dari file yang ditentukan oleh salah satu dari 5 algoritma yang diterapkan.
  • Fiksasi dan kontrol selanjutnya dari keadaan asli dari paket perangkat lunak.
  • Perbandingan versi paket perangkat lunak.
  • Fiksasi dan kontrol katalog.
  • Pemantauan perubahan dalam file yang ditentukan (direktori).
  • Pembentukan laporan dalam format TXT, HTML, SV.
  • Produk ini memiliki sertifikat FSTEC pada NDV 3 No. 913 hingga 1 Juni 2013.

Dan bagaimana dengan EDS?Hasil perhitungan fungsi bersama dengan kunci rahasia pengguna memasuki input algoritma kriptografi, di mana tanda tangan digital elektronik dihitung. Secara ketat, fungsi hash bukan bagian dari algoritma EDS, tetapi seringkali ini dilakukan secara spesifik, untuk mengecualikan serangan menggunakan kunci publik.

Saat ini, banyak aplikasi e-commerce memungkinkan Anda untuk menyimpan kunci rahasia pengguna di area token tertutup (Rutoken, Etoke) tanpa kemampuan teknis untuk mengekstraknya dari sana. Token itu sendiri memiliki area memori yang sangat terbatas, diukur dalam kilobyte. Untuk menandatangani dokumen tidak ada kemungkinan untuk mentransfer dokumen ke token itu sendiri, tetapi untuk mentransfer hash dokumen ke token dan pada pintu keluar untuk mendapatkan EDS sangat sederhana.

Pertanyaan:

1. Konsep fungsi hash.

2. Gunakan algoritma blok untuk enkripsi untuk membentuk fungsi hash.

3. Tinjau algoritma untuk pembentukan fungsi hash.

1. Konsep fungsi hash

Fungsi hash.(Fungsi hash) disebut fungsi matematika atau lainnya, yang untuk garis panjang sewenang-wenang menghitung beberapa bilangan bulat atau string panjang tetap lainnya. Secara matematis, dapat ditulis seperti ini:

h. \u003d H (m) ,

dimana M. - Kadang-kadang pesan sumber menyajikan , tetapi h. - Hasilnya disebut nilai fungsi hash (juga kode hash atau pesan Digest. (dari bahasa Inggris. ingest Pesan.)).

Arti fungsi hash adalah untuk menentukan fitur karakteristik sampel - makna fungsi hash. Nilai ini biasanya memiliki ukuran tetap tertentu, misalnya, 64 atau 128 bit. Kode hash dapat dianalisis lebih lanjut untuk menyelesaikan tugas apa pun. Misalnya, hashing dapat digunakan untuk membandingkan data: Jika dua kode hash berbeda, array dijamin; Jika array yang sama kemungkinan besar sama. Secara umum, korespondensi yang tidak ambigu antara data sumber dan kode hash tidak disebabkan oleh fakta bahwa jumlah fungsi hash selalu kurang dari opsi input. Oleh karena itu, ada banyak pesan input yang memberikan kode hash yang sama (situasi seperti itu disebut collikia. ). Probabilitas terjadinya tabrakan memainkan peran penting dalam menilai kualitas fungsi hash.

Fungsi hash banyak digunakan dalam kriptografi modern.

Fungsi hash paling sederhana dapat dikompilasi menggunakan operasi "jumlah modul 2" sebagai berikut: Kami memperoleh string input, kami melipat semua byte dengan modul 2 dan hasil byte kembali sebagai nilai Hash Fuch. Panjang fungsi hash akan dalam hal ini 8 bit terlepas dari ukuran pesan input.

Misalnya, biarkan pesan asli diterjemahkan ke dalam tampilan digital, berikut (dalam format heksadesimal):

2 Dgn B.1 4 A.9 5 F.E.4

Kami akan mentransfer pesan ke tampilan biner, menulis byte satu sama lain dan meletakkan bit di setiap kolom dengan modul 2:

0010 1011

0001 0100

1010 1001

0101 1111

1110 0100

——————-

0010 1101

Hasil: 0010 1101 atau 2 D. Dan itu akan menjadi nilai fungsi hash.

Namun, fungsi hash seperti itu tidak dapat digunakan untuk tujuan kriptografi, misalnya, untuk membentuk tanda tangan elektronik, karena cukup mudah untuk mengubah konten pesan yang ditandatangani tanpa mengubah nilai checksum.

Oleh karena itu, fungsi tes hash tidak cocok untuk aplikasi kriptografi. Dalam kriptografi, fungsi hash dianggap baik jika sulit untuk membuat dua jenis dengan fungsi hash yang sama, serta jika output fungsi tidak memiliki ketergantungan eksplisit pada pintu masuk.

Kami merumuskan persyaratan dasar untuk fungsi hash kriptografi:

· Fungsi hash harus berlaku untuk pesan dengan ukuran apa pun;

· Perhitungan nilai fungsi harus dilakukan dengan cukup cepat;

· Dengan makna fungsi hash yang diketahui, seharusnya sulit (hampir mustahil) untuk menemukan prototipe yang sesuai M. ;

· Dengan pesan terkenal M. Seharusnya sulit untuk menemukan pesan lain. M ' Dengan nilai fungsi hash yang sama, seperti pesan sumber;

· Seharusnya sulit untuk menemukan pasangan berbagai pesan acak dengan fungsi hash yang sama.

Buat fungsi hash yang memenuhi semua persyaratan yang tercantum bukanlah tugas yang mudah. Juga perlu diingat bahwa fungsi fungsi diterima pada fungsi ukuran sewenang-wenang, dan hasil hash tidak boleh sama dengan ukuran yang berbeda ini.

Saat ini, dalam praktiknya, fungsi digunakan sebagai fungsi hash, memproses blok pesan input di belakang unit dan menghitung hash- h. Untuk setiap blok M. Pesan input pada ketergantungan

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

dimana h i-1 - Hasil yang diperoleh saat menghitung fungsi hash untuk blok data input sebelumnya.

Akibatnya, hasil fungsi hash h n. adalah fungsi dari semua n. Blok input.

2. Gunakan enkripsi algoritma blok untuk membentuk fungsi hash.

Sebagai fungsi hash, Anda dapat menggunakan algoritma blok untuk enkripsi simetris. Jika algoritma blok yang digunakan adalah cryptographic strut, maka fungsi hash berdasarkan itu akan dapat diandalkan.

Cara paling sederhana untuk menggunakan algoritma blok untuk mendapatkan kode hash adalah enkripsi pesan dalam mode CBC ( Cipher Block Chaining - Mode Kopling Ciphertex). Dalam hal ini, pesan tersebut diwakili sebagai urutan blok yang panjangnya sama dengan panjang blok algoritma enkripsi. Jika perlu, unit terakhir dilengkapi dengan zero kanan, sehingga unit panjang yang diinginkan adalah. Hash akan menjadi blok teks terenkripsi terakhir. Tunduk pada penggunaan algoritma enkripsi blok yang andal, hash yang diperoleh akan memiliki sifat-sifat berikut:

· Praktis tidak mungkin tanpa mengetahui perhitungan kunci enkripsi nilai hash untuk array informasi yang diberikan;

· Praktis tidak mungkin tanpa mengetahui pemilihan kunci enkripsi dari data terbuka untuk nilai hash yang ditentukan.

Humble terbentuk dengan cara ini biasanya disebut imitovka. atau authenticator. dan digunakan untuk memeriksa integritas pesan. Dengan demikian, simulator adalah kombinasi kontrol yang tergantung pada data terbuka dan informasi kunci rahasia. Tujuan menggunakan Imitovka adalah untuk mendeteksi semua perubahan acak atau disengaja dalam susunan informasi. Nilai yang diperoleh dengan fungsi hash saat memproses pesan input dilampirkan pada pesan saat ini ketika diketahui bahwa pesannya benar. Penerima memeriksa integritas pesan dengan menghitung imitansi pesan yang diterima dan membandingkannya dengan kode hash yang dihasilkan, yang harus ditransmisikan dengan cara yang aman. Salah satu cara aman ini dapat mengenkripsi peniru pengirim dengan kunci tertutup, I.E. Menciptakan tanda tangan. Dimungkinkan juga untuk mengenkripsi algoritma Hash Code yang diperoleh untuk enkripsi simetris jika pengirim dan penerima memiliki kunci umum enkripsi simetris.

Proses yang ditentukan untuk memperoleh dan menggunakan Imitovka dijelaskan dalam GOST standar domestik 28147-89. Standard menawarkan untuk menggunakan 32 bit yang lebih muda dari blok yang diperoleh pada output operasi enkripsi seluruh pesan dalam mode cipher blok clutch untuk memantau integritas pesan yang dikirim. Dengan cara yang sama, algoritma blok apa pun untuk enkripsi simetris dapat digunakan untuk membentuk imitavka.

Cara lain yang mungkin untuk menggunakan cipher blok untuk menghasilkan kode hash adalah yang berikut. Pesan sumber diproses di blok seri. Blok terakhir dilengkapi dengan nol jika perlu, kadang-kadang panjang pesan dalam bentuk angka biner dikaitkan dengan blok terakhir. Pada setiap tahap, mengenkripsi hash, diperoleh pada tahap sebelumnya, mengambil blok pesan saat ini sebagai kunci. Nilai terenkripsi yang dimasukkan terakhir akan menjadi hash terakhir.

Dengan demikian, jika skema enkripsi pesan biasa M. menggunakan blok cipher. f. pada kunci UNTUK Kami merekam as. E \u003d f (m, k) Kemudian skema kode hash h. Menurut algoritma yang dijelaskan di atas, Anda dapat membayangkan bagaimana

h. = f. ( h. -1 , M. )

Sebagai kode hash awal h 0. Ambil beberapa konstan. Enkripsi dilakukan dalam mode penggantian sederhana. Menggunakan metode yang ditentukan Ukuran blok bertepatan dengan panjang tombol dan ukuran nilai hash akan menjadi panjang unit.

Cara lain untuk menggunakan blok cipher dalam mode penggantian sederhana juga dimungkinkan: elemen pesan dienkripsi dengan nilai hash yang diperoleh pada tahap sebelumnya:

h. = f. ( M. , h. -1 ,)

Bahkan, beberapa skema lagi untuk menggunakan cipher blok untuk membentuk fungsi hash. Biarkan menjadi M. - Blok pesan sumber, h. - Nilai fungsi hash pada sAYA. -Tanggung, f. - Algoritma blok untuk enkripsi yang digunakan dalam mode penggantian sederhana - pengoperasian penambahan modul 2. Kemudian mungkin, misalnya, fungsi hash berikut yang membentuk skema:

Dalam semua diagram ini, panjang nilai hash yang dihasilkan sama dengan panjang blok selama enkripsi. Semua ini, serta beberapa skema lain untuk menggunakan algoritma blok untuk enkripsi untuk menghitung nilai hash dapat digunakan dalam praktik.

Kerugian utama dari fungsi hash yang dirancang berdasarkan algoritma blok adalah kecepatan yang relatif rendah. Cryptoscope yang diperlukan juga dapat dipastikan untuk sejumlah besar operasi pada data input. Ada algoritma hashing yang lebih cepat (yang paling umum - MD5, SHA-1, SHA-2 dan GOST R 34.11-94).

3. Tinjau algoritma untuk pembentukan fungsi hash.

Saat ini, berbagai algoritma khusus ditawarkan dan praktis digunakan untuk menghitung fungsi hash. Algoritma paling terkenal adalah MD5, SHA-1, SHA-2 dan versi lain dari SHA, serta algoritma domestik yang diuraikan dalam GOST R 34.11-94.

Algoritma. MD5. Muncul pada awal 90-an abad kedua puluh sebagai hasil dari meningkatkan algoritma pembentukan hash MD4. Simbol dalam nama "MD" Mean Pesan Digest - ringkasan pesan. Penulis algoritma MD4 dan MD5 - R. Rivest (R.RIVEST). Sebagai hasil dari menggunakan MD5, hash 128-bit dibentuk untuk pesan sewenang-wenang. Data input diproses oleh blok 512 bit. Algoritma menggunakan dasar operasi logis (Inversi, konjungsi, penambahan modul 2, pergeseran siklik, dll.), Serta penambahan aritmatika biasa. Pengulangan komprehensif dari fungsi dasar algoritma ini memastikan bahwa hasilnya dicampur dengan baik setelah diproses. Oleh karena itu, tidak mungkin dua pesan yang dipilih secara kebetulan memiliki kode hash yang sama. Algoritma MD5 memiliki properti berikut: Setiap bit nilai hash yang dihasilkan adalah fungsi dari setiap bit entri. Diyakini bahwa MD5 adalah fungsi hash terkuat untuk nilai hash 128-bit.

Algoritma. SHA Secure Hash Algorithm - algoritma hash yang aman) dikembangkan oleh National Institute of Standards and Technology (NIST) dari Amerika Serikat dan diterbitkan sebagai Standar Informasi Federal Amerika pada tahun 1993. SHA-1, serta MD5, berdasarkan algoritma MD4. SHA-1 membentuk hash 160-bit berdasarkan pada pemrosesan sumber 512 bit blok. Algoritma SHA-1 juga menggunakan operasi logis dan aritmatika sederhana. Perbedaan paling penting antara SHA-1 dari MD5 adalah bahwa kode hash SHA-1 adalah 32 bit lebih panjang dari Hash Code MD5. Jika kita berasumsi bahwa kedua algoritma sama dalam kesulitan untuk cryptanalysis, maka SHA-1 adalah algoritma yang lebih resisten. Menggunakan serangan dengan kekuatan kasar (serangan frontal), lebih sulit untuk membuat pesan sewenang-wenang yang memiliki kode hash yang diberikan, dan itu juga lebih sulit untuk membuat dua pesan yang memiliki kode hash yang sama.

Pada tahun 2001, National Institute of Standards and Technologies of the Amerika Serikat mengadopsi tiga fungsi hash sebagai standar dengan panjang kode hash yang lebih besar daripada pada SHA-1. Seringkali, fungsi hash ini disebut SHA-2 atau SHA-256, SHA-384 dan SHA-512 (panjang kode hash yang dibuat oleh algoritma ditentukan dalam judul). Algoritma ini tidak hanya berbeda dengan panjang kode hash yang dibuat, tetapi juga menggunakan fungsi internal dan panjang blok yang diproses (pada panjang unit - 512, dan panjang blok SHA-384 dan SHA-512 adalah 1024 bit). Perbaikan bertahap dari algoritma SHA mengarah pada peningkatan resistensi samar-samar. Terlepas dari perbedaan dalam algoritma yang dipertimbangkan satu sama lain, semuanya adalah pengembangan lebih lanjut SHA-1 dan MD4 dan memiliki struktur yang serupa.

Di Rusia, GOST P34.11-94 diadopsi, yang merupakan standar domestik untuk fungsi hash. Strukturnya cukup sangat berbeda dari struktur algoritma SHA-1.2 atau MD5, yang didasarkan pada algoritma MD4. Panjang kode hash yang dibuat oleh algoritma gost r 34.11-94 adalah 256 bit. Algoritma diproses secara berurutan oleh pesan sumber dengan blok 256 bit ke kanan kiri. Parameter algoritma adalah vektor awal hash - nilai tetap sewenang-wenang juga 256 bit. Dalam algoritma, gost r 34.11-94, operasi permutasi, geser, penambahan aritmatika, penambahan modul 2. sebagai fungsi tambahan GOST 34.11-94 menggunakan algoritma menurut GOST 28147-89 dalam mode penggantian sederhana.

4. Persyaratan untuk fungsi hash

Fungsi hash disebut fungsi satu arah yang dirancang untuk menerima interest atau file "sidik jari", pesan atau beberapa blok data.

Kode hash dibuat oleh fungsi N. :

h \u003d h (m)

Dimana M. adalah pesan panjang sewenang-wenang dan h. Ini adalah kode hash panjang tetap.

Pertimbangkan persyaratan untuk fungsi hash harus cocok sehingga dapat digunakan sebagai otentik pesan. Pertimbangkan contoh fungsi hash yang sangat sederhana. Kemudian kami menganalisis beberapa pendekatan untuk pembangunan fungsi hash.

Fungsi hash. N. Ini digunakan untuk mengautentikasi pesan harus memiliki sifat-sifat berikut:

1. Fungsi Hash N. Itu harus diterapkan pada blok data dengan panjang apa pun.

2. fungsi hash. N. Menciptakan output panjang tetap.

3. N (m) relatif mudah (untuk waktu polinomial) dihitung untuk nilai apa pun M. .

4. Untuk kode hash yang diberikan h. Jelas tidak mungkin ditemukan M. seperti yang H (m) \u003d h .

5. Untuk apa pun yang diberikan h. Secara komputasi tidak mungkin menemukannya

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

6. Ini secara komputasi tidak mungkin untuk menemukan pasangan yang sewenang-wenang ( h. , y. ) seperti yang H (y) \u003d h (x) .

Tiga properti pertama memerlukan fungsi hash untuk membuat kode hash untuk pesan apa pun.

Properti keempat menentukan persyaratan satu sisi fungsi hash: Mudah membuat kode hash untuk pesan ini, tetapi tidak mungkin untuk memulihkan pesan pada kode hash ini. Properti ini penting jika otentikasi menggunakan fungsi hash termasuk nilai rahasia. Nilai rahasia itu sendiri mungkin tidak dikirim, namun, jika fungsi hash tidak satu sisi, musuh dapat dengan mudah mengungkap nilai rahasia sebagai berikut. Saat mencegat transfer, penyerang menerima pesan M. dan Hash Code. C \u003d h (Sab || m) . Jika penyerang dapat membalikkan fungsi hash, maka, oleh karena itu, bisa didapat SAB || M \u003d h - 1 (c) . Karena penyerang sekarang tahu dan M. dan SAB || M. , menerima Sab. cukup sederhana.

Properti kelima memastikan bahwa tidak mungkin menemukan pesan lain, yang nilainya dari fungsi hash akan bertepatan dengan nilai fungsi hash pesan ini. Ini mencegah autentikator palsu saat menggunakan kode hash terenkripsi. Dalam hal ini, lawan dapat membaca pesan dan, oleh karena itu, buat kode hashnya. Tetapi karena musuh tidak memiliki kunci rahasia, itu tidak memiliki kemampuan untuk mengubah pesan sehingga penerima tidak menemukannya. Jika properti ini tidak dieksekusi, penyerang memiliki kemampuan untuk melakukan urutan tindakan berikut: untuk mencegat pesan dan kode hash terenkripsi, menghitung kode hash pesan, membuat pesan alternatif dengan kode hash yang sama, ganti pesan asli untuk yang palsu. Karena kode hash dari pesan-pesan ini bertepatan, penerima tidak akan mendeteksi substitusi.

Fungsi hash yang memenuhi lima properti pertama disebut fungsi hash sederhana atau lemah. Jika properti keenam dilakukan, maka fungsi ini disebut fungsi hash yang kuat. Properti keenam melindungi terhadap serangan kelas, yang dikenal sebagai serangan "ulang tahun".

5. Fungsi hash sederhana

Semua fungsi hash dilakukan sebagai berikut. Nilai input (pesan, file, dll) dianggap sebagai urutan n. --bit blok. Nilai input diproses secara berurutan blok di belakang unit, dan dibuat. m. Nilai kode hash hash.

Salah satu contoh paling sederhana dari fungsi hash adalah XOR bitwise dari setiap blok:

Dengan I. - sAYA. Kode hash bit, 1 <= i <= n .

k. - Nomor n. - Balik blok input.

b IJ. sAYA. Bit B. j. Blok.

Kemudian seluruh pesan dienkripsi, termasuk kode hash, dalam mode CCS untuk membuat blok terenkripsi Y1, Y2, ..., YN + 1. Menurut definisi, saya punya:

Tapi XN + 1 adalah kode hash:

Karena komponen dalam kesetaraan sebelumnya dapat dihitung dalam urutan apa pun, oleh karena itu, kode hash tidak akan diubah jika blok terenkripsi akan disusun ulang.

Standar awal yang diusulkan oleh NIST menggunakan XOR sederhana, yang digunakan untuk blok pesan 64-bit, maka seluruh pesan dienkripsi menggunakan mode CCS.

"Paradoks ulang tahun"

Sebelum mempertimbangkan fungsi hash yang lebih kompleks, perlu untuk menganalisis satu serangan tertentu pada fungsi hash sederhana.

Yang disebut "Paradox Ulang Tahun" adalah sebagai berikut. Misalkan, jumlah nilai output fungsi hash N. sama n. . Apa yang harus menjadi nomornya k. untuk nilai spesifik X. dan nilai-nilai Y1. Yk. Kemungkinan bahwa setidaknya satu Yi dilakukan kesetaraan

H (x) \u003d h (y)

akan lebih dari 0,5.

Untuk satu Y. probabilitas itu H (x) \u003d h (y) , sama. 1 / N. .

Dengan demikian, probabilitas itu , sama. 1 - 1 / n .

Jika Anda membuat k. Nilai, probabilitas bahwa tidak ada kebetulan akan sama dengan produk probabilitas yang sesuai dengan satu nilai, mis .. (1 - 1 / n) K .

Akibatnya, probabilitas setidaknya satu kebetulan sama

1 - (1 - 1 / n) K

Jadi kami menemukan itu untuk m. Kode hash -bed hash sudah cukup untuk dipilih 2m-1. Pesan sehingga probabilitas kebetulan kode hash lebih besar dari 0,5.

Sekarang pertimbangkan tugas berikut: menunjukkan P (n, k) kemungkinan bahwa dalam satu set k. elemen yang masing-masing dapat diambil n. Nilai, setidaknya ada dua dengan nilai yang sama. Apa yang harus sama k. untuk P (n, k) akan lebih 0,5 ?

Jumlah cara berbeda untuk memilih elemen sedemikian rupa sehingga tidak memiliki ganda, sama

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

Semua cara yang mungkin untuk memilih elemen sama n K.

Probabilitas bahwa tidak ada ganda sama n! / (N - k)! N K

Kemungkinan ada duplikat, masing-masing

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/1 / n) x (1 - 2/2 / n) x ... x (1 - (k-1) / n)]

Jika kode hash memiliki panjang m. Bit, mis. Menerima 2m. Nilai, T.

Hasil yang serupa disebut "Paradoks Ulang Tahun", karena sesuai dengan argumen di atas untuk probabilitas kebetulan ulang tahun dua orang lebih besar dari 0,5, seharusnya hanya ada 23 orang dalam kelompok. Hasil ini tampak luar biasa, mungkin karena untuk setiap individu dalam kelompok kemungkinan bahwa ulang tahun orang lain dalam kelompok itu bertepatan dengan ulang tahunnya, cukup kecil.

Mari kita kembali ke pertimbangan sifat-sifat fungsi hash. Misalkan kode hash 64-bit digunakan. Dapat dianggap cukup memadai dan, oleh karena itu, panjang aman untuk kode hash. Misalnya, jika kode hash terenkripsi DARI Ditransmisikan dengan pesan yang tidak terenkripsi yang sesuai M. , maka musuh perlu ditemukan M ' seperti yang

N (m) \u003d n (m) ,

untuk mengganti pesan dan menipu penerima. Rata-rata, musuh harus menembus 263 pesan untuk menemukan ini bahwa kode hash sama dengan pesan yang dicegat.

Namun demikian, berbagai macam serangan berdasarkan "Paradoks Ulang Tahun" dimungkinkan. Strategi berikut adalah mungkin:

1. Musuh menciptakan 2 m / 2 Opsi pesan, masing-masing memiliki makna yang pasti. Musuh menyiapkan jumlah pesan yang sama, yang masing-masing palsu dan dimaksudkan untuk menggantikan pesan ini.

2. Dua set pesan dibandingkan untuk mencari sepasang pesan yang memiliki kode hash yang sama. Probabilitas keberhasilan sesuai dengan "Paradoks Ulang Tahun" lebih besar dari 0,5. Jika pasangan yang sesuai tidak ditemukan, sumber tambahan dan pesan palsu dibuat sampai uap ditemukan.

3. Penyerang menawarkan pengirim versi awal pesan untuk tanda tangan. Tanda tangan ini kemudian dapat dilampirkan pada opsi palsu untuk transfer ke penerima. Karena kedua opsi memiliki kode hash yang sama, tanda tangan yang sama akan dibuat. Musuh akan percaya diri dalam kesuksesan, bahkan tidak mengetahui kunci enkripsi.

Dengan demikian, jika kode hash 64-bit digunakan, kompleksitas perhitungan yang diperlukan adalah sekitar 232.

Kesimpulannya, kami perhatikan bahwa panjang kode hash harus cukup besar. Panjang sama dengan 64 bit saat ini tidak dianggap aman. Lebih baik daripada panjangnya membuat urutan 100 bit.

Menggunakan rantai blok terenkripsi

Ada berbagai fungsi hash berdasarkan membuat rantai blok terenkripsi, tetapi tanpa menggunakan kunci rahasia. Salah satu fungsi hash ini diusulkan oleh Rabin. Pesan M. dibagi pada blok panjang tetap M1, M2 ,. . . , M N. dan menggunakan algoritma enkripsi simetris, seperti DES, untuk menghitung kode hash G. Dengan cara berikut:

H 0. - makna awal N. = E mi. G. = H n.

Ini mirip dengan penggunaan enkripsi dalam mode CSA, tetapi dalam hal ini tidak ada kunci rahasia. Seperti dalam kasus fungsi hash sederhana, algoritma ini rentan terhadap "serangan ulang tahun", dan jika algoritma enkripsi adalah DES dan hanya kode hash 64-bit yang dibuat, sistem dianggap cukup rentan.

Mungkin ada serangan lain seperti "ulang tahun", yang mungkin bahkan jika musuh memiliki akses ke hanya satu pesan dan kode hash terenkripsi yang sesuai dan tidak dapat menerima beberapa pasang pesan dan kode hash terenkripsi. Skenario berikut dimungkinkan: Misalkan musuh mencegat pesan dengan autentikator dalam bentuk kode hash terenkripsi, dan diketahui bahwa kode hash yang tidak terenkripsi memiliki panjang m. bit. Selanjutnya, musuh harus melakukan tindakan berikut:

· Menggunakan algoritma yang dijelaskan di atas, hitung kode hash yang tidak terenkripsi G. .

· Buat pesan palsu dalam formulir Q1, Q2 ,. . . , QN-2 .

· Hitung N i \u003d e qi untuk 1 <= i <= N-2 .

· Buat. 2 m / 2 Blok acak H. Dan untuk setiap blok tersebut H. menghitung E H. . Buat tambahan 2 m / 2 Cukup blok Y. dan untuk setiap blok Y. menghitung D y [g] dimana D. - Fungsi dekorasi sesuai dengan E. . Berdasarkan "Paradoks Ulang Tahun" Kita dapat mengatakan bahwa dengan probabilitas tingkat tinggi, urutan ini akan berisi blok H. dan Y. seperti yang E x \u003d d y [y] .

· Buat pesan Q1, Q2 ,. . . , QN-2, X, Y . Pesan ini memiliki kode hash G. Dan, oleh karena itu, dapat digunakan dengan autentikator terenkripsi.

Bentuk serangan ini dikenal sebagai serangan "pertemuan di tengah". Dalam berbagai penelitian, metode yang lebih halus ditawarkan untuk meningkatkan pendekatan berdasarkan rantai blok. Misalnya, Devis dan harga menggambarkan opsi berikut:

Pilihan lain adalah mungkin:

Namun, kedua skema ini juga memiliki kerentanan pada serangan yang berbeda. Dalam kasus yang lebih umum, dapat ditunjukkan bahwa beberapa bentuk "serangan ulang tahun" berhasil dengan algoritma hash, yang mencakup penggunaan rantai blok terenkripsi tanpa menggunakan kunci rahasia.

Penelitian lebih lanjut ditujukan untuk menemukan pendekatan lain untuk menciptakan fungsi hashing.

MD5 Hash Function.

Pertimbangkan algoritma MD5 Pesan Digest (RFC 1321) yang dikembangkan oleh Ron Rivesom dari MIT.

Logika eksekusi MD5.

Algoritma menerima panjang sewenang-wenang pada input dan membuat 18 pesan batch digest sebagai output. Algoritma ini terdiri dari langkah-langkah berikut:

Ara. 8.1.Logika eksekusi MD5.

Langkah 1: Menambahkan bit yang hilang

Pesan dilengkapi sedemikian rupa sehingga panjangnya menjadi sama dengan 448 modulo 512 (). Ini berarti bahwa panjang pesan yang ditambahkan sebesar 64 bit kurang dari angka, beberapa 512. Penambahan selalu dilakukan, bahkan jika pesan memiliki panjang yang diinginkan. Misalnya, jika panjang pesan adalah 448, dilengkapi dengan 512 bit hingga 960 bit. Dengan demikian, jumlah bit yang ditambahkan dalam kisaran dari 1 hingga 512.

Penambahan terdiri dari satu unit di mana jumlah nol yang diperlukan mengikuti.

Langkah 2: Menambahkan Panjang

Representasi 64-bit dari panjang sumber (sebelum menambahkan) pesan dalam bit bergabung dengan hasil langkah pertama. Jika panjang awal lebih besar dari 2,64, hanya 64 bit terakhir yang digunakan. Dengan demikian, bidang ini berisi panjang pesan sumber dengan modul 2 64.

Sebagai hasil dari dua langkah pertama, sebuah pesan dibuat, panjangnya adalah beberapa 512 bit. Pesan yang diperluas ini diwakili sebagai urutan blok 512-bit y 0, y 1 ,. . ., Y L-1, sedangkan total panjang pesan yang diperluas sama dengan L * 512 bit. Dengan demikian, panjang pesan canggih yang diterima lebih dari enam belas kata-kata 32-bit.

Ara. 8.2.Struktur pesan yang diperluas

Langkah 3: Inisialisasi MD-Buffer

Buffer 128-bit untuk menyimpan hasil intermediate dan akhir dari fungsi hash digunakan. Buffer dapat diwakili sebagai empat register 32-bit (A, B, C, D). Register ini diinisialisasi oleh angka heksadesimal berikut:

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

Langkah 4: Pemrosesan urutan blok 512-bit (16-lirik)

Dasar algoritma adalah modul yang terdiri dari empat perawatan siklik, yang dilambangkan sebagai HMD5. Empat siklus memiliki struktur yang sama, tetapi setiap siklus menggunakan fungsi logis dasarnya, yang dilambangkan dengan F F, F, F H dan F i, masing-masing.

Ara. 8.3.Memproses blok 512-bit berikutnya

Setiap siklus mengambil sebagai input arus blok 512-bit blok Y, saat ini diproses, dan nilai 128-bit dari Buffer ABCD, yang merupakan nilai intermediate digest, dan mengubah konten buffer ini. Setiap siklus juga menggunakan bagian keempat dari Tabel 64-elemen T, berdasarkan fungsi dosa. Elemen I-th t, yang dilambangkan dengan t [i], sama dengan seluruh bagian 2 32 * ABS (SIN (I)), saya diatur dalam Radian. Karena ABS (Sin (i)) adalah angka antara 0 dan 1, setiap elemen T adalah keseluruhan yang dapat diwakili oleh 32 bit. Tabel ini menyediakan "acak" set nilai 32-bit yang harus menghilangkan keteraturan dalam data input.

Untuk mendapatkan MD Q + 1, hasil empat siklus dibentuk oleh modul 2 32 dengan MD Q. Penambahan dilakukan secara independen untuk masing-masing dari empat kata dalam buffer.

CLS S adalah geser siklik ke kiri bit argumen 32-bit.

X [K] - M - K-K 32-bit kata di blok pesan Q-Ohm 512.

T [i] - i-o, kata 32-bit di Matrix T.

+ - Penambahan modul 2 32.

Pada masing-masing dari empat siklus algoritma, salah satu dari empat fungsi logis elementer digunakan. Setiap fitur elementer menerima tiga kata 32-bit pada input dan output membuat satu kata 32-bit. Setiap fungsi adalah banyak operasi logis batch, I.E. Nth output bit adalah fungsi dari bit N-B dari tiga input. Fungsi dasar adalah sebagai berikut:

Array kata-kata 32-bit x berisi nilai blok input 512-bit saat ini, yang saat ini diproses. Setiap siklus berjalan 16 kali, dan karena setiap blok pesan input diproses dalam empat siklus, maka setiap unit input diproses sesuai dengan diagram yang ditunjukkan pada Gambar. 4, 64 kali. Jika Anda mengirimkan blok input 512-bit dalam bentuk enam belas kata 32-bit, setiap kata input 32-bit digunakan empat kali, satu kali dalam setiap siklus, dan setiap elemen T tabel T, yang terdiri dari 64 32-bit Kata-kata, hanya digunakan satu kali. Setelah setiap langkah siklus, geser siklik ke kiri empat kata A, B, C dan D terjadi. Pada setiap langkah, hanya satu dari empat kata perubahan buffer ABCD. Akibatnya, setiap kata buffer bervariasi 16 kali, dan kemudian ke 17 kalinya pada akhirnya untuk mendapatkan output akhir dari unit ini.

intisari.

2. Kecepatan: Implementasi program algoritma harus dilakukan dengan cukup cepat. Secara khusus, algoritma harus cukup cepat pada arsitektur 32-bit. Oleh karena itu, algoritma didasarkan pada set sederhana operasi dasar lebih dari kata-kata 32-bit.

3. Kesederhanaan dan kekompakan: Algoritma harus sederhana dalam deskripsi dan mudah diprogram, tanpa program besar atau wildcard. Karakteristik ini tidak hanya memiliki manfaat program yang jelas, tetapi juga diinginkan dalam hal keamanan, karena untuk menganalisis kemungkinan titik lemah, lebih baik memiliki algoritma sederhana.

4. Diinginkan oleh sedikit arsitektur endian: Beberapa arsitektur prosesor (seperti Intel 80xxx line) menyimpan kata-kata byte byte yang lebih rendah (Little-Endian). Lainnya (seperti Sun Sparcstation) menyimpan byte kanan kata dalam posisi alamat byte junior (konstanta tambahan MD4 besar pada siklus pertama tidak berlaku. Konstanta tambahan serupa digunakan untuk setiap langkah dalam siklus kedua. Tambahan konstanta digunakan untuk masing-masing langkah dalam siklus ketiga.. Kode hash adalah fungsi dari setiap bit input. Pengulangan kompleks fungsi dasar FF F, FG, FH dan FI memastikan bahwa hasilnya dicampur dengan baik; Artinya, tidak mungkin dua pesan dipilih secara kebetulan bahkan jika mereka memiliki pola yang jelas sama, memiliki cerna yang sama, yang menciptakan nilai output yang sama. Ini berarti bahwa eksekusi MD5 di atas satu blok 512 bit akan mengarah pada Output yang sama untuk dua nilai input yang berbeda di buffer ABCD. Sedangkan metode memperluas pendekatan ini untuk serangan yang berhasil MD5 tidak ada.