Yani hash. Kriptografik hash fonksiyonları

  • 27.06.2019

o doğramak "Özet fonksiyonu"



o doğramak, bu, Rusça'da en sık bileşik kelimelerde kullanılan İngilizce hash kelimesidir. "Özet fonksiyonu", "Karma toplamı" veya "karma algoritması". Ne olduğunu ve ne için olduğunu anlamaya çalışalım.

Hashing, rastgele uzunluktaki girdi verilerine dayalı olarak sabit uzunluktaki bir dizi karakterin deterministik (belirsiz ve iyi bilinen) hesaplanması anlamına gelir. Bu durumda, orijinal verideki en az bir karakterdeki bir değişiklik (%100'e yakın bir olasılıkla) elde edilen sabit dizenin farklı olacağını garanti eder. Karma işlemin büyük bir veri kümesinden "parmak izi" olduğunu söyleyebiliriz.

Bütün bunlar ne için? Bir örneğe bakalım: büyük bir dosya indirdiniz (diyelim ki bir zip arşivi) ve dosyada hata olmadığından emin olmak istiyorsunuz. Bu dosyanın "hash-sum"ını (aynı parmak izi) bulabilir ve sitede yayınlananla karşılaştırabilirsiniz. Karma toplamların dizileri farklıysa, dosya açık bir şekilde "bozuktur".

Başka bir örnek: Kullanıcı verilerinin güvenliğini sağlamak için bankanın şifrelerini veritabanında olduğu gibi saklamaması gerekir. Bunun yerine banka bu şifrelerin hash toplamlarını saklar ve her şifre girildiğinde kendi hash toplamını hesaplar ve veri tabanında saklanan şifre ile doğrular. Ve burada, olası "çarpışmalar", yani farklı şifreleri birleştirmenin aynı sonuçları hakkında makul bir soru ortaya çıkıyor. İyi bir karma işlevi, çarpışmaları mutlak minimumda tutmalıdır ve bunun için oldukça karmaşık ve kafa karıştırıcı hale getirilmesi gerekir.


Listede bulundu.

Vesaire.). Belirli bir hash fonksiyonunun seçimi, çözülmekte olan problemin özelliklerine göre belirlenir. Karma işlevlerinin en basit örnekleri, sağlama toplamı veya CRC'dir.

Genel durumda, orijinal veri ile karma kod arasında bire bir yazışma yoktur. Bu nedenle, aynı karma kodları veren birçok veri dizisi vardır - sözde çarpışmalar. Çarpışma olasılığı, hash fonksiyonlarının "kalitesini" değerlendirmede önemli bir rol oynar.

sağlama toplamı

Donanım hataları da dahil olmak üzere kasıtsız bozulmaya karşı koruma sağlamak için kullanılan donanım algoritmalarında karmaşık olmayan, son derece hızlı ve kolayca uygulanabilir.

Hesaplama hızı açısından, kriptografik hash işlevlerinden onlarca ve yüzlerce kat daha hızlıdır ve donanım uygulamasında çok daha basittir.

Böyle yüksek bir hız için ödeme, kriptografik gücün olmamasıdır - bir mesajı önceden belirlenmiş bir miktara ayarlamak için kolay bir fırsat. Ayrıca, genellikle sağlama toplamlarının bitliği (tipik sayı: 32 bit), kriptografik karmalardan (tipik sayılar: 128, 160 ve 256 bit) daha düşüktür, bu da istenmeyen çarpışma olasılığı anlamına gelir.

Böyle bir algoritmanın en basit durumu, bir mesajı 32 veya 16 bitlik kelimelere bölmek ve örneğin TCP / IP'de kullanılan bunları toplamaktır.

Tipik olarak, belirli bir uzunluğa kadar birkaç ardışık hata biti gibi tipik donanım hatalarını izlemek için böyle bir algoritma gereklidir. Algoritma ailesi sözde. "Döngüsel artıklık kodları" bu gereksinimleri karşılar. Bunlar, örneğin, ZIP donanımında kullanılan CRC32'yi içerir.

Kriptografik hash fonksiyonları

Mevcut birçok hash işlevi arasında, kriptografide kullanılan kriptografik olarak güçlü olanları ayırt etmek gelenekseldir. Kriptografik olarak güçlü bir hash fonksiyonunun her şeyden önce sahip olması gerekir. çarpışma direnci iki türden:

karma kullanma

Hash fonksiyonları, hash tabloları ve Kartezyen ağaçları gibi bazı veri yapılarında da kullanılır. Bu durumda karma işlevi için gereksinimler farklıdır:

  • iyi veri karıştırma
  • hızlı hesaplama algoritması

Veri mutabakatı

Genel olarak, bu uygulama, orijinali kullanmadan, orijinale kimlik için bazı bilgilerin kontrol edilmesi olarak tanımlanabilir. Doğrulama için, doğrulanmakta olan bilginin hash değeri kullanılır. Bu uygulamanın iki ana yönü vardır:

Hataları kontrol etme

Örneğin, sağlama toplamı ana metinle birlikte iletişim kanalı üzerinden iletilebilir. Alıcı tarafta, sağlama toplamı yeniden hesaplanabilir ve iletilen değerle karşılaştırılabilir. Bir tutarsızlık bulunursa, aktarım sırasında bozulma olduğu anlamına gelir ve yeniden deneme talebinde bulunabilirsiniz.

Bu durumda, ev tipi bir hash analogu, hareket halindeyken, bagaj parçalarının sayısı hafızada tutulduğunda bir teknik olabilir. Ardından, kontrol etmek için her valizi hatırlamanıza gerek yoktur, ancak onları saymak yeterlidir. Bir maç, hiçbir bavulun kaybolmadığı anlamına gelir. Yani bagajın parça sayısı hash kodudur.

parola kontrolü

Çoğu durumda, parolalar hedef nesnelerde saklanmaz, yalnızca karma değerleri saklanır. Parolaları saklamak pratik değildir, çünkü sözcük öbekleri içeren bir dosyaya yetkisiz erişim durumunda, saldırgan tüm parolaları öğrenecek ve bunları hemen kullanabilecektir ve karma değerleri depolarken yalnızca karma değerlerini bilecektir ​​Bu durumda, parola olarak orijinal verilere geri döndürülemez. Kimlik doğrulama işlemi sırasında, girilen parolanın hash değeri hesaplanır ve saklanan parola ile karşılaştırılır.

Bu durumda bir örnek, GNU / Linux işletim sistemi ve Microsoft Windows XP'dir. Kullanıcı hesaplarından yalnızca parolaların karma değerlerini depolarlar.

Veri alımını hızlandırmak

Örneğin veri tabanına metin alanları yazarken bunların hash kodları hesaplanabilir ve veriler bu hash koduna karşılık gelen bölüme yerleştirilebilir. Ardından, veri ararken, önce metnin karma kodunu hesaplamanız gerekecek ve bunları hangi bölümde aramanız gerektiği hemen anlaşılacak, yani tüm veritabanında arama yapmanız gerekmeyecek, ancak yalnızca bölümlerinden birinde (bu, aramayı büyük ölçüde hızlandırır).

Bu durumda günlük hash analogu, kelimelerin sözlükte alfabetik olarak yerleştirilmesi olabilir. Bir kelimenin ilk harfi hash kodudur ve arama yaparken sözlüğün tamamına değil, sadece gerekli harfe bakarız.

Algoritma Listesi

  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
  • RIPEMD-160
  • RIPEMD-320
  • Snefru
  • Kaplan (Girdap
  • IP İnternet Sağlama Toplamı (RFC 1071)

Bağlantılar

Wikimedia Vakfı. 2010.

Diğer sözlüklerde "karma işlevinin" ne olduğunu görün:

    Özet fonksiyonu- Girdi değerinin farklı boyutları için sabit boyutta bir çıktıya sahip olan bir işlev. karma işlevi - Bilgi teknolojisi konuları ... ... Teknik çevirmen kılavuzu Vikipedi

    Bir karma tablo, ilişkisel bir dizinin arabirimini uygulayan, yani çiftleri (anahtar, değer) saklamanıza ve üç işlem gerçekleştirmenize izin veren bir veri yapısıdır: yeni bir çift ekleme işlemi, bir arama işlemi ve çıkarma işlemi. bir çift tarafından ... ... Wikipedia

    Bir karma işlevi çarpışmasına iki farklı girdi veri bloğu denir ve çoğu karma işlevi için Çarpışmalar vardır, ancak "iyi" karma işlevler için bunların oluşma sıklığı teorik minimuma yakındır. Bazı özel durumlarda ... Wikipedia

    Karma (bazen karma), rastgele uzunluktaki bir girdi veri dizisini sabit uzunlukta bir çıktı bit dizisine dönüştürür. Bu tür dönüşümlere ayrıca karma işlevler veya katlama işlevleri denir ve bunların sonuçları ... ... Wikipedia

    1995 yılında Ros Anderson ve Eli Biham tarafından geliştirilen Tiger hash fonksiyonu. Tiger, 64-bit bilgisayarlarda özellikle hızlı çalışacak şekilde tasarlanmıştır. Tiger'ın patent kısıtlaması yoktur, olduğu gibi serbestçe kullanılabilir ... ... Wikipedia

İncelediğimiz arama algoritmaları genellikle soyut bir karşılaştırma işlemine dayanır. Bu serinin dışında, "Sembol tabloları ve ikili arama ağaçları" bölümünde açıklanan tahsisli arama yöntemi, esas olarak, i anahtarına sahip bir öğenin, tablonun i-inci konumunda depolandığı ve ona doğrudan erişime izin verdiği öne çıkıyor. . Aramayı dağıtma, karşılaştırma işleminin işlenenleri yerine anahtarların değerlerini dizi indeksleri olarak kullanır; yöntemin kendisi, anahtarların tablo dizinleriyle aynı aralıktan farklı tamsayılar olduğu gerçeğine dayanır. Bu bölümde, anahtarların bu kadar uygun özelliklere sahip olmadığı daha tipik arama uygulamalarında kullanılan gelişmiş bir dağıtım araması olan karmaya bakacağız. Bu yaklaşımı kullanmanın sonucu, karşılaştırmaya dayalı yöntemlerden tamamen farklıdır - arama anahtarlarını öğelerdeki anahtarlarla karşılaştırarak sözlük veri yapıları arasında hareket etmek yerine, tablodaki öğelere doğrudan bir aritmetik yaparak erişmeye çalışırız. anahtarların tablo adreslerine dönüştürülmesi.

Hashing arama algoritmalarının iki farklı bölümü vardır. İlk adım, arama anahtarını tablodaki bir adrese dönüştüren bir karma işlevi hesaplamaktır. İdeal olarak, farklı anahtarlar farklı adreslerle eşlenir, ancak genellikle iki veya daha fazla farklı anahtar tabloda aynı adresi verebilir. Bu nedenle, karma aramanın ikinci kısmı, bu tür anahtarları işleyen çarpışma çözümleme sürecidir. Bu bölümde inceleyeceğimiz çakışma çözme tekniklerinden biri bağlantılı listeler kullanır, bu nedenle önceden arama anahtarı sayısını tahmin etmenin zor olduğu dinamik durumlarda doğrudan kullanım bulur. Diğer iki çarpışma çözünürlüğü yöntemi, yüksek verimöğeler sabit bir dizide saklanırken arama yapın. Tablonun boyutunun önceden tahmin edilemediği durumlarda bile kullanılabilecek şekilde bu yöntemlerin nasıl geliştirilebileceğine bakacağız.

Hashing, zaman ve hafıza arasındaki dengeye iyi bir örnektir. Kullanılan bellek miktarında herhangi bir sınırlama olmasaydı, herhangi bir arama, bir tahsis aramasında olduğu gibi, anahtarı bir bellek adresi olarak kullanarak yalnızca bir bellek erişimiyle gerçekleştirilebilirdi. Bununla birlikte, uzun tuşlar çok büyük miktarda bellek gerektirebileceğinden, bu ideal durum genellikle elde edilemez. Öte yandan, herhangi bir kısıtlama olmasaydı kurşun zamanı, sıralı arama yöntemini kullanarak minimum miktarda bellekle idare edilebilir. Hashing, hem bellek hem de zamanın kabul edilebilir bir miktarını kullanmanın ve bu iki uç nokta arasında bir denge kurmanın bir yoludur. Özellikle, kodu yeniden yazmak veya başka algoritmalar seçmek yerine tablonun boyutunu değiştirerek herhangi bir denge sağlanabilir.

Hashing, bilgisayar bilimindeki klasik problemlerden biridir: çeşitli algoritmaları detaylı olarak incelenmiştir ve yaygın olarak kullanılmaktadır. Göreceğiz ki, gevşek varsayımlarla, tablonun boyutu ne olursa olsun, sabit zamanlı sembol tablolarında bul ve ekle işlemlerini desteklemeyi umabiliriz.

Bu beklenen değer, herhangi bir sembol tablosu uygulaması için optimum teorik performanstır, ancak iki ana nedenden dolayı karma hala her derde deva değildir. Başta, kurşun zamanı uzun tuşların kullanıldığı gerçek uygulamalarda önemli olabilecek anahtar uzunluğuna bağlıdır. İkincisi, hash, seçme veya sıralama gibi diğer sembol tablosu işlemlerinin verimli uygulamalarını sağlamaz. Bu bölümde, bu ve diğer konulara daha yakından bakacağız.

Hash fonksiyonları

Her şeyden önce, anahtarları tablo adreslerine dönüştüren bir hash fonksiyonu hesaplama problemini çözmek gerekir. Genellikle, bu aritmetik hesaplamanın uygulanması zor değildir, ancak yine de çeşitli ince tuzaklara düşmemek için dikkatli olmanız gerekir. M öğeleri içerebilen bir tablonuz varsa, anahtarları aralıktaki tam sayılara dönüştüren bir işleve ihtiyacınız vardır. İdeal bir özet fonksiyonunun hesaplanması kolay olmalı ve rastgele bir fonksiyona benzemelidir: herhangi bir argüman için sonuçlar bir anlamda eşit olasılıklı olmalıdır.

Karma işlevi, anahtarın türüne bağlıdır. Açıkça söylemek gerekirse, olası her tür anahtar için ayrı bir karma işlevi gereklidir. Verimliliği artırmak için, genellikle açık tür dönüşümlerinden kaçınmak ve bunun yerine bir makine sözcüğündeki anahtarların ikili gösterimini aritmetik hesaplamalarda kullanılabilecek bir tamsayı olarak ele alma fikrine dönmek arzu edilir. Hashing, yüksek seviyeli dillerden önce gelir - ilk bilgisayarlarda bir değeri bir dize anahtarı veya bir tamsayı olarak ele almak yaygındı. Bazı üst düzey dillerde, belirli bir bilgisayardaki anahtarların temsiline bağlı programlar oluşturmak zordur, çünkü bu tür programlar doğal olarak makineye bağımlıdır ve bu nedenle başka bir bilgisayara aktarılması zordur. Karma işlevleri tipik olarak anahtardan tamsayıya dönüştürme işlemine bağlıdır, bu nedenle karma uygulamalarında hem makine bağımsızlığını hem de verimliliği sağlamak zor olabilir. Tipik olarak, basit tamsayı veya kayan nokta anahtarları yalnızca bir makine işlemiyle dönüştürülebilir, ancak dize anahtarları ve diğer bileşik anahtar türleri daha pahalıdır ve verimliliğe daha fazla dikkat edilmesini gerektirir.

Muhtemelen en basit durum, anahtarların sabit bir aralıktaki kayan nokta sayıları olmasıdır. Örneğin, anahtarlar 0'dan büyük ve 1'den küçük sayılarsa, bunları M ile çarpabilir, sonucu daha düşük tam sayıya yuvarlayabilir ve 0 ile M - 1 aralığında bir adres alabilirsiniz; böyle bir örnek Şekil l'de gösterilmektedir. 14.1. Anahtarlar s'den büyük ve t'den küçükse, s'nin çıkarılması ve ts'ye bölünmesi, 0 ile 1 arasındaki değer aralığına getirilmesi ve ardından M ile çarpılmasıyla tablodaki adresi almak için ölçeklenebilirler. .


Pirinç. 14.1.

0 ile 1 aralığındaki kayan nokta sayılarını, boyutu 97 olan bir tablonun dizinlerine dönüştürmek için bu sayılar 97 ile çarpılır. Bu örnekte, üç çarpışma vardı: 17, 53 ve 76 dizinleri için. Hash değerleri ​​ anahtarın en yüksek bitleri tarafından belirlenir, en az anlamlı bitler herhangi bir rol oynamaz. Bir hash fonksiyonunun tasarım hedeflerinden biri, hesaplama sırasında her bitin hesaba katılması için bu dengesizliği düzeltmektir.

Anahtarlar w-bit tamsayılarsa, kayan noktalı sayılara dönüştürülerek 2 w'ye bölünerek 0 ile 1 arasında kayan noktalı sayılar elde edilir ve daha sonra önceki paragrafta olduğu gibi M ile çarpılır. Kayan nokta işlemleri uzun sürüyorsa ve sayılar taşmaya neden olacak kadar büyük değilse, tamsayı aritmetik işlemleri kullanılarak aynı sonuç elde edilebilir: anahtarı M ile çarpmanız ve ardından w basamaklarıyla sağa kaydırma yapmanız gerekir. 2 w'ye bölmek (veya çarpma taşarsa, kaydırmayı ve ardından çarpmayı yapın). Bu tür yöntemler, anahtarlar aralıkta eşit olarak dağıtılmadığı sürece, karma değeri yalnızca anahtarın baştaki basamakları tarafından belirlendiğinden, karma için işe yaramaz.

W-bit tamsayılar için daha basit ve daha verimli bir yöntem - belki de en yaygın kullanılan karma yöntemlerinden biri - M boyutunda bir asal sayı tablosu seçmek ve k'nin kalanını M ile hesaplamak, yani. h (k) = k mod M, herhangi bir k tamsayı anahtarı için. Bu fonksiyona modüler hash fonksiyonu denir. Hesaplanması çok kolaydır (C++'da k% M) ve M'den daha düşük değerler arasında anahtar değerlerin eşit dağılımını sağlamak için etkilidir. Şekil 2'de küçük bir örnek gösterilmektedir. 14.2.


Pirinç. 14.2.

Sağdaki üç sütun, aşağıdaki işlevleri kullanarak solda listelenen 16 bitlik anahtarların karma işleminin sonucunu gösterir:

v% 97 (sol)

v% 100 (orta) ve

(int) (a * v)% 100 (sağ),

burada a = .618033. Bu fonksiyonlar için tablo boyutları sırasıyla 97, 100 ve 100'dür.Değerler rastgele görünüyor (tuşlar rastgele olduğu için). İkinci işlev (v% 100), anahtarların yalnızca en sağdaki iki basamağını kullanır ve bu nedenle rastgele olmayan anahtarlar için düşük performans gösterebilir.

Modüler karma, kayan nokta anahtarları için de geçerlidir. Anahtarlar küçük bir aralıktaysa, w-bit tamsayıları elde etmek için onları 0 ile 1,2 w arasındaki sayılara ölçekleyebilir ve ardından modüler bir karma işlevi kullanabilirsiniz. Diğer bir seçenek, anahtarın ikili gösterimini modüler karma işlevinin (varsa) işleneni olarak kullanmaktır.

Modüler karma, anahtarları oluşturan bitlere erişim olduğunda, bunlar makine sözcük tamsayıları, sözcük paketli karakter dizileri veya mümkün olan başka herhangi bir şey olduğunda kullanılır. Bir makine sözcüğüne paketlenmiş rastgele karakterler dizisi, kodlama için tüm bitler kullanılmadığından, rastgele tamsayı anahtarlarıyla tam olarak aynı değildir. Ancak bu türlerin her ikisi de (ve bir makine sözcüğüne sığacak şekilde kodlanmış diğer herhangi bir anahtar türü), küçük bir tablodaki rastgele dizinler gibi görünecek şekilde yapılabilir.

Modüler hashleme için M boyutu olarak bir asal hash tablosu seçmenin ana nedeni Şekil 2'de gösterilmektedir. 14.3. Bu 7 bitlik karakter verisi örneği, anahtarı, anahtardaki her karakter için bir basamak olan 128 tabanlı bir sayı olarak ele alır. Şimdi 1816567 sayısına karşılık gelir ve şu şekilde de yazılabilir:

çünkü ASCII'de n, o ve w karakterleri 1568 = 110, 1578 = 111 ve 1678 = 119 sayılarına karşılık gelir. Bu anahtar türü için M = 64 tablo boyutunun seçimi başarısızdır, çünkü 64'ün (veya 128) katları olan değerlerin x'e eklenmesi x mod 64'ün değerini değiştirmez - herhangi bir anahtar için karma değer bu anahtarın son 6 bitinin değeridir. Elbette iyi bir hash fonksiyonu, özellikle sembolik tuşlar için anahtarın tüm rakamlarını dikkate almalıdır. M, 2'nin katı olan bir faktör içerdiğinde de benzer durumlar ortaya çıkabilir. Bundan kaçınmanın en basit yolu, M olarak bir asal sayı seçmektir.


Pirinç. 14.3.

Bu tablonun her satırı şunları içerir: 3 harfli bir kelime, bu kelimenin sekizlik ve ondalık gösterimde 21 bitlik bir sayı olarak ASCII temsili ve 64 ve 31 tablo boyutları (en sağdaki iki sütun) için standart modüler karma işlevleri. Tablo boyutu 64, hash değerini elde etmek için anahtarın yalnızca en sağdaki bitleri kullanıldığından ve ortak dilin sözcüklerindeki harfler eşit olmayan bir şekilde dağıldığından istenmeyen sonuçlara yol açar. Örneğin, y harfi ile biten tüm kelimelerin hash değeri 57'dir. Buna karşılık, 31'lik basit bir değer, boyutun yarısından büyük bir tabloda daha az çarpışmaya neden olur.

Modüler karmanın uygulanması çok kolaydır, ancak tablonun boyutunun bir asal sayı olması gerekir. Bazı uygulamalar için, bilinen küçük bir asal sayıyla yetinebilir veya gerekli tablo boyutuna yakın bir bilinen asal sayılar listesine bakabilirsiniz. Örneğin, 2 t - 1'e eşit sayılar şu durumlarda asaldır: t = 2, 3, 5, 7, 13, 17, 19 ve 31(ve t'nin başka hiçbir değeri için< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не единственная причина, по которой размер таблицы стоит сделать простым числом; еще одна причина рассматривается в разделе 14.4.


Pirinç. 14.4.

2 n'den küçük en büyük asal sayıların bu tablosu , tablo boyutunun bir asal sayı olmasını istediğinizde bir karma tabloyu dinamik olarak ayırmak için kullanılabilir. Kapsanan aralıktaki herhangi bir pozitif değer için, bu tablo, ondan 2 katından daha az farklı olan bir asal sayıyı belirlemek için kullanılabilir.

Tamsayı anahtarlarını kullanmanın başka bir yolu da çarpmalı ve modüler yöntemleri birleştirmektir: anahtarı 0 ile 1 arasında bir sabitle çarparsınız ve ardından modulo M'yi bölersiniz. Başka bir deyişle, bir işlev kullanmanız gerekir. M değerleri ile anahtarın etkin yarıçapı arasında teorik olarak anormal davranışa yol açabilecek bir ilişki vardır, ancak keyfi bir a değeri kullanırsanız, gerçek bir uygulamada neredeyse hiç sorun olmaz. Genellikle φ = 0.618033 ... (altın oran) değeri a olarak seçilir.

Bu konuda, özellikle kaydırma ve maskeli vurgulama gibi verimli makine talimatları kullanılarak uygulanabilen karma işlevleri olmak üzere birçok başka varyasyon araştırılmıştır (bağlantılar bölümüne bakın).

Sembol tablolarını kullanan birçok uygulamada, tuşlar sayı değildir ve mutlaka kısa olmaları gerekmez; daha sıklıkla, oldukça uzun olabilen alfasayısal dizelerdir. Peki averylongkey gibi bir kelimenin hash fonksiyonunu nasıl hesaplarsınız?

7 bitlik ASCII kodunda, bu kelime 84 bitlik sayı \ start (align *) 97 \ cdot 128 ^ (11) & + 118 \ cdot 128 ^ (10) + 101 \ cdot 128 ^ (9) + 114'e karşılık gelir. \ 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), \ bitiş (hizalama *),

çoğu bilgisayarda normal aritmetik işlevleri yerine getirmek için çok büyük. Ve çoğu zaman çok daha uzun tuşları kullanmanız gerekir.

Uzun anahtarlar için modüler karma işlevini hesaplamak için, bunlar öbek öbek dönüştürülür. Modül işlevinin aritmetik özelliklerinden yararlanabilir ve Horner'ın algoritmasını kullanabilirsiniz (bkz. bölüm 4.9 "Özet veri türleri"). Bu yöntem, tuşlara karşılık gelen sayıları yazmanın başka bir yolunu temel alır. Bu örnek için şu ifadeyi yazın: \başlangıç ​​(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. \ bitiş (hizalama *)

Yani dizenin karakter kodlamasına karşılık gelen ondalık sayı, ona soldan sağa bakarak, biriken değeri 128 ile çarparak ve ardından bir sonraki karakterin kod değerini ekleyerek hesaplanabilir. Uzun bir dizi durumunda, bu hesaplama yöntemi sonunda bir bilgisayarın hayal edebileceğinden daha büyük bir sayıya yol açacaktır. Bununla birlikte, M'ye bölünmesinden yalnızca (küçük) bir kalan gerektiğinden bu sayıya gerek yoktur. Sonuç, büyük bir birikmiş değer kaydedilmeden bile elde edilebilir, çünkü hesaplamada herhangi bir zamanda, M'nin bir katını atabilirsiniz - her çarpma ve toplama için, modulo M'nin yalnızca kalanını saklamanız gerekir. Sonuç, uzun bir hesaplama fırsatımız varmış gibi sonuç aynı olacaktır. numaralandırın ve ardından bölme işlemini gerçekleştirin (bkz. Alıştırma 14.10). Bu gözlem, uzun diziler için modüler hash fonksiyonlarını hesaplamanın basit bir aritmetik yoluna götürür - Program 14.1'e bakınız. Bu program son bir numara kullanır: 128 tabanı yerine 127 asal sayısını kullanır. Bu değişikliğin nedeni bir sonraki paragrafta tartışılacaktır.

Horner yöntemini (anahtardaki her karakter için bir veya iki aritmetik işlem) kullanarak modüler karma ile kabaca aynı maliyette karma işlevlerini hesaplamanın birçok yolu vardır. Rastgele anahtarlar için bu yöntemler pratik olarak aynıdır, ancak gerçek anahtarlar nadiren rastgeledir. Gerçek anahtarları düşük bir maliyetle rastgele hale getirme yeteneği, rastgele karma algoritmaların dikkate alınmasına yol açar, çünkü anahtar dağıtımından bağımsız olarak bir tabloda rastgele dizinler oluşturan karma işlevlere ihtiyacımız vardır. Modüler karma tanımına harfi harfine uymanız gerekmediğinden rastgeleleştirme kolaydır - M'den küçük bir tamsayı hesaplamak için anahtarın tüm basamaklarını kullanmanız yeterlidir.

Program 14.1. Dize tuşları için karma işlevi

M = 96 ve a = 128 (üst),

M = 97 ve a = 128 (merkez) ve

M = 96 ve a = 127 (alt)

İlk durumdaki eşit olmayan dağılım, hem tablo boyutunun hem de faktörün 32'nin katları olması nedeniyle harflerin eşit olmayan kullanımının ve eşitsizliğin kalıcılığının bir sonucudur. Diğer iki örnek, tablo boyutu ve faktörü nedeniyle rastgele görünüyor. asal sayılardır.

Program 14.1 bunu yapmanın bir yolunu gösterir: 2'nin kuvveti yerine basit bir taban ve dizginin ASCII temsiline karşılık gelen bir tamsayı kullanmak. İncirde. 14.5 şek. Şekil 14.5, bu değişikliğin tipik dizi anahtarlarının dağılımını nasıl iyileştirdiğini gösterir. Teoride, Program 14.1 tarafından oluşturulan karma değerler, 127'nin katları olan tablo boyutları için kötü sonuçlar verebilir (pratikte bu muhtemelen neredeyse görünmez olacaktır); Rastgele bir algoritma oluşturmak için çarpanın değeri rastgele seçilebilir. Daha da verimli bir yaklaşım, hesaplamada katsayıların rastgele değerlerini ve her bir tuş basamağı için farklı rastgele değerleri kullanmaktır. Bu yaklaşım, evrensel karma adı verilen rastgele bir algoritma verir.

Teoride, mükemmel bir evrensel karma işlevi, M boyutundaki bir tabloda iki farklı anahtar arasındaki çarpışma olasılığının tam olarak 1 / M olduğu bir işlevdir. Program 14.1'de a katsayısı olarak sabit bir keyfi değerin değil, rastgele farklı değerler dizisinin kullanılmasının, modüler hash'i evrensel bir hash fonksiyonuna dönüştürdüğü kanıtlanabilir. Ancak, anahtardaki her karakter için yeni bir rastgele sayı üretmenin maliyeti genellikle kabul edilemez. Uygulamada, Program 14.1'de gösterilen ödünleşim, her bir anahtar sembolü için bir dizi farklı rasgele sayı saklanarak değil, basit bir sözde rasgele dizi üreterek katsayıları değiştirerek elde edilebilir.

Özetlemek gerekirse, soyut bir sembol tablosunu uygulamak için hash'i kullanmak için, önce soyut tipteki arayüzü, M tablosunun boyutundan daha küçük negatif olmayan tamsayılara anahtarları eşleyen bir hash işlemini içerecek şekilde genişletmeniz gerekir.

Sorular:

1. Hash fonksiyonu kavramı.

2. Bir karma işlevi oluşturmak için blok şifreleme algoritmalarını kullanma.

3. Hash fonksiyonlarının oluşumu için algoritmaların gözden geçirilmesi.

1. Hash fonksiyonu konsepti

Özet fonksiyonu(hash işlevi), rastgele uzunluktaki bir dize için bir tamsayı değeri veya sabit uzunlukta başka bir dize hesaplayan matematiksel veya başka bir işlevdir. Matematiksel olarak şöyle yazılabilir:

H = H (M) ,

nerede m - bazen denilen orijinal mesaj prototip , a H - hash değeri olarak adlandırılan sonuç (ve ayrıca hash kodu veya mesajları özetlemek(İngilizceden. mesaj özeti)).

Karma işlevinin anlamı, ön görüntünün karakteristik özelliğini - karma işlevinin değerini belirlemektir. Bu değer genellikle 64 veya 128 bit gibi belirli bir sabit boyuta sahiptir. Karma kod, herhangi bir sorunu çözmek için daha fazla analiz edilebilir. Bu nedenle, örneğin, verileri karşılaştırmak için karma kullanılabilir: iki veri dizisinin farklı karma kodları varsa, dizilerin farklı olması garanti edilir; eğer aynılarsa, diziler büyük ihtimalle aynıdır. Genel durumda, hash fonksiyonlarının değer sayısının her zaman giriş verisinin varyant sayısından daha az olması nedeniyle orijinal veri ile hash kodu arasında bire bir yazışma yoktur. Bu nedenle aynı hash kodlarını veren birçok girdi mesajı vardır (bu tür durumlara çarpışmalar ). Çarpışma olasılığı, özet fonksiyonlarının kalitesini değerlendirmede önemli bir rol oynar.

Hash fonksiyonları modern kriptografide yaygın olarak kullanılmaktadır.

En basit karma işlevi, "sum modulo 2" işlemi kullanılarak şu şekilde oluşturulabilir: giriş dizesini alırız, modulo 2'nin tüm baytlarını ekleriz ve sonuç baytını karma işlevinin değeri olarak döndürürüz. Bu durumda özet değerinin uzunluğu, giriş mesajının boyutundan bağımsız olarak 8 bit olacaktır.

Örneğin, orijinal sayısallaştırılmış mesajın aşağıdaki gibi olduğunu varsayalım (onaltılık biçimde):

2 B1 4 bir9 5 FE4

Mesajı ikili forma çevirelim, baytları alt alta yazalım ve bitleri her sütuna ekleyelim modulo 2:

0010 1011

0001 0100

1010 1001

0101 1111

1110 0100

——————-

0010 1101

Sonuç: 0010 1101 veya 2 NS ve hash fonksiyonunun değeri olacaktır.

Bununla birlikte, böyle bir karma işlevi, sağlama toplamı değerini değiştirmeden imzalı bir mesajın içeriğini değiştirmek oldukça kolay olduğundan, örneğin bir elektronik imza oluşturmak gibi kriptografik amaçlar için kullanılamaz.

Bu nedenle düşünülen hash fonksiyonu kriptografik uygulamalar için uygun değildir. Kriptografide, aynı karma değerine sahip iki ön görüntü oluşturmak zorsa ve ayrıca işlevin çıktısı açıkça girdiye bağlı değilse, bir karma işlevi iyi olarak kabul edilir.

Kriptografik hash fonksiyonları için temel gereksinimleri formüle edelim:

· Karma işlevi, herhangi bir boyuttaki bir mesaja uygulanabilir olmalıdır;

· Fonksiyonun değerinin hesaplanması yeterince hızlı yapılmalıdır;

Hash fonksiyonunun bilinen bir değeri ile uygun bir ön görüntü bulmak zor (neredeyse imkansız) olmalıdır. m ;

Bilinen bir mesajla m başka bir mesaj bulmak zor olmalı M ' orijinal mesajla aynı hash değerine sahip;

· Aynı hash değerine sahip herhangi bir rastgele farklı mesaj çifti bulmak zor olmalıdır.

Tüm bu gereksinimleri karşılayan bir karma işlevi oluşturmak kolay bir iş değildir. Unutulmamalıdır ki, fonksiyonun girişinde keyfi boyutta veri alınır ve farklı boyutlardaki veriler için hash sonucunun aynı olmaması gerekir.

Şu anda pratikte fonksiyonlar, girdi mesajını blok blok işleyen ve hash değerini hesaplayan hash fonksiyonları olarak kullanılmaktadır. Selam her blok için ben formun bağımlılıklarına göre giriş mesajı

h ben = H (M ben, h ben-1),

nerede ben-1 - önceki girdi verisi bloğu için hash fonksiyonu hesaplanırken elde edilen sonuç.

Sonuç olarak, hash fonksiyonunun çıktısı h n hepsinin bir fonksiyonudur n giriş mesajının blokları.

2. Bir karma işlevi oluşturmak için blok şifreleme algoritmalarını kullanma.

Karma işlevi olarak simetrik bir blok şifreleme algoritması kullanılabilir. Kullanılan blok algoritması kriptografik olarak güvenli ise, buna dayalı hash fonksiyonu da güvenilir olacaktır.

Bir karma kod elde etmek için blok algoritmasını kullanmanın en basit yolu, mesajı CBC modunda şifrelemektir ( Şifre Blok Zincirleme - Şifreli metin bloklarını zincirleme). Bu durumda mesaj, uzunluğu şifreleme algoritması bloğunun uzunluğuna eşit olan bir blok dizisi olarak sunulur. Gerekirse, istenen uzunlukta bir blok elde etmek için son blok sağda sıfırlarla doldurulur. Karma değeri, son şifrelenmiş metin bloğu olacaktır. Güvenilir bir blok şifreleme algoritması kullanılması şartıyla elde edilen hash değeri aşağıdaki özelliklere sahip olacaktır:

· Şifreleme anahtarını bilmeden belirli bir açık bilgi dizisi için hash değerini hesaplamak neredeyse imkansızdır;

· Şifreleme anahtarını bilmeden hash fonksiyonunun belirli bir değeri için açık veri seçmek pratikte imkansızdır.

Bu şekilde oluşturulan hash değerine genellikle denir. taklit ek veya doğrulayıcı ve mesajın bütünlüğünü kontrol etmek için kullanılır. Bu nedenle, ekleme kimliğine bürünme, açık verilere ve gizli anahtar bilgilerine bağlı olan bir kontrol kombinasyonudur. Simüle edilmiş bir ek kullanmanın amacı, bilgi dizisindeki tüm kazara veya kasıtlı değişiklikleri tespit etmektir. Giriş mesajını işlerken hash fonksiyonu tarafından elde edilen değer, mesajın doğru olduğu bilindiği anda mesaja eklenir. Alıcı, alınan mesajın kimliğine bürünülmesini hesaplayarak ve güvenli bir şekilde iletilmesi gereken alınan hash koduyla karşılaştırarak mesajın bütünlüğünü doğrular. Bu tür güvenli yöntemlerden biri, kimliğe bürünmenin gönderenin özel anahtarıyla şifrelenmesi olabilir, yani. imza oluşturma. Gönderici ve alıcı ortak bir simetrik şifreleme anahtarına sahipse, alınan karma kodu simetrik bir şifreleme algoritması ile şifrelemek de mümkündür.

Simüle edilmiş bir kesici uç elde etmek ve kullanmak için belirtilen süreç, yerel GOST 28147-89 standardında açıklanmıştır. Standart, iletilen mesajın bütünlüğünü kontrol etmek için şifre bloklarını birleştirme modunda tüm mesajın şifreleme işleminin çıkışında alınan bloğun en az anlamlı 32 bitinin kullanılmasını önerir. Aynı şekilde, herhangi bir blok simetrik şifreleme algoritması, taklit bir ekleme oluşturmak için kullanılabilir.

Bir karma kod oluşturmak için bir blok şifre kullanmanın bir başka olası yolu da aşağıdaki gibidir. Orijinal mesaj sırayla bloklar halinde işlenir. Son blok sıfırlarla doldurulur, gerekirse mesajın uzunluğu son bloğa ikili sayı olarak eklenir. Her aşamada, bir önceki aşamada elde edilen hash değerini, mevcut mesaj bloğunu anahtar olarak alarak şifreliyoruz. Alınan son şifreli değer, nihai karma sonucu olacaktır.

Bu nedenle, olağan mesaj şifreleme şeması m blok şifre kullanarak F anahtarda İLE olarak kaydettik E = f (M, K) , ardından karma kodunu elde etme şeması H yukarıdaki algoritmaya göre olarak temsil edilebilir

Selam = F ( Selam -1 , m )

İlk karma kod olarak saat 0 biraz sabit al. Şifreleme, basit üzerine yazma modunda gerçekleştirilir. Belirtilen yöntemi kullanırken, blok boyutu anahtar uzunluğu ile aynıdır ve hash değerinin boyutu blok uzunluğu olacaktır.

Blok şifreyi basit değiştirme modunda kullanmanın başka bir yolu da mümkündür: mesaj öğeleri, önceki adımda elde edilen karma değerlerle şifrelenir:

Selam = F ( m , Selam -1 ,)

Aslında, bir hash işlevi oluşturmak için bir blok şifreleme kullanmak için birkaç olası şema daha vardır. İzin vermek ben - orijinal mesajın bloğu, Selam - üzerindeki hash fonksiyonunun değeri ben -inci aşama, F - basit değiştirme modunda kullanılan blok şifreleme algoritması - toplama işlemi modulo 2. Ardından, örneğin, bir karma işlevi oluşturmak için aşağıdaki şemalar mümkündür:

Tüm bu şemalarda, üretilen özet değerinin uzunluğu şifreli bloğun uzunluğuna eşittir. Tüm bunların yanı sıra, hash değerlerini hesaplamak için blok şifreleme algoritmasını kullanmaya yönelik diğer bazı şemalar pratikte uygulanabilir.

Blok algoritmaları temelinde tasarlanan hash fonksiyonlarının ana dezavantajı, nispeten düşük işlem hızıdır. Gerekli şifreleme gücü, giriş verileri üzerinde daha az sayıda işlemle elde edilebilir. Daha hızlı karma algoritmalar vardır (bunların en yaygınları MD5, SHA-1, SHA-2 ve GOST R 34.11-94'tür).

3. Hash fonksiyonlarının oluşumu için algoritmaların gözden geçirilmesi.

Şu anda, hash fonksiyonunun hesaplanması için çeşitli özel algoritmalar önerilmiş ve pratik olarak kullanılmaktadır. En ünlü algoritmalar MD5, SHA-1, SHA-2 ve SHA'nın diğer sürümlerinin yanı sıra GOST R 34.11-94'te belirtilen yerel algoritmadır.

algoritma MD5 yirminci yüzyılın 90'lı yıllarının başlarında, MD4 karma işlevini oluşturmak için algoritmanın geliştirilmesinin bir sonucu olarak ortaya çıktı. "MD" adındaki karakterler, Mesaj Özeti anlamına gelir - mesajın bir özeti. MD4 ve MD5 algoritmalarının yazarı R. Rivest'tir. MD5 kullanımının bir sonucu olarak, rastgele bir mesaj için 128 bitlik bir karma değer üretilir. Giriş verileri 512 bitlik bloklar halinde işlenir. Algoritma, basit aritmetik toplamanın yanı sıra temel mantıksal işlemleri (inversiyon, bağlaç, toplama modu 2, döngüsel kaydırmalar, vb.) kullanır. Algoritmanın bu temel işlevlerinin karmaşık tekrarı, işlemden sonraki sonucun iyi karışmasını sağlar. Bu nedenle, rastgele seçilen iki mesajın aynı hash koduna sahip olması olası değildir. MD5 algoritması aşağıdaki özelliğe sahiptir: alınan özet değerinin her biti, girişin her bir bitinin bir fonksiyonudur. MD5, 128 bitlik bir özet değeri için en güçlü özet işlevi olarak kabul edilir.

algoritma SHA Secure Hash Algorithm (Secure Hash Algorithm), ABD Ulusal Standartlar ve Teknoloji Enstitüsü (NIST) tarafından geliştirilmiş ve 1993 yılında ABD Federal Bilgi Standardı olarak yayınlanmıştır. SHA-1, MD5 gibi, MD4 algoritmasına dayanmaktadır. SHA-1, orijinal mesajı 512 bitlik bloklar halinde işlemeye dayalı olarak 160 bitlik bir karma değer üretir. SHA-1 algoritması ayrıca basit mantıksal ve aritmetik işlemleri kullanır. SHA-1 ve MD5 arasındaki en önemli fark, SHA-1 karma değerinin MD5 karma değerinden 32 bit daha uzun olmasıdır. Her iki algoritmanın da kriptanaliz için aynı karmaşıklıkta olduğunu varsayarsak, SHA-1 daha sağlam bir algoritmadır. Bir kaba kuvvet saldırısı (ön saldırı) kullanarak, belirli bir karma koda sahip rastgele bir mesaj oluşturmak daha zordur ve aynı karma koda sahip iki mesaj oluşturmak da daha zordur.

2001 yılında, ABD Ulusal Standartlar ve Teknoloji Enstitüsü, SHA-1'den daha uzun bir karma uzunluğuna sahip bir standart olarak üç karma işlevi benimsemiştir. Bu karma işlevler genellikle SHA-2 veya SHA-256, SHA-384 ve SHA-512 olarak adlandırılır (ad, algoritmalar tarafından oluşturulan karma kodunun uzunluğunu belirtir). Bu algoritmalar sadece üretilen hash kodunun uzunluğunda değil, aynı zamanda kullanılan dahili fonksiyonlarda ve işlenen bloğun uzunluğunda da farklılık gösterir (SHA-256 için blok uzunluğu 512'dir ve SHA-384 ve SHA-512 için, blok uzunluğu 1024 bittir). SHA algoritmasındaki kademeli iyileştirmeler, kriptografik gücünde bir artışa yol açar. Ele alınan algoritmalar arasındaki farklılıklara rağmen, hepsi SHA-1 ve MD4'ün daha da geliştirilmiş halidir ve benzer bir yapıya sahiptir.

Rusya'da, karma işlevleri için yerel standart olan GOST R34.11-94 kabul edilmiştir. Yapısı, MD4 algoritmasına dayanan SHA-1,2 veya MD5 algoritmalarının yapısından oldukça farklıdır. GOST R 34.11-94 algoritması tarafından oluşturulan karma kodun uzunluğu 256 bittir. Algoritma, orijinal mesajı sırayla sağdan sola 256 bitlik bloklar halinde işler. Algoritmanın parametresi, karma başlatma vektörüdür - ayrıca 256 bit uzunluğunda rastgele bir sabit değer. GOST R 34.11-94 algoritması permütasyon, kaydırma, aritmetik toplama, modülo 2 toplama işlemlerini kullanır. Yardımcı bir fonksiyon olarak GOST 34.11-94, basit değiştirme modunda GOST 28147-89'a göre algoritmayı kullanır.

4. Hash gereksinimleri

Karma işlevi, bir dosyanın, mesajın veya bazı veri bloklarının özetini veya "parmak izini" almak için tasarlanmış tek yönlü bir işlevdir.

Hash kodu, fonksiyon tarafından üretilir. H :

h = H (M)

Nereye m keyfi uzunlukta bir mesajdır ve H sabit uzunlukta bir hash kodudur.

Bir hash fonksiyonunun mesaj doğrulayıcı olarak kullanılabilmesi için karşılaması gereken gereksinimleri göz önünde bulundurun. Hash fonksiyonunun çok basit bir örneğine bakalım. Ardından, bir karma işlevi oluşturmaya yönelik birkaç yaklaşımı analiz edeceğiz.

Özet fonksiyonu H iletilerin kimliğini doğrulamak için kullanılan aşağıdaki özelliklere sahip olmalıdır:

1. Karma işlevi H herhangi bir uzunluktaki bir veri bloğuna uygulanmalıdır.

2. Karma işlevi H sabit uzunlukta bir çıktı oluşturur.

3. H (M) nispeten kolay (polinom zamanında) herhangi bir değer için hesaplanır m .

4. Verilen herhangi bir karma kod değeri için H hesaplamak imkansız m öyle ki H (M) = h .

5. Herhangi bir veri için NS bunu bulmak hesapsal olarak imkansız

H (y) = H(x).

6. Rasgele bir çift bulmak hesaplama açısından imkansızdır ( NS , y ) öyle ki H (y) = H (x) .

İlk üç özellik, herhangi bir mesaj için bir hash kodu oluşturmak için hash fonksiyonunu gerektirir.

Dördüncü özellik, tek yönlü hash fonksiyonunun gerekliliğini tanımlar: belirli bir mesajdan bir hash kodu oluşturmak kolaydır, ancak belirli bir hash kodundan bir mesajı kurtarmak imkansızdır. Bu özellik, karma kimlik doğrulaması gizli bir değer içeriyorsa önemlidir. Gizli değerin kendisi gönderilmeyebilir, ancak hash işlevi tek yönlü değilse, düşman gizli değeri aşağıdaki gibi kolayca ortaya çıkarabilir. İletim durdurulduğunda, saldırgan bir mesaj alır. m ve hash kodu C = H (SAB || M) ... Saldırgan hash fonksiyonunu tersine çevirebilirse, bu nedenle, SAB || M = H-1 (C) ... Saldırgan artık bildiğinden ve m ve SAB || m , almak SAB oldukça basit.

Beşinci özellik, hash değeri bu mesajın hash değeriyle eşleşen başka bir mesajın bulunmamasını sağlar. Bu, şifrelenmiş bir karma kodu kullanırken kimlik doğrulayıcının kurcalanmasını önler. Bu durumda, düşman mesajı okuyabilir ve bu nedenle karma kodunu oluşturabilir. Ancak düşman gizli anahtara sahip olmadığı için, alıcının bulmaması için mesajı değiştirmenin bir yolu yoktur. Bu özellik karşılanmazsa, saldırgan aşağıdaki eylem dizisini gerçekleştirebilir: mesajı ve şifreli karma kodunu ele geçirmek, mesaj karma kodunu hesaplamak, aynı karma kodla alternatif bir mesaj oluşturmak, orijinal mesajı sahte bir mesajla değiştirmek . Bu mesajların hash kodları aynı olduğu için alıcı spoofing'i algılamayacaktır.

İlk beş özelliği karşılayan bir karma işlevine basit veya zayıf bir özet işlevi denir. Ek olarak altıncı özellik karşılanırsa, böyle bir fonksiyona güçlü bir özet fonksiyonu denir. Altıncı özellik, doğum günü saldırısı olarak bilinen bir saldırı sınıfına karşı koruma sağlar.

5. Basit hash fonksiyonları

Tüm hash fonksiyonları aşağıdaki gibi gerçekleştirilir. Bir giriş değeri (mesaj, dosya vb.) bir dizi olarak kabul edilir. n -bit blokları. Girilen değer, sırayla blok blok işlenir ve oluşturulur. m -bit karma kod değeri.

Karma işlevinin en basit örneklerinden biri, her bloğun bitsel XOR'sidir:

ben - ben hash kodunun th biti, 1 <= i <= n .

k - sayı n -bit giriş blokları.

b ij ben inci bit J blok.

Ardından, Y1, Y2, ..., YN + 1 şifreli bloklar oluşturmak için CBC modunda karma kodu da dahil olmak üzere tüm mesaj şifrelenir. SHS'nin tanımı gereği bizde:

Ancak XN + 1, karma koddur:

Bir önceki eşitlikteki terimler herhangi bir sırayla hesaplanabileceğinden, şifrelenmiş bloklar yeniden düzenlendiğinde hash kodu değişmeyecektir.

NIST tarafından önerilen orijinal standart, 64-bit mesaj bloklarına uygulanan basit XOR kullandı, ardından mesajın tamamı CBC modu kullanılarak şifrelendi.

"Doğum günü paradoksu"

Daha karmaşık özet işlevlerine bakmadan önce, analiz edilmesi gereken basit özet işlevlerine yönelik belirli bir saldırı vardır.

Sözde "doğum günü paradoksu" aşağıdaki gibidir. Hash fonksiyonunun çıktı değerlerinin sayısının H eşittir n ... sayı ne olmalı k yani belirli bir değer için x ve değerler Y1, , Yk en az bir Yi'nin eşitliği sağlama olasılığı

H (X) = H (Y)

0,5'ten büyük olacaktır.

Bir kişi için Y olasılık H (X) = H (Y) , eşittir 1 / n .

Buna göre, olasılık , eşittir 1 - 1 / n .

eğer yaratırsan k değerleri, o zaman hiçbirinin eşleşmeme olasılığı, bir değere karşılık gelen olasılıkların ürününe eşittir, yani. (1 - 1 / n) k .

Bu nedenle, en az bir eşleşme olasılığı

1 - (1 - 1 / n) k

Böylece, bunun için öğrendik m -bit hash kodunun seçilmesi yeterlidir 2m-1 böylece hash kodlarının eşleşme olasılığı 0,5'ten büyük olur.

Şimdi aşağıdaki sorunu düşünün: P (n, k) kümesinde olma olasılığı k her biri alabilen elemanlar n değerleri, aynı değerlere sahip en az iki tane vardır. Ne eşit olmalı k , ile P (n, k) daha fazla olurdu 0,5 ?

Öğeleri, kopya olmayacak şekilde seçmenin farklı yollarının sayısı

n (n-1) ... (n-k + 1) = n! / (n-k)!

Öğeleri seçmenin olası yollarının toplam sayısı nk

Yinelenenlerin olmaması olasılığı n! / (n-k)!n k

Yinelenenlerin olma olasılığı sırasıyla,

1 - n! / (N-k)!Nk P (n, k) = 1 - n! / ((n-k)! x nk) = 1 - (n x (n-1) x ... x (n-k-1)) / nk = 1 - [(n-1) / n x (n-2) / n x ... x (n-k + 1) / n] = 1 - [(1- 1 / n) x (1 - 2 / n) x ... x (1 - (k-1) / n)]

Hashcode uzunsa m biraz, yani alır 2m değerler, daha sonra

Bu sonuca "doğum günü paradoksu" denir, çünkü yukarıdaki mantığa göre, iki kişinin doğum günlerinin çakışma olasılığının 0,5'ten fazla olması için bir grupta sadece 23 kişinin olması gerekir. Bu sonuç şaşırtıcı görünüyor, belki de gruptaki her bir birey için doğum günlerinin gruptaki bir başkasının doğum gününe denk gelme olasılığı oldukça küçüktür.

Hash fonksiyonlarının özelliklerini ele almaya geri dönelim. 64 bitlik bir karma kod kullandığınızı varsayalım. Bunun hash kodu için tamamen yeterli ve dolayısıyla güvenli bir uzunluk olduğu düşünülebilir. Örneğin, şifrelenmiş hash kodu İLE BİRLİKTE karşılık gelen şifrelenmemiş mesajla iletilir m , o zaman düşmanın bulması gerekecek M ' öyle ki

H (M ") = H (M) ,

mesajı taklit etmek ve alıcıyı aldatmak için. Ortalama olarak, hash kodu ele geçirilen mesaja eşit olanı bulmak için düşmanın 263 mesajı geçmesi gerekir.

Bununla birlikte, "doğum günü paradoksuna" dayalı olarak çeşitli saldırılar mümkündür. Aşağıdaki strateji mümkündür:

1. Düşman yaratır 2 m / 2 her birinin belirli bir anlamı olan mesaj seçenekleri. Düşman, her biri sahte olan ve gerçek mesajın yerini alması amaçlanan aynı sayıda mesaj hazırlar.

2. İki mesaj grubu, aynı hash koduna sahip bir çift mesaj bulmak için karşılaştırılır. "Doğum günü paradoksuna" göre başarı olasılığı 0,5'ten büyüktür. Eşleşen bir çift bulunamazsa, bir eşleşme bulunana kadar ek orijinal ve sahte mesajlar oluşturulur.

3. Saldırgan, gönderene orijinal mesajı imza için sunar. Bu imza daha sonra alıcıya iletilmek üzere sahte varyanta eklenebilir. Her iki seçenek de aynı hashcode'a sahip olduğundan, aynı imza üretilecektir. Düşman, şifreleme anahtarını bilmeden bile başarıdan emin olacaktır.

Bu nedenle, 64 bitlik bir karma kod kullanılırsa, gerekli hesaplama karmaşıklığı 232 mertebesindedir.

Sonuç olarak, hash kodunun uzunluğunun yeterince büyük olması gerektiğini not ediyoruz. 64 bitlik bir uzunluk şu anda güvenli kabul edilmiyor. Daha tercihen uzunluk 100 bit mertebesindedir.

Şifreli blok zincirleme kullanma

Şifreli bloklar zincirinin oluşturulmasına dayanan, ancak gizli bir anahtar kullanılmadan çeşitli hash fonksiyonları vardır. Böyle bir hash fonksiyonu Rabin tarafından önerildi. İleti m sabit uzunlukta bloklara bölünmüş M1, M2,. ... ... , MN ve hash kodunu hesaplamak için DES gibi simetrik bir şifreleme algoritması kullanır G Aşağıdaki şekilde:

H 0 - başlangıç ​​değeri Selam = E Mi G = H N

Bu, CBC modunda şifreleme kullanmaya benzer, ancak bu durumda gizli anahtar yoktur. Herhangi bir basit karma işlevinde olduğu gibi, bu algoritma bir "doğum günü saldırısına" açıktır ve şifreleme algoritması DES ise ve yalnızca 64 bitlik bir karma kod oluşturulursa, sistem oldukça savunmasız kabul edilir.

"Doğum günü" gibi diğer saldırılar, düşmanın yalnızca bir mesaja ve ilgili şifreli karma koduna erişimi olsa ve birkaç çift mesaj ve şifreli karma kodu alamasa bile mümkün olabilir. Aşağıdaki senaryo mümkündür: Düşmanın, doğrulayıcı ile şifreli bir karma kod biçiminde mesajı ele geçirdiğini ve şifrelenmemiş karma kodunun bir uzunluğa sahip olduğu bilindiğini varsayalım. m bit. Ardından, düşman aşağıdaki eylemleri gerçekleştirmelidir:

Yukarıda açıklanan algoritmayı kullanarak şifrelenmemiş karma kodu hesaplayın G .

Şu şekilde sahte bir mesaj oluşturun: Q1, Q2,. ... ... , QN-2 .

Hesaplamak H ben = E Qi için 1 <= i <= N-2 .

· Oluşturmak 2 m / 2 rastgele bloklar NS ve bu tür her blok için NS hesaplamak ESKİ ... Ek oluştur 2 m / 2 rastgele blok Y ve her blok için Y hesaplamak DAY [G] , nerede NS - karşılık gelen şifre çözme işlevi E ... "Doğum günü paradoksuna" dayanarak, yüksek bir olasılıkla bu dizinin bloklar içereceğini söyleyebiliriz. NS ve Y öyle ki E X = D Y [Y] .

Mesaj oluşturmak Q1, Q2,. ... ... , QN-2, X, Y ... Bu mesajın bir hash kodu var G ve bu nedenle şifreli bir kimlik doğrulayıcı ile birlikte kullanılabilir.

Bu saldırı biçimi, ortadaki buluşma saldırısı olarak bilinir. Çeşitli çalışmalar, blok zinciri yaklaşımını güçlendirmek için daha karmaşık yöntemler önerdi. Örneğin, Davis ve Price aşağıdaki seçeneği tanımladı:

Başka bir seçenek mümkündür:

Bununla birlikte, bu şemaların her ikisi de çeşitli saldırılara karşı savunmasızdır. Daha genel olarak, bir tür "doğum günü saldırısı"nın, bir gizli anahtar kullanılmadan bir şifre blok zincirinin kullanımını içeren herhangi bir karma algoritma ile başarılı olduğu gösterilebilir.

Daha fazla araştırma, karma işlevleri oluşturmaya yönelik başka yaklaşımlar bulmaya yönelikti.

Karma işlevi MD5

MIT'den Ron Rivest tarafından geliştirilen MD5 (RFC 1321) mesaj özeti algoritmasını düşünün.

MD5 yürütme mantığı

Algoritma, girdi olarak rastgele uzunlukta bir mesaj alır ve çıktı olarak 128 bitlik bir mesaj özeti oluşturur. Algoritma aşağıdaki adımlardan oluşur:

Pirinç. 8.1. MD5 yürütme mantığı

Adım 1: eksik bitleri ekleme

Mesaj, uzunluğu 448 modulo 512 () olacak şekilde tamamlanır. Bu, eklenen mesajın uzunluğunun 512'nin katından 64 bit daha az olduğu anlamına gelir. Mesaj gerekli uzunlukta olsa bile, ekleme her zaman yapılır. Örneğin, bir mesaj 448 bit uzunluğundaysa, 512 bit ile 960 bit arasında doldurulur. Böylece, eklenen bitlerin sayısı 1 ile 512 arasında değişir.

Toplama, bir tane ve ardından gerekli sayıda sıfırdan oluşur.

Adım 2: uzunluk ekleme

Orijinal (eklemeden önce) mesaj uzunluğunun bit cinsinden 64 bit gösterimi, ilk adımın sonucuna eklenir. Orijinal uzunluk 2 64'ten büyükse, yalnızca son 64 bit kullanılır. Böylece alan, modulo 64'ün orijinal mesajının uzunluğunu içerir.

İlk iki adım, 512 bitin katı olan bir mesaj oluşturur. Bu genişletilmiş mesaj, Y 0, Y 1, 512 bitlik blokların bir dizisi olarak temsil edilir. ... ., Y L-1, genişletilmiş mesajın toplam uzunluğu ise L*512 bittir. Bu nedenle, alınan genişletilmiş mesajın uzunluğu, on altı 32 bitlik kelimenin bir katıdır.

Pirinç. 8.2. Genişletilmiş mesaj yapısı

Adım 3: MD arabelleğini başlatma

Karma işlevinin ara ve nihai sonuçlarını depolamak için 128 bitlik bir arabellek kullanılır. Tampon, dört adet 32 ​​bitlik kayıt (A, B, C, D) olarak temsil edilebilir. Bu kayıtlar aşağıdaki onaltılık sayılarla başlatılır:

A = 01234567 B = 89ABCDEF C = FEDCBA98 D = 76543210

Adım 4: 512 bitlik (16 kelimelik) blok dizisini işleyin

Algoritmanın temeli, HMD5 olarak adlandırılan dört döngüsel işlemden oluşan bir modüldür. Dört döngü benzer bir yapıya sahiptir, ancak her döngü sırasıyla f F, f G, f H ve f I olarak gösterilen kendi atomik mantık işlevini kullanır.

Pirinç. 8.3. Sonraki 512 bitlik bloğun işlenmesi

Her döngü, o anda işlenmekte olan mevcut 512 bitlik Yq bloğunu ve ara özet değeri olan ABCD tamponunun 128 bitlik değerini girdi olarak alır ve bu tamponun içeriğini değiştirir. Her döngü ayrıca sin işlevine dayalı olarak 64 elemanlı T tablosunun dördüncü bölümünü kullanır. T [i] ile gösterilen T'nin i-inci elemanı, 2 32 * abs (sin (i)) tamsayı kısmına eşit bir değere sahiptir, i radyan cinsindendir. abs (sin (i)) 0 ile 1 arasında bir sayı olduğundan, T'nin her elemanı 32 bit ile temsil edilebilen bir tamsayıdır. Tablo, girişteki herhangi bir düzenliliği ortadan kaldırması gereken "rastgele" bir 32 bitlik değerler kümesi sağlar.

MD q + 1 elde etmek için, dört çevrimin çıkışı MD q ile modulo 2 32 eklenir. Toplama, arabellekteki dört kelimenin her biri için bağımsız olarak gerçekleştirilir.

CLS s - 32 bitlik bir bağımsız değişkenin s biti ile dairesel sola kaydırma.

X [k] - M, q-th 512 mesaj bloğundaki k-th 32-bit kelimedir.

T [i] - T matrisinde i-th 32-bit kelime.

+ - ek mod 2 32.

Algoritmanın dört döngüsünün her birinde, dört temel mantıksal işlevden biri kullanılır. Her atomik fonksiyon, girdi olarak üç adet 32 ​​bitlik kelime alır ve çıktıda bir adet 32 ​​bitlik kelime oluşturur. Her işlev, bir dizi bit düzeyinde mantıksal işlemdir, yani. Çıktının n'inci biti, üç girişin n'inci bitinin bir fonksiyonudur. Temel fonksiyonlar aşağıdaki gibidir:

32 bitlik sözcüklerden oluşan bir dizi X, o anda işlenmekte olan mevcut 512 bitlik giriş bloğunun değerini içerir. Her döngü 16 kez yürütülür ve giriş mesajının her bloğu dört döngüde işlendiğinden, giriş mesajının her bloğu Şekil 1'de gösterilen şemaya göre işlenir. 4, 64 kez. Giriş 512 bit bloğunu on altı 32 bit kelime şeklinde temsil edersek, her bir 32 bitlik kelime girişi, her döngüde bir kez olmak üzere dört kez kullanılır ve T tablosunun her bir öğesi 64 32 bit kelimeden oluşur. sadece bir kez kullanılır. Döngünün her adımından sonra, dört kelime A, B, C ve D döngüsel olarak sola kaydırılır.Her adımda, ABCD tamponunun dört kelimesinden sadece biri değiştirilir. Bu nedenle, arabellekteki her kelime 16 kez değiştirilir ve ardından o bloğun nihai çıktısını almak için sonunda 17. kez değiştirilir.

sindirmek.

2. Hız: Algoritmanın yazılım uygulaması yeterince hızlı olmalıdır. Özellikle, algoritma 32 bit mimaride yeterince hızlı olmalıdır. Bu nedenle, algoritma, 32 bitlik kelimeler üzerinde basit bir temel işlemler kümesine dayanmaktadır.

3. Basitlik ve kompaktlık: Algoritma, büyük programlar veya arama tabloları olmaksızın, tanımlanması basit ve programlanması kolay olmalıdır. Bu özellikler yalnızca bariz yazılım avantajlarına sahip olmakla kalmaz, aynı zamanda olası zayıflıkları analiz etmek için basit bir algoritmaya sahip olmak daha iyi olduğu için güvenlik açısından da istenir.

4. Little-endian mimarisi arzu edilir: bazı işlemci mimarileri (Intel 80xxx satırı gibi), bir kelimenin sol baytlarını en az anlamlı bayt adresleri (little-endian) konumunda saklar. Diğerleri (SUN Sparcstation gibi), kelimenin doğru baytlarını en az anlamlı bayt adresleri konumunda saklar (ilk döngüdeki büyük MD4 ekstra sabiti uygulanmaz. İkincideki adımların her biri için benzer bir ekstra sabit kullanılır. döngü Üçüncü döngüdeki adımların her biri için başka bir ekstra sabit kullanılır.Karma kod, girdinin her bitinin bir fonksiyonudur.F F, f G, f H ve f I atomik fonksiyonlarının karmaşık tekrarı, şunu sağlar: sonuç iyi karışmıştır; yani, görünüşte benzer kalıplara sahip olsalar bile, iki mesajın rastgele seçilmesi olası değildir, aynı çıktı değerini üreten aynı özetlere sahiptir, bu da tek bir 512 bit üzerinde MD5 yapmanın anlamına gelir. blok, ABCD arabelleğinde iki farklı giriş için aynı çıktıyla sonuçlanacaktır. MD5'te mevcut değil.

Büyük veriler arasında gerekli elemanı bulma problemini çözmek için bir algoritma önerilmiştir. karma (karma- karıştırma), dizinin verilerini belirleyen anahtarların oluşturulduğu ve bunlara dayalı olarak verilerin adlı bir tabloya yazıldığı karma tablo ... Kayıt tuşları fonksiyon kullanılarak tanımlanır ben = h(anahtar) aranan Özet fonksiyonu ... Hashing algoritması, hash fonksiyonu tarafından elde edilen anahtarının değeri ile istenen elementin hash tablosundaki konumunu belirler.

konsept karma - veri öğelerinin ortak (temel) benzersiz anahtarları kümesinin belirli bir özelliğe sahip ayrık kümelere bölünmesidir.

Örneğin bir sözlük veya ansiklopedi alın. Bu durumda alfabenin harfleri arama tuşu olarak alınabilir, yani. hash algoritmasının ana unsuru anahtar (anahtar). Çoğu uygulamada anahtar, verilere dolaylı bir başvuru sağlar.

Aslında hashing, ihtiyacınız olan bilgiyi hızlı bir şekilde bulmak için verileri adreslemenin özel bir yöntemidir. tuşlarla .

Temel set şunları içeriyorsa n elemanlar, daha sonra 2'ye bölünebilir n farklı alt kümeler.

Hash tablosu ve hash fonksiyonları

Veri öğelerinin anahtarlarını bir tamsayı kümesine eşleyen bir işlev (tablodaki dizinler - karma tablo ) denir hash fonksiyonu , veya Özet fonksiyonu :

ben = H(anahtar);

nerede anahtar- dönüştürülecek anahtar, ben- tablonun sonuçtaki dizini, yani. anahtar bir dizi tamsayıya eşlenir ( karma adresleri ), daha sonra verilere erişmek için kullanılır.

Ancak birden çok anahtar değer için bir hash işlevi aynı konum değerini verebilir. ben masada. İki veya daha fazla anahtarın aynı dizini (karma adresi) aldığı duruma denir. çarpışma hash olduğunda.

İyi bir karma işlevi, çarpışmaları en aza indiren ve verileri tüm tabloya eşit olarak dağıtan bir işlevdir ve mükemmel bir karma işlevi, çarpışma oluşturmayan bir işlevdir:

Karma çarpışmalarını çözmenin iki yolu vardır:

- lineer problama ile açık adresleme yöntemi;

- zincir yöntemiyle.

karma tablo

Karma tablosu, bir karma işlevi tarafından verilen olağandışı adreslemeli sıradan bir dizidir.

Hash yapısı dizine göre verilere hızlı doğrudan erişim sağlayan bir dizinin genellemesi olarak kabul edilir.

İyi bir işlevin seçiminde farklılık gösteren birçok karma şema vardır. H(anahtar) ve çatışma çözme algoritması. Gerçek bir pratik problemi çözmenin etkinliği, önemli ölçüde seçilen stratejiye bağlı olacaktır.

Hash fonksiyonlarına örnekler

Seçtiğiniz karma işlevi, hesaplanması ve mümkün olduğunca az çarpışma oluşturması kolay olmalıdır, yani. anahtarları tablodaki mevcut dizinler arasında eşit olarak dağıtmalıdır. Elbette, eğer anahtarlar önceden bilinmiyorsa, belirli bir hash fonksiyonunun anahtarları doğru bir şekilde dağıtıp dağıtmayacağını belirlemek imkansızdır. Bununla birlikte, bir hash fonksiyonu seçilmeden önce anahtarların kendileri nadiren bilinmesine rağmen, bu anahtarların dağıtımlarını etkileyen bazı özellikleri genellikle bilinmektedir. Bir karma işlevi ayarlamak için en yaygın yöntemleri ele alalım.

bölme yöntemi... İlk veriler - bazı tamsayı anahtarı anahtar ve masa boyutu m... Bu işlevin sonucu, bu anahtarın tablonun boyutuna bölünmesinin geri kalanıdır. Fonksiyonun genel görünümü:

int h (int anahtarı, int m) (

dönüş anahtarı% m; // Değerler

İçin m= 10 hash işlevi, anahtarın en az anlamlı basamağını döndürür.

İçin m= 100 hash işlevi, anahtarın en az anlamlı iki basamağını döndürür.

katkı yöntemi burada anahtar bir karakter dizisidir. Hash işlevi, tüm karakterleri toplayarak bir dizeyi bir tam sayıya dönüştürür ve bölümün kalanını şuna göre döndürür: m(genellikle masa boyutu m= 256).

int h (char * tuşu, int m) (

Aynı karakter kümesini içeren dizelerde çarpışmalar meydana gelir, örneğin, ABC ve taksi.

Bu yöntem biraz değiştirilebilir, sonucu anahtar dizenin yalnızca ilk ve son karakterlerini toplayarak elde eder.

int h (char * tuşu, int m) (

int uzunluk = strlen (anahtar), s = 0;

eğer (len< 2) // Если длина ключа равна 0 или 1,

s = anahtar; // Geri dönüş tuşu

s = tuş + tuş;

Bu durumda, çarpışmalar yalnızca dizelerde meydana gelir, örneğin, ABC ve amc.

Orta kare yöntemi, burada anahtarın karesi alınır (kendisiyle çarpılır) ve elde edilen değerin birkaç orta basamağı bir dizin olarak kullanılır.

Örneğin, anahtar 32 bitlik bir tamsayıdır ve karma işlevi karesinin ortadaki 10 bitini döndürür:

int h (int anahtarı) (

anahtar >> = 11; // En önemsiz 11 biti atın

dönüş anahtarı %1024; // En az anlamlı 10 biti döndür

Özel VEYA yöntemi satır tuşları için (genellikle tablonun boyutu m= 256). Bu yöntem, katkı maddesine benzer, ancak benzer sözcükleri birbirinden ayırır. Yöntem, "özel VEYA" işleminin dize öğelerine sırayla uygulanması gerçeğinden oluşur.

V çarpma yöntemi ayrıca rastgele bir gerçek sayı kullanılır r aralığından. Bu ürün tablonun boyutu ile çarpılırsa m, daha sonra ortaya çıkan ürünün tamamı 0 ile 0 arasında bir değer verecektir. m–1.

int h (int anahtarı, int m) (

çift ​​r = anahtar * rnd ();

r = r - (int) r; // Ayrılan kesirli kısım

Genel durumda, büyük değerlerde m karma işlevi tarafından oluşturulan dizinler büyük ölçüde değişir. Ayrıca, matematiksel teori, aşağıdaki durumlarda dağılımın daha düzgün olduğunu iddia eder: m bir asal sayıdır.

Ele alınan örneklerde, hash fonksiyonu ben = H(anahtar) yalnızca bir kaydın bir anahtarla aranacağı (veya başlangıçta - tabloya yerleştirileceği) konumu belirler anahtar... Bu nedenle, karma şeması şunları içermelidir: çakışma çözme algoritması pozisyon varsa eylemlerin sırasını tanımlama ben = H(anahtar) farklı bir anahtarla zaten dolu bir kayıt olduğu ortaya çıkıyor.