Hashing'in bir işlevi nedir. Şifreleme hash fonksiyonları

Dikkat ettiğimiz arama algoritmaları genellikle bir soyut karşılaştırma işlemine dayanır. Bu seriden, tablonun I-inci konumunda depolanan "Sembol Tabloları ve İkili Arama Ağaçları" nda açıklanan dağıtım yöntemi, doğrudan buna başvurmanızı sağlar. Aramayı dağıtmakla, anahtarlar bir dizi endeksi olarak kullanılır ve karşılaştırma işleminin işlenenleri değil; Yöntemin kendisi, anahtarların tablo dizinleri ile aynı aralıktan farklı tamsayılar olduğu gerçeğine dayanır. Bu bölümde, Tuşların çok uygun özellikleri olmayan, daha tipik arama uygulamalarında kullanılan, dağıtım aramanın genişletilmiş bir sürümüne bakacağız (karma). Uygulamanın son sonucu bu yaklaşım Karşılaştırmaya dayanan yöntemlere kesinlikle benzer değildir - sözlük veri yapılarından öğelerdeki anahtar arama anahtarlarını karşılaştırarak, tablo adreslerine bir aritmetik anahtar dönüşümü yaparak doğrudan tablodaki maddeleri ifade etmeye çalışıyoruz.

Karma kullanarak arama algoritmaları iki ayrı bölümden oluşur. İlk adım, arama tuşunu tabloyu içeren karma işlevini (karma fonksiyonunu) hesaplamaktır. İdeal olarak, farklı anahtarlar çeşitli adreslerde görüntülenmelidir, ancak genellikle iki veya daha fazla farklı anahtar tablodaki aynı adresi verebilir. Bu nedenle, aramanın karma yöntemiyle ikinci kısmı, bu tür tuşları işleyen çarpışmaların (çarpışma çözünürlüğü) çözünürlük sürecinindir. Bu bölümde göz önünde bulunduracağımız çatışma çözme yöntemlerinden birinde, bağlı listeler kullanılır, bu nedenle arama anahtarlarının sayısını önceden tahmin edilmesi zor olduğunda dinamik durumlarda doğrudan kullanım bulur. Diğer iki yöntemde, çarpışmaların çözülmesi, yüksek oranda elde edildi verim Arama, elemanlar sabit bir dizide depolandığından beri. Bu yöntemleri iyileştirme yöntemini göz önüne alarak, bunları kullanmanıza izin veren ve masanın boyutunu önceden tahmin etmenin imkansız olduğu durumlarda.

Hashing, zaman ve hafıza arasındaki dengenin iyi bir örneğidir. Kullanılan bellek miktarında herhangi bir kısıtlama yoksa, herhangi bir arama, yalnızca bir hafıza erişimi kullanılarak, yalnızca bir hafıza adresi kullanarak, arama araması olarak bir hafıza adresi olarak kullanabilir. Bununla birlikte, bu ideal durum genellikle elde edilemez, çünkü uzun anahtarlar çok fazla miktarda bellek gerektirebilir. Öte yandan, eğer kısıtlamalar yoksa kurşun zamanı, Sıralı arama yöntemini kullanarak minimum belleği ile yapmak mümkün olacaktır. Hashing, hem hafıza hem de zamanın kabul edilebilir bir hacmini kullanmanın ve bu iki aşırı gereksinim arasında bir denge elde etmenin bir yoludur. Özellikle, herhangi bir dengeyi destekleyebilir, tablonun boyutunu değiştirerek ve kodu yeniden yazılmamak ve başka algoritmalar seçmeden.

Hashing, bilgisayar bilimlerinin klasik görevlerinden biridir: Çeşitli algoritmaları ayrıntılı olarak incelenir ve yaygın olarak kullanılmaktadır. Tüm sert varsayımlarda olmadığını göreceğiz, masanın boyutuna bakılmaksızın, sabit bir yürütme süresi ile sembol tablolarında bulma ve yapıştırmayı desteklemeyi umabilirsiniz.

Bu beklenen değer, sembol tablosunun herhangi bir uygulanması için optimum teorik performans, ancak hash, iki ana nedenden dolayı hala bir Panacea değildir. İlk olarak, kurşun zamanı Uzun anahtarlar kullanan gerçek uygulamalarda önemli olabilecek anahtar uzunluğuna bağlıdır. İkincisi, karma, seçme veya sıralama gibi sembol tabloları ile diğer işlemlerin etkili bir şekilde uygulanmasını sağlamaz. Bu bölümde, bunları ve diğer soruları ayrıntılı olarak düşüneceğiz.

Özet fonksiyonu

Her şeyden önce, anahtarları tablo adresine dönüştüren karma fonksiyonunu hesaplama görevini çözmek gerekir. Tipik olarak, bu aritmetik hesaplamanın uygulanması karmaşıklığı temsil etmemektedir, ancak çeşitli düşük zorlu tuzaklar halinde çalışmamak için hala özen göstermek için gereklidir. M elemanları içerebilecek bir tablo varsa, anahtarları aralıktaki tamsayılara dönüştüren bir fonksiyona ihtiyacınız vardır. İdeal karma fonksiyonunun hesaplanması kolay olmalı ve rastgele bir fonksiyona benzer olmalıdır: Herhangi bir argüman için, bir anlamda sonuçlar eşdeğer olmalıdır.

Karma fonksiyonu, anahtarın türüne bağlıdır. Kesinlikle konuşursak, ayrı bir karma fonksiyonu ayrı bir anahtar türü gerektirir. Verimliliği artırmak için, genellikle türlerin açıkça dönüştürülmesinden, makine sözcüğünün ikili sunumunun, aritmetik hesaplamalarda kullanılabilecek bir tamsayı olarak değerlendirilmesi fikri ile iletişim kurmanın istenmesidir. Hashing, üst düzey dillerden önce ortaya çıktı - erken bilgisayarlarda herhangi bir değeri bir string anahtarı olarak görmek için her zamanki meselaydı, sonra bir tamsayı olarak. Bazı üst düzey dillerde, belirli bir bilgisayardaki anahtarların sunumuna bağlı olan programlar oluşturmak zordur, çünkü bu programlar esasen makine bağımlıdır ve bu nedenle başka bir bilgisayara transfer etmek zordur. Tipik olarak, HASH fonksiyonları, anahtar dönüşüm işlemine tamsayılara bağlıdır, bu nedenle, karımın uygulanmasında eşzamanlı olarak makine bağımsızlığı ve verimliliği sağlamak zordur. Kural olarak, basit tamsayı tuşları veya kayan nokta tipi tuşları sadece bir makine çalışması kullanılarak dönüştürülebilir, ancak dize tuşları ve diğer bileşik tuşları, yüksek maliyetler ve verimliliğe daha fazla dikkat gerektirir.

Muhtemelen en basit durum, tuşların sabit bir aralıktan yüzen bir noktaya sahip sayılar olduğudur. Örneğin, tuşlar sayılar, büyük 0 ve daha küçük bir 1 ise, sadece m ile çarpılabilir, sonucun daha küçük bir tamsayı yuvarlayın ve adresi 0 ile m - 1 arasındaki aralıkta alın; Bu örnek, Şekil 2'de gösterilmiştir. 14.1. Tuşlar, T'den daha büyükse ve T'den daha azsa, bir sonucu olarak, 0 ile 1 arasındaki değer aralığına düştüğü ve ardından M'ye çarptıkları ve daha sonra M'ye çarptıkları ve ardından TS'ye bölünebilirler. Tablodaki adres.


İncir. 14.1.

Sayıları 0 ile 1 arasındaki masaya dizinler arasında bir yüzer bir noktaya dönüştürmek için, boyutu 97 olan, bu sayıları 97 ile çarpın. Bu örnekte, üç çakışma meydana geldi: 17, 53 ve 76'ya eşit endeksler için. Hash değerleri, yaşlıların kilit deşarjları tarafından belirlenir, daha genç deşarjlar herhangi bir rol oynamaz. Bir karma işlevi geliştirmenin hedeflerinden biri, böyle bir dengesizliği ortadan kaldırmaktır, böylece her boşalmanın hesaplama sırasında dikkate alınmasıdır.

Anahtarlar W-bit tamsayıları ise, yüzer bir nokta numaralarına dönüştürülebilir ve 0 ile 1 arasındaki aralığında bir kayan nokta numaraları elde etmek için 2 W'a bölünür ve daha sonra önceki paragrafta olduğu gibi M'ye çarpın. Kayan nokta işlemleri çok fazla zaman alırsa ve sayılar taşmaya yol açmak için o kadar yüksek değilse, aynı sonuç, tamsayı aritmetik işlemler kullanılarak elde edilebilir: anahtarı m'ye çarpmanız ve sonra vardiya gerçekleştirmeniz gerekir. W, 2 W (veya çarpma taşması, vardiya ve daha sonra çarpmaya yol açarsa, 2 W (veya eğer) bölünmesi için deşarjlar. Bu tür yöntemler, anahtarlar aralıkla eşit bir şekilde dağıtılmadıkça, karma değeri yalnızca anahtarın önde gelen rakamları ile belirlendiğinden, hatlar için faydasızdır.

Daha basit I. etkili yöntem W-bit tamsayıları için - belki de en sık kullanılan karma yöntemlerinden biri - basit bir sayının boyutlu bir M tablosu olarak bir seçim ve kalıntının m'ye bölünmesinden hesaplanması. H (k) \u003d K mod m, herhangi bir tamsayı anahtarı için k. Bu fonksiyon modüler karma fonksiyonu denir. Hesaplanması çok kolaydır (C ++ 'i) ve daha küçük M'nin değerleri arasında bir anahtar değerlerin tek tip bir dağılımını elde etmek etkilidir. Küçük bir örnek, Şekil 2'de gösterilmiştir. 14.2.


İncir. 14.2.

Üç sağ sütunda, solda gösterilen 7 bit tuşlarının sonucu aşağıdaki işlevler kullanılarak gösterilir:

v% 97 (solda)

v% 100 (Merkez) ve

(int) (A * v)% 100 (sağda),

burada a \u003d .618033. Bu fonksiyonlar için tablonun boyutları sırasıyla 97, 100 ve 100'dür. Değerler rastgele görünüyor (tuşlar rastgeledir). İkinci fonksiyon (V% 100), tuşların sadece iki aşırı basamağını kullanır ve bu nedenle rastgele olmayan tuşlar için düşük performans gösterebilir.

Modüler karma, kayan nokta tuşlarına uygulanır. Anahtarlar küçük bir aralığa aitse, W-bit tamsayı değerlerini elde etmek için 0 ile 1, 2 W arasındaki sayılara ölçeklendirilebilirler ve ardından modüler hash işlevini kullanın. Başka bir seçenek ise, modüler bir hash işlevi ikili anahtar sunumu (varsa) kullanmaktır.

Modüler karma, anahtarların, makine sözcüğü tarafından temsil edilen tamsayılar olup olmadıklarına bakılmaksızın, makine sözcüğünde paketlenmiş sembollerin dizisi olup olmadığına bakılmaksızın, anahtarların oluştuğu bitlere erişildiğinde, tüm durumlarda uygulanır. muhtemel seçenek. Makine kelimesine paketlenmiş rastgele sembollerin sırası, rastgele tamsayı tuşlarıyla tam olarak aynı değildir, çünkü tüm boşalma kodlama için kullanılmaz. Ancak, bu türlerin her ikisi de (ve makine kelimesine uyacak şekilde kodlanan herhangi bir başka anahtar türü) küçük bir masada rastgele dizinler gibi görünmek için yapılabilir.

Modüler karma için basit bir sayının boyutlu M karma tablosu olarak seçimin ana nedeni, Şekil 2'de gösterilmiştir. 14.3. Bu örnekte, 7 bit kodlamalı sembolik veriler, tuşa, her karakter için her karakter için bir rakamla bir numara olarak yorumlanır. Şimdi kelime, 1816567 sayısına karşılık gelebilir, bu da yazılabilir.

aSCII kodu sembolleri N, O ve W, 1568 \u003d 110, 1578 \u003d 111 ve 1678 \u003d 119 sayılarına karşılık gelir. Bu tür anahtar için M \u003d 64 tablosunun boyutu başarısız olur, çünkü x değerlerine, çoklu 64 (veya 128) eklenmesi, X MOD 64 değerini değiştirmez - herhangi bir tuş için, karma fonksiyonunun değeridir. Bu anahtarın son 6 hanesinin değeri. Tabii ki, iyi bir karma işlevi, özellikle sembolik tuşlar için tüm kilit boşalmalarını dikkate almalıdır. M, bir derece 2 olan bir çarpan içerdiğinde de benzer durumlar oluşabilir. En basit yol Bundan kaçının - basit bir sayı olarak seçin.


İncir. 14.3.

Bu tablonun her satırında, siz: 3-harfli kelime, bu kelimenin ASCII kodunda oktan ve ondalık formalarda 21 bitlik bir numara olarak sunumu ve tablo 64 ve 31 boyutları için standart modüler hash fonksiyonları (iki sağdaki aşırı sütun). Tablo 64'ün boyutu, istenmeyen sonuçlara yol açar, çünkü sadece en sağdaki anahtar boşalma, bir karma değeri elde etmek için kullanılır ve normal dilin kelimelerindeki harfler düzensiz bir şekilde dağıtılır. Örneğin, Y harfi ile donatılmış tüm kelimeler, HASH değerine 57'ye karşılık gelir. Ve aksine, 31'in basit bir değeri, tabloda daha az sayıda daha küçük olduğundan daha az uyuşmazlığa neden olur.

Modüler karma, tablo boyutunun basit bir sayı olması dışında uygulanması çok kolaydır. Bazı uygulamalar için, küçük bir bilinen basit sayıda içerikli olabilir veya istenen boyuttaki tablonun boyutuna yakın olan ünlü asal numaralar listesinde arama yapabilirsiniz. Örneğin, sayılar 2 t - 1, basittir t \u003d 2, 3, 5, 7, 13, 17, 19 ve 31 (ve başka hiçbir değerde t< 31 ): это известные простые числа Мерсенна. Чтобы динамически распределить таблицу нужного размера, нужно вычислить простое число, близкое к этому значению. Такое вычисление нетривиально (хотя для этого и существует остроумный алгоритм, который будет рассмотрен в части 5), поэтому на практике обычно используют таблицу заранее вычисленных значений (см. рис. 14.4). Использование модульного хеширования - не tek nedenmasanın boyutunun basit bir sayı yapmaya değer olduğu; BÖLÜM 14.4'te başka bir neden de göz önünde bulundurulur.


İncir. 14.4.

Bu tablo, 2 N'den küçük olan en büyük basit sayılardır. Tablo boyutunun basit bir sayı olması gerektiğinde dinamik hash tablo dağıtımı için kullanılabilir. Kapsanan aralıktaki herhangi bir pozitif değer için, bu tablo 2 kattan daha az olan basit bir sayıyı belirlemek için kullanılabilir.

Tamsayı tuşlarının bir başka düzenlemesi, çarpıcı ve modüler yöntemlerin bir kombinasyonudur: Anahtarı 0 ile 1 arasındaki aralıkta sabitin içine çarpmanız ve ardından MODULE MOTY tarafından bölünmeyi yapmanız gerekir. Başka bir deyişle, işlevi kullanmanız gerekir. Değerler, M ve anahtar numara sisteminin etkin temeli arasında, teorik olarak anormal davranışa yol açabilecek bir ilişki vardır, ancak keyfi bir değer A kullanırsanız, gerçek ek Herhangi bir sorunu olması muhtemel değildir. Genellikle, A olarak, f \u003d 0.618033 değeri ... (Altın Bölüm) seçilir.

Bu konuda birçok diğer varyasyon, özellikle bir vardiya ve maske seçimi gibi verimli makine talimatları kullanılarak uygulanabilen karma fonksiyonları incelenmiştir (bkz. Bağlantılar).

Sembol tabloları kullanan birçok uygulamada, anahtarlar sayı değildir ve mutlaka kısa değildir; Daha sık, çok uzun olabilecek alfasayısal çizgilerdir. Averylongkey olarak bir kelime için karma işlevini nasıl hesaplayabilirsiniz?

7-bit ASCII kodunda, bu kelime 84-bit numarasına (Hizala *) 97 \\ CDOT 128 ^ (11) & + 118 \\ CDOT 128 ^ (10) + 101 \\ CDOT 128 ^ (9) karşılık gelir. + 114 \\ CDOT 128 ^ (8) + 121 \\ CDOT 128 ^ (7) \\\\ & + 108 \\ CDOT 128 ^ (6) + 111 \\ CDOT 128 ^ (5) + 110 \\ CDOT 128 ^ (4) + 103 \\ CDOT 128 ^ (3) \\\\ & + 107 \\ CDOT 128 ^ (2) + 101 \\ CDOT 128 ^ (1) + 121 \\ CDOT 128 ^ (0), \\ end (hizala *),

bu çok büyük olan, böylece normal aritmetik fonksiyonların çoğu bilgisayarda onunla yapılabilir. Ve sıklıkla işlemek ve daha uzun anahtarlar gerekir.

Uzun tuşlar için modüler hash işlevini hesaplamak için, fragman başına bir parçaya dönüştürülürler. Modül fonksiyonunun aritmetik özelliklerini kullanabilir ve gerner algoritmasını kullanabilirsiniz (bkz. Bölüm 4.9 "Özet veri türleri"). Bu yöntem, tuşlara karşılık gelen başka bir kayıt numarasının başka bir yöntemine dayanır. Dikkate alınan örnek için, aşağıdaki ifadeyi yazıyoruz: \\ BAŞLATI (HIGN *) (((((((((((((((((97 \\ CDOT 128 ^ (11) ve + 118) \\ CDOT 128 ^ (10) + 101) \\ CDOT 128 ^ (9) + 114) \\ CDOT 128 ^ (8) + 121) \\ CDOT 128 ^ (7) \\\\ & + 108) \\ CDOT 128 ^ (6) + 111) \\ CDOT 128 ^ (5) + 110) \\ CDOT 128 ^ (4) + 103) \\ CDOT 128 ^ (3) \\\\ & + 107) \\ CDOT 128 ^ (2) + 101) \\ CDOT 128 ^ (1) + 121. \\ end (Hizala) *)

Yani, dizenin karakter kodlamasına karşılık gelen bir ondalık sayı, soldan sağa bakıldığında, birikmiş değeri 128'e çarparak ve ardından bir sonraki sembolün kod değerini ekleyerek hesaplanabilir. Uzun bir dize durumunda, bu hesaplama yöntemi sonunda bilgisayarda hiç sunulabilen büyük birine neden olacaktır. Bununla birlikte, bu sayı gerekli değildir, çünkü sadece (küçük) tortu, M'nin bölünmesinden gereklidir. Sonuç, birikmiş değeri bile tutmadan elde edilebilir, çünkü Herhangi bir zamanda, hesaplama çoklu m ile atılabilir - çarpma ve ekleme yaptığınızda, yalnızca Tortuyu MODULE M'DEN'den saklamak gerekir. Sonuç, Hesaplama yeteneğine sahip olduğumuz için aynı olacaktır. Uzun bir sayı ve sonra bölünmeyi gerçekleştirin (bkz. Alıştırma 14.10). Bu gözlem, uzun çizgiler için modüler hash fonksiyonlarını hesaplamak için doğrudan aritmetik bir yönteme yol açar - bkz. Program 14.1. Bu program bir başkasını kullanır, son düğümleme: taban 128 yerine, basit bir sayı 127 kullanır. Bu değişikliğin nedeni bir sonraki paragrafta göz önünde bulundurulur.

Gorner yöntemi kullanılarak modüler karma (bir veya iki) ile aynı maliyetlerle eşh fonksiyonlarını yaklaşık olarak hesaplamanın birçok yolu vardır. aritmetik işlemler Anahtardaki her sembol için). Rastgele tuşlar için, bu yöntemler pratik olarak birbirinden farklı değildir, ancak gerçek anahtarlar nadiren rastgeledir. Gerçek anahtarlar rastgele türü vermek için düşük maliyetlerin maliyeti olasılığı, randomize hasşım algoritmalarının dikkate alınmasına neden olur, çünkü anahtar dağıtımından bağımsız olarak rastgele masa endeksleri oluşturan karma fonksiyonlara ihtiyacımız var. Randomizasyonun düzenlenmesi zor değildir, çünkü tam anlamıyla modüler karma tanımına uymak gerekli değildir - sadece bir sürü daha küçük M'yi hesaplamak gerekir, tüm önemli deşarjlar kullanıldı.

M \u003d 96 ve a \u003d 128 (üstte)

M \u003d 97 ve A \u003d 128 (merkez) ve

M \u003d 96 ve a \u003d 127 (aşağıda)

İlk durumdaki düzensiz dağılım, masanın boyutunun ve çarpan çarpanı 32'nin boyutu nedeniyle düzensiz harflerin ve düzensizliğin korunmasına neden olmasının sonucudur. Tablonun büyüklüğü ve çarpanının boyutu karşılıklı olarak basit sayılardır.

Program 14.1, bunu yapmanın yollarından birini göstermektedir: Derece 2 yerine basit bir taban ve dizenin ASCII temsiline karşılık gelen bir tamsayı kullanarak. İncirde. 14.5 Şek. 14.5 Bu değişikliğin, tipik dize tuşları için dağıtımın nasıl geliştirdiği gösterilmiştir. Programın (14.1) tarafından oluşturulan teorik olarak karma değerler, birden fazla 127 olan tablo boyutları için kötü sonuçlar verebilir (pratikte neredeyse anlaşılmaz olmasa da); Randomize bir algoritma oluşturmak için, çarpanın değerini rastgele olarak seçmek mümkün olacaktır. Daha verimli bir yaklaşım, hesaplamada rastgele katsayıların rastgele değerlerini ve her bir anahtar numarası için çeşitli rastgele değerleri kullanmaktır. Bu yaklaşım, evrensel karma adı verilen randomize bir algoritma verir (evrensel karma).

Teorik olarak, ideal evrensel karma fonksiyonu, m boyutlu bir tablodaki iki farklı anahtar arasında bir çarpışma olasılığı tam olarak 1 / m'ye eşittir. Programın (14.1) bir katsayısı olarak kullanıldığı kanıtlanmış olabilir. Bununla birlikte, anahtardaki her sembol için yeni bir rasgele sayı oluşturma maliyeti genellikle kabul edilemez. Uygulamada, Program 14.1'de gösterilen bir uzlaşmayı, her bir anahtar sembolü için farklı rasgele sayılar dizisini tutmadan ve basit bir sahte rastgele dizinin oluşturulmasını kullanarak katsayıları değiştirmek mümkündür.

Özetlecilik: karma kullanmak için bir soyut karakter tablosu uygulamak için, önce soyut tip arayüzünü genişletmeniz, olumsuz olmayan tamsayıların tuşlarını görüntüler, daha küçük masa boyutu M.

Bu makalenin bir parçası olarak size söyleyeceğim karma nedirNeden ihtiyaç duyulur, nerede ve nasıl kullanıldığı ve en iyi bilinen örnekler.

Bilgi teknolojileri alanındaki birçok zorluk, veri hacimlerine çok önemlidir. Örneğin, iki dosyayı 1 KB boyutunda ve 10 GB'lık iki dosya ile karşılaştırmanız gerekirse, tamamen farklıdır. Bu nedenle, daha kısa ve hareketli değerlerle çalışmasına izin veren algoritmalar çok popüler olarak kabul edilir.

Bu tür teknolojiler, görev kütlesini çözerken kullanımını buldu. Ancak, sıradan bir kullanıcı olarak, hala anlaşılmaz olduğunu düşünüyorum, ne tür bir canavar ihtiyacı için ne tür bir canavar. Bu nedenle, en kolay tüm kelimeleri açıklamaya çalışacağım.

Not: Malzeme, sıradan kullanıcılar için tasarlanmıştır ve bununla birlikte, bunun temel tanıdıklığı için fazlasıyla ilgili birçok teknik husus içermez.

Hash ya da karma nedir?

Şartlarla başlayacağım.

Karma fonksiyonu, evlilik fonksiyonu - Bu, keyfi uzunluktaki metinleri sabit bir uzunluk koduna (genellikle kısa dijital kayıt) dönüştürmenizi sağlayan özel bir özelliktir.

Karma - Bu, kaynak metinlerin dönüşüm sürecidir.

Karma, karma kodu, değeri hash, karma - Bu, hash fonksiyonunun çıkış değeridir, yani elde edilen blok sabit uzunluktur.

Gördüğünüz gibi, terimlerin neden gerekli olduğunu anlamak zor olan birkaç şekilli açıklamaya sahiptir. Bu nedenle, derhal küçük bir örnek vereceğim (diğer uygulamalar hakkında biraz sonra söyleyecektir). Diyelim ki 10 gb 2 dosyanız var. Hangisinin ihtiyacı olduğunu nasıl hızlıca öğrenebilirsiniz? Dosya adını kullanabilirsiniz, ancak yeniden adlandırması kolaydır. Tarihleri \u200b\u200bizleyebilirsiniz, ancak dosya dosyalarını kopyaladıktan sonra aynı veya diğer dizilerde olabilir. Beden, kendinizin nasıl anladığın, azı yardımcı olabilir (özellikle boyutlar çakışmazsa veya baytların tam değerlerine bakmadıysanız).

Burada, dosyanın kaynak metninden üretilen kısa bir blok olan bu karma ihtiyacınız var. Bu iki dosya 10 GB, iki farklı, ancak kısa karma kodu olacaktır (Accac43535 "ve" BBB3232A42 "gibi bir şey). Onları kullanarak hızlıca öğrenebilirsiniz İstediğiniz dosya.İsimleri kopyalayıp değiştirdikten sonra bile.

Not: Dünyanın bilgisayarındaki ve internetteki karma olduğu gerçeğinden dolayı çok iyi bilinen bir kavramdır, o zaman çoğu zaman Hash ile ilgili olan her şey bu kelimeye düşürülür. Örneğin, çeviride "Hash MD5'ini kullanıyorum" ifadesi, sitede veya başka bir yerde, MD5 standardının karma algoritması tarafından kullanıldığı anlamına gelir.

Karma özellikleri

Şimdi, size hash fonksiyonlarının özelliklerinden bahsediyorum, böylece nerede kullanıldığını ve ihtiyacınız olan şey için daha kolaydır. Ama önce başka bir tanım.

Çarpışma - Bu, iki farklı metin için bir ve aynı karma miktarı elde edildiğinde durum budur. Bildiğiniz gibi, sabit uzunlukta bir blok, sınırlı sayıda olası değere sahiptir ve bu nedenle tekrarlar mümkündür.

Ve şimdi Hash fonksiyonlarının özelliklerine:

1. Metin, herhangi bir boyutun metnine verilebilir ve çıkış sabit uzunlukta bir veri bloğudur. Bu tanımdan takip eder.

2. Aynı metinlerin karma toplamı aynı olmalıdır. Aksi takdirde, bu tür fonksiyonlar basitçe yararsızdır - bu rastgele bir numaraya benzer.

3. İyi bir konvolasyon işlevi iyi bir dağılıma sahip olmalıdır. Örneğin, örneğin çıkış hash'in boyutu 16 bayttır, daha sonra herhangi bir metin için sadece 3 farklı değer döndürürse, böyle bir fonksiyon üzerinde herhangi bir etki yoktur ve bu 16 bayt (16 bayt 2 ^ 128 Yaklaşık 3, 4 * 10 ^ 38 derece olan seçenekler).

4. İşlev, kaynak metnin en ufak değişikliklerine ne kadar iyi yanıt verir? Basit bir örnek. 10 GB dosyasında 1 harf değiştirdi, fonksiyonun değeri farklı olmalıdır. Öyle değilse, böyle bir işlevi uygulamak çok sorunludur.

5. Çarpışma oluşumunun olasılığı. Belirli koşullar altında hesaplanan çok karmaşık bir parametre. Ancak, özü, ortaya çıkan karma toplamı sıklıkla çakışacaksa, karma fonksiyonunun noktanın neyin olduğu şeydir.

6. Hasha hesaplama oranı. Hesaplamak için uzun bir süredir eğer konvolasyon işlevinden parti nedir? Hayır, çünkü dosyaların başka bir yaklaşımı karşılaştırmak veya kullanmak daha kolaydır.

7. Kaynak verileri karma değerinden geri yükleme karmaşıklığı. Bu özellik, her yerde gerekli olmadığı için genelden daha spesifiktir. Ancak, en ünlü algoritmalar için bu özellik değerlendirilir. Örneğin, kaynak dosyası bu fonksiyondan zorlanabilirsiniz. Bununla birlikte, çarpışmaların sorunu gerçekleşirse (örneğin, böyle bir hash'e karşılık gelen herhangi bir metin bulmanız gerekir), o zaman bu karakteristik önemli olabilir. Örneğin, şifreler, ancak biraz sonra.

8. Böyle bir işlev için açılan veya kapalı kaynak kodu. Kod açık değilse, veri kurtarma karmaşıklığı, yani şifreleme, söz konusudur. Kısmen, bu şifreleme ile ilgili bir sorundur.

Şimdi "ve neden hepsi?" Sorusuna gidebilirsiniz.

Neden bir karma ihtiyacın var?

Hash fonksiyonlarının temel amacı sadece üç (ya da amaçları).

1. Verilerin bütünlüğünü kontrol edin. İÇİNDE bu durum Her şey basittir, böyle bir işlev hızlı hesaplanmalı ve örneğin, internetten indirilen dosyanın transfer sırasında hasar görmediğini hızlıca kontrol etmenize izin vermelidir.

2. Veri arama hızını büyütmek. Sabit blok boyutu, arama görevlerini çözmede birçok avantaj elde etmenizi sağlar. Bu durumda, tamamen teknik olarak olanlardan bahsediyoruz, karma fonksiyonların kullanımı performans üzerinde olumlu bir etkiye sahip olabilir. Bu tür fonksiyonlar için çarpışmalar ve iyi bir dağıtım olasılığı çok önemlidir.

3. Şifreleme ihtiyaçları için. Bu tür Konvolasyon fonksiyonları, sonuçların değiştirilmesi zor olduğu veya mümkün olduğunca elde edilmesi gereken görevi zorlaştırmak için gerekli olan güvenlik alanlarında kullanılır. kullanışlı bilgi karmadan.

Hash nerede ve nasıl uygulanır?

Muhtemelen zaten tahmin ettiğiniz için, çok fazla görevi çözerken hash uygular. Bunlardan bazıları:

1. Şifreler genellikle açık formda değil, daha yüksek bir güvenlik derecesi sağlamanızı sağlayan HASH toplamları şeklinde saklanır. Sonuçta, saldırgan böyle bir veritabanına erişse bile, hala bu karma kodlarına uygun metinleri almak için çok fazla zaman harcamak zorunda kalacak. İşte "ilk verileri karma değerlerden geri yüklemenin karmaşıklığı" karakteristik özelliğidir.

Not: Şifrelerin güvenliğini arttırmak için makalenin eşyası ile tanışmanızı tavsiye ederim.

2. Programlamada, veritabanları dahil. Tabii ki, çoğu zaman izin veren veri yapıları hakkında konuşuyoruz. hızlı arama. Saf teknik yönü.

3. Veri iletimi verileri (İnternet dahil). TCP / IP gibi birçok protokol, kaynak mesajın karma miktarını içeren özel kontrol alanlarını içerir, böylece bir hata oluştuysa, veri aktarımını etkilemedi.

4. çeşitli güvenlik ile ilgili algoritmalar için. Örneğin, elektronik dijital imzalarda Hash kullanılır.

5. Dosyaların bütünlüğünü doğrulamak için. Dikkat ettiyseniz, internetteki dosyaları karşılamak genellikle mümkündür (örneğin, Arşivler) ek açıklamalar karma kodu ile. Bu önlem, yalnızca internetten indirilirken hasar gören dosyayı yanlışlıkla çalıştırmazsınız, aynı zamanda barındırmanın sadeliği vardır. Bu gibi durumlarda, hash'i hızlı bir şekilde kontrol edebilirsiniz ve gerekirse dosyayı abartabilirsiniz.

6. Bazen, eşsiz tanımlayıcılar oluşturmak için karma fonksiyonlar kullanılır (bölüm olarak). Örneğin, resimleri veya basitçe dosyaları kaydederken, genellikle tarih ve saat ile birlikte isimlerde karma kullanırsınız. Bu, aynı ada sahip dosyaların üzerine yazmanıza izin verir.

Aslında, daha uzakta, daha sık, karma fonksiyonlarında kullanılıyor bilişim Teknolojileri. Esas olarak veri miktarı ve en çok gücü olduğu gerçeğinden dolayı basit bilgisayarlar Şiddetle büyülenmiş. İlk durumda, biz arama hakkındadır ve ikincisinde, güvenlik sorunları hakkında daha fazlasıdır.

Ünlü karma fonksiyonları

En ünlü, aşağıdaki üç karma işlevidir.

Açıklama: Bu derste, HASH fonksiyonu kavramı da formüle edilmiştir. kısa inceleme Hash fonksiyonlarının oluşumu için algoritmalar. Ek olarak, bir karma işlevi oluşturmak için şifreleme için blok algoritmaları kullanma olasılığı olarak kabul edilir.

Dersin amacı: "Hash Fonksiyonu" konseptiyle ve bu tür fonksiyonların prensipleriyle tanışmak.

Hash fonksiyonu kavramı

Karma fonksiyonu (karma işlevi) Bir hatalı uzunluk satırları için bazı tamsayı veya başka bir sabit uzunluktaki dizgiyi hesaplar. Matematiksel olarak, şöyle yazılabilir:

m, bazen adı verilen orijinal mesajdır. mevcutve H - Sonuç, hash fonksiyonu (ve yanı sıra hash kodu veya dIGEST mesajı (İngilizceden. mesaj özeti.)).

Hash fonksiyonunun anlamı, numunenin karakteristik özelliğini belirlemektir - karma fonksiyonunun anlamı. Bu değer genellikle belirli bir sabit boyuta sahiptir, örneğin, 64 veya 128 bit. Hash kodu, herhangi bir görevi çözmek için daha da analiz edilebilir. Örneğin, verileri karşılaştırmak için karma kullanılabilir: eğer iki hash kodu farklı ise, diziler garanti edilir; Aynısı - diziler büyük olasılıkla aynıdır. Genel olarak, kaynak veriler ve karma kodu arasındaki açıklayıcı yazışma, Hash fonksiyonlarının sayısının her zaman giriş seçeneklerinden daha az olması nedeniyle değildir. Bu nedenle, aynı karma kodları veren birçok giriş mesajı vardır (bu durumlar denir) collisia). Çarpışma oluşumunun olasılığı, Hash fonksiyonlarının kalitesinin değerlendirilmesinde önemli bir rol oynamaktadır.

Hash fonksiyonları, modern şifrelemede yaygın olarak kullanılmaktadır.

En basit karma fonksiyonu, "Modül 2'nin toplamı" işlemini aşağıdaki şekilde kullanılarak hazırlanabilir: Giriş dizesini elde ediyoruz, tüm baytları modül 2 ile katlıyoruz ve bayt sonucu bir karma fuck olarak döndürür. Hash fonksiyonunun uzunluğu, bu durumda giriş mesajının boyutundan bağımsız olarak 8 bit olacaktır.

Örneğin, orijinal mesajın dijital görünüme çevrilmesine izin verin, aşağıdakiler (onaltılık biçiminde):

Mesajı ikili görünüme aktaracağız, birbirlerine bayt yazar ve her sütuna modül 2'ye göre bitleri yerleştireceğiz:

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

Sonuç (0110 0101 (2) veya 65 (16)) ve karma fonksiyonunun değeri olacaktır.

Bununla birlikte, böyle bir karma işlevi, örneğin şekillendirme için şifreleme amaçlı olarak kullanılamaz. elektronik İmzaİmzalı mesajın içeriğini değiştirmek kolay olduğundan, sağlama toplamı değerlerini değiştirmeden.

Bu nedenle, kabul edilen karma fonksiyonu şifreleme uygulamaları için uygun değildir. Şifrelemede, karma fonksiyonu, aynı karma fonksiyonu ile iki tip oluşturmak zorsa, yanı sıra fonksiyon çıkışı açıkça girişe bağımlı değildir.

Kriptografik karma fonksiyonları için temel gereksinimleri formüle ediyoruz:

  • hash işlevi, herhangi bir boyutun bir mesajına uygulanmalıdır;
  • İşlev değerinin hesaplanması yeterince hızlı gerçekleştirilmelidir;
  • İyi bilinen bir karma fonksiyonu ile, uygun bir prototip m bulmak zor olmalıdır (neredeyse imkansız) olmalıdır;
  • İyi bilinen bir mesajla, M 'başka bir mesaj bulmak zor olmalı, kaynak mesajı gibi, karma fonksiyonunun aynı değerine sahip bir mesaj bulmak zor olmalıdır;
  • aynı karma işlevi ile herhangi bir rastgele çeşitli mesaj bulmak zor olmalıdır.

Tüm listelenen gereksinimleri karşılayan bir karma işlevi oluşturma kolay bir iş değildir. Ayrıca, fonksiyonun fonksiyonunun keyfi bir boyutun işlevi üzerine alındığını ve karma sonucunun bu farklı boyutlar için aynı derecede aynı olmaması gerektiğini de unutmayın.

Şu anda, pratikte, giriş mesajı işleme fonksiyonları, bir karma fonksiyonları olarak kullanılır ve Tipin bağımlandırılmasında giriş mesajının her bir M bloğu için H I hesaplanması.

h I \u003d H (M, H I-1)

burada H I-1, hash fonksiyonunu hesaplarken elde edilen sonuçtur. Önceki Blok Giriş verileri.

Sonuç olarak, HESH fonksiyonu verimi H N, tüm N giriş bloklarından bir fonksiyondur.

Karma fonksiyonu oluşturmak için blok algoritmalar şifrelemesini kullanın

Bir bloğu karma işlevi olarak kullanabilirsiniz. Kriptografik olarak blok algoritması tarafından kullanılan bloklar, o zaman karma işlevi güvenilir olacaktır.

Karma kodunu elde etmek için bir blok algoritması kullanmanın en basit yolu, mesajın CBC modunda şifrelemesidir. Bu durumda, mesaj, uzunluğu şifreleme algoritması ünitesinin uzunluğuna eşit olan bir blok dizisi olarak gösterilir. Gerekirse, son birim, sağ zerolara göre tamamlanır, böylece istenen uzunluğun birimidir. Hash son şifreli metin bloğu olacaktır. Güvenilir bir blok şifreleme algoritması kullanımına tabi olan, ortaya çıkan karma değeri aşağıdaki özelliklere sahip olacaktır:

  • belirli bir açık bilgi için HASH değerlerinin şifreleme anahtarını bilmeden neredeyse imkansızdır;
  • belirtilen karma değeri altında açık verilerin şifrelemesini bilmeden pratik olarak imkansızdır.

Bu şekilde oluşturulan houshing değeri genellikle denir İmitovka veya doğrulayıcı ve mesajın bütünlüğünü kontrol etmek için kullanılır. Böylece, simülatör açık veri ve gizli anahtar bilgilerine bağlı bir kontrol kombinasyonudur. Imitovka kullanmanın amacı, bilgi dizisindeki tüm rastgele veya kasıtlı değişiklikleri tespit etmektir. HASH fonksiyonu ile elde edilen değer, giriş mesajını işlenirken, mesajın doğru olduğu bilindiği anda mesaja eklenir. Alıcı, alınan mesajın taklit edilmesini hesaplayarak ve elde edilen karma koduyla karşılaştırarak mesajın bütünlüğünü kontrol eder ve bu da güvenli bir şekilde iletilmelidir. Onlardan biri güvenli yollar Belki Imitovka'nın şifrelemesi kapalı anahtar Gönderen, yani İmza Oluşturma. Gönderen ve alıcının genel bir simetrik şifreleme anahtarına sahipse, simetrik şifreleme için elde edilen karma kod algoritmasını şifrelemek de mümkündür.

IMITOVKA'yı elde etme ve kullanma işlemi, yerli standart GOST 28147-89'da açıklanmıştır. Standart, iletilen mesajın bütünlüğünü izlemek için tüm mesajın şifreleme işleminin şifreleme işleminin çıkışında elde edilen genç 32 bitini kullanmak için sunar. Aynı şekilde, Imitavka'yı oluşturmak için herhangi bir blok kullanılabilir simetrik şifreleme algoritması.

Bir karma kodunu oluşturmak için bir blok şifreyi kullanmanın bir başka yolu, aşağıdakilerdir. Kaynak mesajı seri bloklarda işlenir. Gerekirse, son blok, Zero tarafından tamamlanır, bazen son blokta, mesajın uzunluğunu formda İkili sayılar. Her aşamada, önceki aşamada elde edilen karma değerini şifreleyin, geçerli mesaj bloğunu anahtar olarak alarak. En son girilen şifreli değer son hash olacaktır.

Aslında, bir karma işlevi oluşturmak için bir blok şifreyi kullanmak için birkaç şema. Bir kaynak blok birimi olmasına izin verin, Hi - I seviyesi aşamasında Karma fonksiyonunun değeri, F, basit bir yedek modda kullanılan bir şifreleme algoritması bloğudur - modülün eklenmesi. Daha sonra mümkündür, Örneğin, aşağıdaki karma fonksiyon oluşum şemaları:

Bütün bu diyagramlarda, üretilen hash değerinin uzunluğu şifreleme sırasında bloğun uzunluğuna eşittir. Tüm bunların yanı sıra, şifreleme için bir blok algoritması kullanmak için diğer bazı şemaları, hash değerlerini hesaplamak için uygulamada kullanılabilir.

Blok algoritmaları temelinde tasarlanan hash fonksiyonlarının ana dezavantajı nispetendir düşük hız İş. Gerekli kriptoskop, giriş verilerinde daha az sayıda işlem için de sağlanabilir. Kriptik direnç gereksinimlerine dayanarak (en yaygın olanları - MD5, SHA-1, SHA-2 ve GOST R44.11-94) dayanarak sıfırdan bağımsız olarak tasarlanmış daha hızlı karma algoritmalar vardır.


Hash nedir?Hash fonksiyonu, kısa, belirli bir uzunluktaki dizede bilgilerin matematiksel dönüşümü denir.

Ona neden ihtiyacın var?Hash fonksiyonlarını kullanarak analiz, önemli dosyaların bütünlüğünü izlemek için kullanılır. işletim sistemi, Önemli programlar, önemli veriler. Kontrol hem gerektiği gibi hem de düzenli olarak yapılabilir.

Nasıl bitti?İlk başta, hangi dosyaların hangi bütünlüğünün izlenmesi gerektiğini belirleyin. Her bir dosya için, sonucu korurken hash'in değerini özel bir algoritma üzerinden hesaplamak için hesaplanır. İstenilen zamandan sonra, benzer bir hesaplama yapılır ve sonuçlar karşılaştırılır. Değerler farklıysa, dosyada bulunan bilgilerin değiştirildiği anlamına gelir.

Hangi özelliklerin karma işlevi olmalı?

  • keyrek uzunlukta verilerin dönüşümlerini sabit olarak gerçekleştirebilmelidir;
  • kriptoskopunun araştırılabileceği için açık bir algoritma olmalı;
  • tek taraflı olmalı, yani kaynak verilerini belirleyerek matematiksel yetenek olmamalıdır;
  • Çatışmaların "direnmesi" gerekir, yani, farklı giriş verileriyle aynı değerleri vermemelidir;
  • büyük bilgi işlem kaynakları gerektirmemelidir;
  • giriş verilerindeki en ufak bir değişiklik ile sonuç önemli ölçüde değişmelidir.

Popüler karma algoritmaları nelerdir?Aşağıdaki karma fonksiyonları şu anda kullanılıyor:

  • CRC - döngüsel aşırı kod veya sağlama toplamı. Algoritma çok basittir, çok sayıda Gerekli çıkış uzunluğuna bağlı olarak varyasyonlar. Şifreleme değil!
  • MD 5 çok popüler bir algoritmadır. Onun gibi önceki versiyon MD 4 bir şifreleme işlevidir. HESHA boyutu 128 bit.
  • SHA -1 aynı zamanda çok popüler bir şifreleme açıklığıdır. HESHA boyutu 160 bit.
  • GOST R 34.11-94 - HASH fonksiyonlarını hesaplamak için Rus şifreleme standardı. HESHA boyutu 256 bit.

Bu algoritmalar ne zaman bir sistem yöneticisi kullanabilir?Genellikle, üretici, müzik, film veya diğer bilgilerden gelen programlar gibi herhangi bir içeriği indirirken mevcuttur. kontrol toplamlarıbelirli bir algoritmaya göre hesaplanır. Güvenlik nedeniyle, indirdikten sonra, karma fonksiyonunun bağımsız bir hesaplanmasını yapmanız ve değeri web sitesinde veya uygulamada dosyaya belirtilenlerle karşılaştırmak gerekir. Hiç yaptın mı?

Hask saymak için daha uygun olan nedir?Şimdi her ikisinin de ödenmiş ve kullanımı özgür olan çok sayıda benzer yardımcı program var. Şahsen Hashtab'ı sevdim. Birincisi, kurulum sırasındaki yardımcı program, ikinci olarak, dosya özelliklerine bir sekme biçimine gömülür, ikincisi, çok sayıda karma algoritması seçmenize olanak sağlar ve üçüncüsü, özel ticari olmayan kullanım için ücretsizdir.

Rusça nedir?Yukarıda belirtildiği gibi, Rusya'da, birçok bilgi güvenliği araçlarının birçok üreticisinde her yerde kullanılan bir Hashing GOST R44.11-94 standardına sahiptir. Bu fonlardan biri, orijinal durumun düzeltme ve kontrolü programıdır. yazılım paketi "Düzelt". Bu program, SZI uygulamasının etkinliğini kontrol etmenin bir yoludur.

Windows 9x / NT / 2000 / XP için Düzeltme (Sürüm 2.0.1)

  • Belirtilen dosyaların kontrollerini, uygulanan 5 algoritmadan biri ile hesaplayın.
  • Sabitleme ve yazılım paketinin orijinal durumunun kontrolü.
  • Yazılım paketinin sürümlerinin karşılaştırılması.
  • Katalogların fiksasyonu ve kontrolü.
  • Belirtilen dosyalardaki değişikliklerin izlenmesi (dizinler).
  • TXT, HTML, SV formatlarında raporların oluşumu.
  • Ürün 1 Haziran 2013 tarihine kadar NDV 3 No. 913'te FSTEC sertifikasına sahiptir.

Ve EDS nasıl?İşlevin, kullanıcının gizli anahtarı ile birlikte hesaplanmasının sonucu, elektronik olarak dijital imzanın hesaplandığı kriptografik algoritmanın girişine girer. Kesinlikle konuşursak, karma fonksiyonu EDS algoritmasının bir parçası değildir, ancak genellikle bu, genel anahtarını kullanarak saldırıyı dışlamak için özellikle yapılır.

Halen, birçok e-ticaret uygulaması, kullanıcının gizli anahtarını kapalı belirteç alanında (Rutoken, Etoken) oradan ayıklama yeteneği olmadan saklamanızı sağlar. Belirteçinin kendisi, kilobaytlarda ölçülen çok sınırlı bir bellek alanına sahiptir. Belgeyi imzalamak için, belgeyi belirteci kendisine aktarma imkanı yoktur, ancak belgenin karnını belirteç'e ve EDS'yi almak için çıkış noktasına aktarmak için.

Sorular:

1. Hash fonksiyonu kavramı.

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

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

1. Hash fonksiyonu kavramı

Özet fonksiyonu(HASH işlevi), isteğe bağlı uzunluk satırları için bazı tamsayı veya başka bir sabit uzunluktaki dizgiyi hesaplayan matematiksel veya başka bir işlev denir. Matematiksel olarak, şöyle yazılabilir:

h. \u003d H (m) ,

nerede M. - Bazen denilen kaynak mesaj mevcut , fakat h. - sonuç karma fonksiyonunun değeri (ve hash kodu veya dIGEST mesajı (İngilizceden. mesaj özeti.)).

Hash fonksiyonunun anlamı, numunenin karakteristik özelliğini belirlemektir - karma fonksiyonunun anlamı. Bu değer genellikle belirli bir sabit boyuta sahiptir, örneğin, 64 veya 128 bit. Hash kodu, herhangi bir görevi çözmek için daha da analiz edilebilir. Örneğin, verileri karşılaştırmak için karma kullanılabilir: eğer iki hash kodu farklı ise, diziler garanti edilir; Aynısı - diziler büyük olasılıkla aynıdır. Genel olarak, kaynak veriler ve karma kodu arasındaki açıklayıcı yazışma, Hash fonksiyonlarının sayısının her zaman giriş seçeneklerinden daha az olması nedeniyle değildir. Bu nedenle, aynı karma kodları veren birçok giriş mesajı vardır (bu durumlar denir) collisia ). Çarpışma oluşumunun olasılığı, Hash fonksiyonlarının kalitesinin değerlendirilmesinde önemli bir rol oynamaktadır.

Hash fonksiyonları, modern şifrelemede yaygın olarak kullanılmaktadır.

En basit karma fonksiyonu, "Modül 2'nin toplamı" çalışması kullanılarak derlenebilir: Giriş dizesini alıyoruz, tüm baytları modül 2 ile katlıyoruz ve bayt sonucu karma FUCH değeri olarak geri döner. Hash fonksiyonunun uzunluğu, bu durumda giriş mesajının boyutundan bağımsız olarak 8 bit olacaktır.

Örneğin, orijinal mesajın dijital görünüme çevrilmesine izin verin, aşağıdakiler (onaltılık biçiminde):

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

Mesajı ikili görünüme aktaracağız, birbirlerine bayt yazar ve her sütuna modül 2'ye göre bitleri yerleştireceğiz:

0010 1011

0001 0100

1010 1001

0101 1111

1110 0100

——————-

0010 1101

Sonuç: 0010 1101 veya 2 D. Ve karma fonksiyonunun değeri olacaktır.

Bununla birlikte, böyle bir karma fonksiyonu, örneğin, örneğin bir elektronik imza oluşturmak üzere, imzalanan mesajın içeriğini değiştirmek için uygun bir imza oluşturmak için kullanılamaz.

Bu nedenle, test karma işlevi şifreleme uygulamaları için uygun değildir. Şifrelemede, karma fonksiyonu, aynı karma fonksiyonu ile iki tip oluşturmak zorsa, yanı sıra fonksiyon çıktısının girişe açık bir bağımlılığa sahip olmadığı takdirde iyi kabul edilir.

Kriptografik karma fonksiyonları için temel gereksinimleri formüle ediyoruz:

· Hash fonksiyonu, herhangi bir boyuttaki mesaj için geçerli olmalıdır;

· İşlev değerinin hesaplanması yeterince hızlı gerçekleştirilmelidir;

· Hash fonksiyonunun bilinen bir anlamı ile, uygun bir prototip bulmak zor olmalıdır (neredeyse imkansız) olmalıdır. M. ;

· Tanınmış bir mesajla M. Başka bir mesaj bulmak zor olmalıdır. M ' Kaynak mesajı gibi, karma fonksiyonunun aynı değeri ile;

· Aynı karma fonksiyonuyla herhangi bir rastgele çeşitli mesaj bulmak zor olmalıdır.

Tüm listelenen gereksinimleri karşılayan bir karma işlevi oluşturma kolay bir iş değildir. Ayrıca, fonksiyonun fonksiyonunun keyfi bir boyutun işlevi üzerine alındığını ve karma sonucunun bu farklı boyutlar için aynı derecede aynı olmaması gerektiğini de unutmayın.

Şu anda, pratikte, fonksiyonlar karma fonksiyonları olarak kullanılır, ünitenin arkasındaki giriş mesajı bloğunu işleme ve hash- sELAM. Her blok için M ben. Bağımlılık üzerine giriş mesajı

h I \u003d H (M, H I-1)

nerede h i-1 - Önceki giriş verisi bloğu için HASH işlevini hesaplarken elde edilen sonuç.

Sonuç olarak, hash fonksiyonunun verimi h N. hepsinden bir fonksiyondur n. Giriş blokları.

2. Bir karma işlevi oluşturmak için blok algoritmalar şifrelemesini kullanın.

Karma fonksiyonu olarak, simetrik şifreleme için bir blok algoritması kullanabilirsiniz. Kullanılan blok algoritması bir şifreleme desteği ise, ardından karma işlevi güvenilir olacaktır.

Karma kodunu elde etmek için bir blok algoritması kullanmanın en basit yolu, CBC modunda mesajın şifrelemesidir ( Cipher Block Zincirleme - Ciphertex Debriyaj Modu). Bu durumda, mesaj, uzunluğu şifreleme algoritması bloğunun uzunluğuna eşit olan bir blok dizisi olarak gösterilir. Gerekirse, son birim, sağ zerolara göre tamamlanır, böylece istenen uzunluğun birimidir. Hash son şifreli metin bloğu olacaktır. Güvenilir bir blok şifreleme algoritması kullanımına tabi olarak, elde edilen hash aşağıdaki özelliklere sahip olacaktır:

· Belirtilen bir açık bilgi için HASH değerinin şifrelemesini bilmeden pratik olarak imkansız;

· Belirtilen bir karma değeri için açık verilerin şifrelemesini bilmeden pratik olarak imkansızdır.

Bu şekilde oluşan mütevazi genellikle denir İmitovka veya doğrulayıcı ve mesajın bütünlüğünü kontrol etmek için kullanılır. Böylece, simülatör açık veri ve gizli anahtar bilgilerine bağlı bir kontrol kombinasyonudur. Imitovka kullanmanın amacı, bilgi dizisindeki tüm rastgele veya kasıtlı değişiklikleri tespit etmektir. HASH fonksiyonu ile elde edilen değer, giriş mesajını işlenirken, mesajın doğru olduğu bilindiği anda mesaja eklenir. Alıcı, alınan mesajın taklit edilmesini hesaplayarak ve elde edilen karma koduyla karşılaştırarak mesajın bütünlüğünü kontrol eder ve bu da güvenli bir şekilde iletilmelidir. Bu güvenli yollardan biri, gönderenin taklitçisini kapalı bir anahtarla şifreleyebilir, yani. İmza Oluşturma. Gönderen ve alıcının genel bir simetrik şifreleme anahtarına sahipse, simetrik şifreleme için elde edilen karma kod algoritmasını şifrelemek de mümkündür.

IMITOVKA'yı elde etme ve kullanma işlemi, yerli standart GOST 28147-89'da açıklanmıştır. Standart, iletilen mesajın bütünlüğünü izlemek için tüm mesajın şifreleme işleminin şifreleme işleminin çıkışında elde edilen genç 32 bitini kullanmak için sunar. Aynı şekilde, simetrik şifreleme için herhangi bir blok algoritması imitavka oluşturmak için kullanılabilir.

Bir karma kodunu oluşturmak için bir blok şifreyi kullanmanın bir başka yolu, aşağıdakilerdir. Kaynak mesajı seri bloklarda işlenir. Son blok, gerekirse sıfırlarla desteklenirse, bazen bir ikili sayı formundaki mesajın uzunluğu son bloğa atfedilir. Her aşamada, önceki aşamada elde edilen karneyi şifreleyin, geçerli mesaj bloğunu anahtar olarak alarak. En son girilen şifreli değer son hash olacaktır.

Böylece, eğer normal mesaj şifreleme şeması ise M. Blok şifresini kullanarak f. anahtarda İçin Olarak kaydettik E \u003d f (m, k) Sonra karma kod şeması h. Yukarıda açıklanan algoritmaya göre, nasıl hayal edebilirsiniz?

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

İlk karma kodu olarak h 0. Biraz sabit olsun. Şifreleme basit değiştirme modunda gerçekleştirilir. Kullanma belirtilen yöntem Blok boyutu, anahtarın uzunluğu ile çakışıyor ve hash değerinin boyutu ünitenin uzunluğu olacaktır.

Basit bir yedek modda bir blok şifreleme kullanmanın bir başka yolu da mümkündür: Mesaj elemanları önceki aşamada elde edilen karma değerleriyle şifrelenir:

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

Aslında, bir karma işlevi oluşturmak için bir blok şifreyi kullanmak için birkaç şema. İzin vermek M ben. - Kaynak mesajın bloğu, sELAM. - HASH fonksiyonunun değeri bEN. -sahne, f. - Basit bir değiştirme modunda kullanılan şifreleme için blok algoritması - Modül 2'nin eklenmesi. Daha sonra mümkün, örneğin, aşağıdaki hash fonksiyonları şekillendirme şemaları:

Bütün bu diyagramlarda, üretilen hash değerinin uzunluğu şifreleme sırasında bloğun uzunluğuna eşittir. Tüm bunların yanı sıra, şifreleme için bir blok algoritması kullanmak için diğer bazı şemaları, hash değerlerini hesaplamak için uygulamada kullanılabilir.

Blok algoritmaları temelinde tasarlanmış hash fonksiyonlarının ana dezavantajı nispeten düşük bir hızdır. Gerekli kriptoskop, giriş verilerinde daha az sayıda işlem için de sağlanabilir. Daha hızlı karma algoritmaları vardır (en yaygın olanlar - MD5, SHA-1, SHA-2 ve GOST R44.11-94).

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

Halen, çeşitli özel algoritmalar sunulur ve hash işlevini hesaplamak için pratik olarak kullanılır. En ünlü algoritmalar, MD5, SHA-1, SHA-2 ve SHA'nın diğer versiyonları ve ayrıca GOST R44.11-94'te belirtilen yerli algoritmalardır.

Algoritma Md5 MD4 hash formasyon algoritmasını iyileştirmenin bir sonucu olarak yirminci yüzyılın 90'ların başlarında ortaya çıktı. "MD" adındaki semboller, Mesajın özeti - mesajın bir özeti. Algoritmaların yazarı MD4 ve MD5 - R. RIVEST (R.RIVEST). MD5 kullanılması sonucunda, keyfi bir mesaj için 128 bitlik bir karma oluşur. Giriş verileri 512 bit blok ile işlenir. Algoritma ilköğretim kullanır mantıksal İşlemler (İnversiyon, birleşme, modülün eklenmesi, döngüsel kaymalar, vb.) Ve sıradan aritmetik ilave. Algoritmanın bu temel fonksiyonlarının kapsamlı tekrarı, sonucun işlemden sonra iyice karıştırılmasını sağlar. Bu nedenle, tesadüfen seçilen iki mesajın aynı karma koduna sahip olması muhtemel değildir. MD5 algoritması aşağıdaki özelliğe sahiptir: elde edilen hash değerinin her bir biti, her giriş bitinden bir fonksiyondur. MD5'in 128 bitlik bir karma değeri için en güçlü karma fonksiyonu olduğuna inanılmaktadır.

Algoritma Sha Güvenli Hash Algoritması - Güvenli Hash-Algoritması), ABD'nin Ulusal Standartları ve Teknolojisi Enstitüsü (NIST) tarafından geliştirildi ve 1993 yılında Amerikan Federal Bilgi Standardı olarak yayınlandı. SHA-1, ayrıca MD4 algoritmasına dayanan MD5. SHA-1, 512 bit bloğun kaynak işlemesine dayanarak 160 bitlik bir karma oluşturur. SHA-1 algoritması ayrıca basit mantıksal ve aritmetik işlemler kullanır. MD5'ten SHA-1 arasındaki en önemli fark, SHA-1'in karma kodunun MD5'ten 32 bit daha uzun olmasıdır. Her iki algoritmanın kriptenaliz için zorlukta aynı olduğunu varsayarsak, SHA-1 daha dirençli bir algoritmadır. Kaba kuvvet (ön saldırı) tarafından saldırıyı kullanarak, belirli bir karma koduna sahip olan keyfi bir mesaj oluşturmak daha zordur ve aynı karma koduna sahip iki mesaj oluşturmak da daha zordur.

2001 yılında, Amerika Birleşik Devletleri'nin Ulusal Standart Standartları ve Teknolojileri Enstitüsü, üç hash fonksiyonunu, SHA-1'den daha uzun bir süredir standart olarak standart olarak kabul etti. Genellikle, bu karma fonksiyonlar, SHA-2 veya SHA-256, SHA-384 ve SHA-512 olarak adlandırılır (algoritmalar tarafından oluşturulan hash kodunun uzunluğu başlıkta belirtilmiştir). Bu algoritmalar, yalnızca oluşturulan karma kodun uzunluğuna değil, aynı zamanda iç işlevleri ve işlenmiş bloğun uzunluğunu kullanır (SHA-256'da ünitenin uzunluğu - 512 ve SHA-384 ve SHA-512 blok uzunluğu) 1024 bitdir). SHA algoritmasının kademeli gelişmeleri, kriptik direncinde bir artışa yol açar. Algoritmalardaki farklılıklara rağmen, birbirlerinden dikkate alınarak, hepsi SHA-1 ve MD4'ün daha da gelişmesidir ve benzer bir yapıya sahiptir.

Rusya'da, GOST P34.11-94, HASH fonksiyonları için yerli bir standart olan kabul edilir. Yapısı, MD4 algoritmasına dayanan SHA-1.2 veya MD5 algoritmalarının yapısından oldukça farklıdır. Algoritma GOST R44.11-94 tarafından oluşturulan karma kodunun uzunluğu 256 bitdir. Algoritma, kaynak mesajı tarafından sağdan sola 256 bit bloklarla sırayla işlenir. Algoritma parametresi, hash'in başlangıç \u200b\u200bvektörüdür - keyfi bir sabit değer aynı zamanda 256 bittir. Algoritmada, GOST R 34.11-94, permütasyonun operasyonları, kesme, aritmetik ilavesi, modül eklenmesi 2 yardımcı fonksiyon GOST 34.11-94, basit bir yedek modda GOST 28147-89'a göre bir algoritma kullanır.

4. Hash fonksiyonları için gereksinimler

Hash fonksiyonunun bir sindirim veya "parmak izi" dosyası, mesajları veya bazı veri bloğunu almak için tasarlanmış tek yönlü bir işlev denir.

Hash kodu fonksiyon tarafından oluşturulur N. :

h \u003d H (M)

Nerede M. keyfi uzunluktaki bir mesajdır ve h. Sabit uzunluklu bir karma kodudur.

Mesaj kimlik doğrulaması olarak kullanılabilecek şekilde, karma fonksiyonunun eşleşmesi gereken gereklilikleri göz önünde bulundurun. Hash işlevinin çok basit bir örneğini düşünün. Ardından, karma fonksiyonunun yapımına birkaç yaklaşımı analiz ederiz.

Özet fonksiyonu N. Bu, mesajları doğrulamak için kullanılır, aşağıdaki özelliklere sahip olması gerekir:

1. Hash fonksiyonu N. Herhangi bir uzunluğun veri bloğuna uygulanmalıdır.

2. Hash fonksiyonu N. Sabit bir uzunluk çıkışı oluşturur.

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

4. Verilen herhangi bir karma kodu için h. Bulmak açıkça imkansız M. öyle ki H (m) \u003d h .

5. Verilen herhangi bir için h. Bunu bulmak hesaplamalı olarak imkansız

H. (Y) \u003d H (x).

6. Keyfi bir çift bulmak için hesaplamalı değildir ( h. , y. ) öyle ki H (y) \u003d h (x) .

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

Dördüncü özellik, HASH fonksiyonlarının tek taraflılığının gereksinimini belirler: Bu mesaj için bir karma kodu oluşturmak kolaydır, ancak bu karma kodundaki mesajı kurtarmak mümkün değildir. Bu özellik, HASH işlevini kullanarak kimlik doğrulaması, gizli bir değer içeriyorsa önemlidir. Bununla birlikte, gizli değerin kendisi gönderilmeyebilir, ancak karma işlevi tek taraflı değilse, düşman, gizli değeri aşağıdaki gibi kolayca ortaya çıkarabilir. Transferi yakaladığınızda, saldırgan bir mesaj alır M. ve karma kodu C \u003d H (SAB || M) . Saldırgan, karma işlevini ters çevirebilirse, o zaman, bu nedenle, SAB || M \u003d H - 1 (c) . Saldırgan şimdi bilir ve M. ve SAB || M. , teslim almak SAB. oldukça basit.

Beşinci mülk, hash fonksiyonunun değeri Hash fonksiyonunun değeri ile çakışacak başka bir mesajı bulmanın imkansız olmasını sağlar. bu mesaj. Bu, şifreli bir karma kodunu kullanırken doğrulayıcının sahte olduğunu önler. Bu durumda, rakip mesajı okuyabilir ve bu nedenle karma kodunu oluşturabilir. Ancak düşmanın gizli bir anahtarın sahibi olmadığı için, alıcının bulamadığı için mesajı değiştirme yeteneğine sahip değildir. Bu özellik yürütülmezse, saldırganın aşağıdaki eylem sırasını gerçekleştirme yeteneğine sahiptir: Mesajı ve şifreli karma kodunu kesmek için, Mesaj HASH kodunu hesaplayın, aynı karma koduyla alternatif bir mesaj oluşturun, orijinal mesajı değiştirin Sahte. Bu mesajların karma kodları çakıştığından, alıcı ikame algılamayacaktır.

İlk beş özelliği karşılayan karma fonksiyonu basit veya zayıf bir karma işlevi denir. Altıncı özellik yapılırsa, bu işlev güçlü bir karma işlevi denir. Altıncı mülk, "Doğum Günü" saldırısı olarak bilinen sınıf saldırılarına karşı korur.

5. Basit karma fonksiyonları

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

Hash fonksiyonunun en basit örneklerinden biri, her bloğun biti xor'dur:

I ile - bEN. Bit karma kodu, 1 <= i <= n .

k. - Numara n. - Bitti girişi.

b ij. bEN. Bit B. j. Blok.

Ardından, tüm mesaj, şifreli bloklar Y1, Y2, ..., YN + 1 oluşturmak için CCS modunda, CCS modunda da dahil olmak üzere şifrelenir. Tanım olarak, sahibim:

Ancak XN + 1 bir karma kodudur:

Önceki eşitlikteki bileşenler herhangi bir sırayla hesaplanabilir, bu nedenle, şifreli bloklar yeniden düzenlenmesi durumunda, karma kodu değiştirilmez.

NIST tarafından önerilen ilk standart, 64 bitlik mesaj bloklarına alışkın olan basit bir XOR kullandı, ardından tüm mesaj CCS modu kullanılarak şifrelenir.

"Doğum Günü Paradox"

Daha karmaşık karmaşık fonksiyonları göz önünde bulundurmadan önce, basit karma fonksiyonlardaki belirli bir saldırıyı analiz etmek gerekir.

Sözde "Doğum Günü Paradox" aşağıdaki gibidir. Diyelim ki, hash fonksiyonunun çıktı değerlerinin sayısı N. eşit derecede n. . Numara ne olmalı k. belirli değere X. ve değerler Y1 YK. En az bir Yi'nin eşitlik yapılması olasılığı

H (x) \u003d h (y)

0.5'ten fazla olurdu.

Bir kişi için Y. olasılığı H (x) \u003d h (y) , eşit 1 / N. .

Buna göre, olasılığı , eşit 1 - 1 / n .

Yaratırsan k. Değerler, tesadüf olmaması olasılığı, bir değere karşılık gelen olasılıkların ürününe eşit olacağını, yani (1 - 1 / n) k .

Sonuç olarak, en az bir tesadüf olasılığı eşittir

1 - (1 - 1 / n) K

Bu yüzden bunu öğrendik m. -Bed karma kodu seçmek için yeterli 2m-1 Mesajlar, karma kodlarının tesadüfinin olasılığı 0,5'ten büyüktü.

Şimdi aşağıdaki görevi düşünün: belirtir P (n, k) bir dizide olabilme olasılığı k. her biri alabilecek elemanlar n. Değerler, aynı değerlerle en az iki tane vardır. Ne eşit olmalı k. için P (n, k) daha fazla olurdu 0,5 ?

Öğeleri iki katına sahip olmadığı şekilde seçmenin farklı yollarının sayısı

n (n - 1) ... (N - K + 1) \u003d N! / (N-K)!

Eşitleri eşit seçmek için tüm olası yollar n K.

Çiftlenme olasılığı eşit değil n! / (N - k)! N k

Sırasıyla bir kopya var olma olasılığı

1 - N! / (N-K)! NK P (n, k) \u003d 1 - N! / ((n - k)! x nk) \u003d 1 - (n x (n - 1) x ... x (n - k-1)) / nk \u003d 1 - [(n - 1) / n x (n-2) / n x ... x (n - k + 1) / n] \u003d 1 - [(1- 1 / n) x (1 - 2 / n) x ... x (1 - (k-1) / n)]

Karma kodunun uzunluğu varsa m. Bit, yani Kabul etmek 2m. Değerler, T.

Benzer bir sonuç "Doğum Günü Paradoksu" olarak adlandırılır, çünkü yukarıdaki argümanlara uygun olarak, iki kişinin doğum günlerinin 0,5'ten büyük olması için, grupta sadece 23 kişi olmalıdır. Bu sonuç müthiş görünüyor, belki de gruptaki her biri için gruptaki bir başkasının doğum gününün doğum günüyle çakışması olasılığı oldukça küçük.

Hash fonksiyonlarının özelliklerinin değerlendirilmesine geri dönelim. 64-bit karma kodunun kullanıldığını varsayalım. Oldukça yeterli ve bu nedenle, karma kodu için güvenli bir uzunluk olduğu düşünülebilir. Örneğin, şifreli karma kodu ise Dan Uygun şifrelenmemiş mesajla bulaşır M. , sonra düşmanın bulması gerekecek M ' öyle ki

N (m) \u003d n (m) ,

mesajı değiştirmek ve alıcıyı aldatmak için. Ortalama olarak, düşman, karma kodunun yakalanan mesaja eşit olduğunu bulmak için 263 mesajdan geçmelidir.

Bununla birlikte, "Doğum Günü Paradoksunu" temel alan ç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 biri kesin bir anlamı olan mesaj seçenekleri. Düşman, her biri sahte olan ve bu mesajı değiştirmeyi amaçlayan aynı sayıda mesajı hazırlar.

2. Aynı karma koduna sahip bir çift mesaj arayışı içinde iki mesaj seti karşılaştırılır. "Doğum Günü paradoksu" uyarınca başarı olasılığı 0,5'ten büyüktür. Uygun çift bulunmazsa, buhar bulununcaya kadar ek kaynak ve sahte mesajlar oluşturulur.

3. Saldırgan, gönderene imza için mesajın ilk sürümünü sunar. Bu imza daha sonra alıcıya transfer için sahte bir seçeneğe eklenebilir. Her iki seçenek de aynı karma koduna sahip olduğundan, aynı imza oluşturulacaktır. Düşman, şifreleme anahtarını bilmemek bile, başarı konusunda kendinden emin olacak.

Böylece, 64-bit karma kodu kullanılıyorsa, hesaplamaların gerekli karmaşıklığı yaklaşık 232'dir.

Sonuç olarak, karma kodunun uzunluğunun oldukça büyük olması gerektiğini unutmayız. 64 bit'e eşit olan uzunluk şu anda güvenli olarak kabul edilmez. Uzunluğun 100 bit sırasını oluşturması tercih edilir.

Şifreli bloklar zinciri kullanmak

Şifreli bir blok zinciri oluşturmaya dayanan çeşitli karma fonksiyonlar vardır, ancak gizli bir anahtar kullanmadan. Bu hash fonksiyonlarından biri Rabin tarafından önerildi. İleti M. sabit uzunluktaki bloklara bölünmüş M1, M2,. . . , Mn. ve karma kodunu hesaplamak için DES gibi bir simetrik şifreleme algoritması kullanılarak G. Aşağıdaki şekilde:

H 0 - İlk anlam N ben. = Emi G. = H N.

Bu, CSA modunda şifreleme kullanımına benzer, ancak bu durumda gizli bir anahtar yoktur. Herhangi bir basit karma fonksiyonunda olduğu gibi, bu algoritma "doğum günü saldırısına" karşı duyarlıdır ve şifreleme algoritması DES ve yalnızca 64-bit karma kodu oluşturulursa, sistem oldukça savunmasız olarak kabul edilir.

Düşman sadece bir mesaja ve karşılık gelen şifreli karma koduna erişse bile, "Doğum Günü" gibi başka saldırılar olabilir ve birkaç mesaj ve şifrelenmiş karma kodları alamaz. Aşağıdaki senaryo mümkündür: Düşmanın, şifreli bir karma kodu biçiminde bir kimlik doğrulaması ile bir mesajı ele geçirdiğini varsayalım ve şifrelenmemiş karma kodunun uzunluğu olduğu bilinmektedir. m. bit. Daha sonra düşman aşağıdaki işlemleri gerçekleştirmelidir:

· Yukarıda açıklanan algoritmayı kullanma, şifrelenmemiş karma kodunu hesaplayın G. .

· Formda sahte bir mesaj oluşturun Q1, Q2,. . . , Qn-2 .

· Hesaplamak N ben \u003d e qi için 1 <= i <= N-2 .

· Oluşturmak 2 m / 2 Rastgele bloklar H. Ve her blok için H. hesaplamak E H. . Ek olarak oluştur 2 m / 2 Yeterince blok Y. ve her blok için Y. hesaplamak D y [g] nerede D. - Buna karşılık gelen dekorasyon fonksiyonu E. . "Doğum Günü Paradox" na göre, yüksek derecede olasılıkla, bu sekansın blok içereceğini söyleyebiliriz. H. ve Y. öyle ki E X \u003d D Y [Y] .

· Bir mesaj oluştur Q1, Q2,. . . , Qn-2, x, y . Bu mesajın karma kodu var G. Ve bu nedenle, şifreli bir kimyalatçıyla kullanılabilir.

Bu saldırı şekli, "ortada toplantı" bir saldırı olarak bilinir. Çeşitli çalışmalarda, blok zincirine dayalı bir yaklaşımı geliştirmek için daha ince yöntemler sunulmaktadır. Örneğin, Devi ve fiyat aşağıdaki seçenek:

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

Bununla birlikte, bu şemaların her ikisi de farklı saldırılarda güvenlik açıklarına sahiptir. Daha genel bir durumda, bir miktar "doğum günü saldırısı", herhangi bir karma algoritması ile başarılı olduğu gösterilebilir, bu da gizli bir anahtar kullanmadan şifreli bir blok zincirinin kullanımını içeren.

Daha fazla araştırma, karma fonksiyonları oluşturmak için başka yaklaşımlar bulmaya yöneliktir.

MD5 karma fonksiyonu

Ron Rivesom tarafından MIT'den geliştirilen MD5 Mesaj Digest Algorithm (RFC 1321) göz önünde bulundurun.

MD5 Yürütme Mantığı

Algoritma girişte keyfi bir uzunluk alır ve bir çıktı olarak 128 toplu mesaj sindirir. Algoritma aşağıdaki adımlardan oluşur:

İncir. 8.1.MD5 Yürütme Mantığı

Adım 1: Eksik bitler ekleme

Mesaj, uzunluğunun 448 modulo 512 () 'e eşit olması böyle bir şekilde tamamlanır. Bu, ilave mesajın 64 bit uzunluğunun, sayı, birden fazla 512'den daha az olduğu anlamına gelir. Mesaj istenen uzunluğa sahip olsa bile, her zaman gerçekleştirilir. Örneğin, mesajın uzunluğu 448 ise, 512 bit ile 960 bit olarak tamamlanır. Böylece, eklenen bit sayısı 1 ila 512 arasındadır.

Ekleme, gerekli sayıda sıfırların takip ettiği bir birimden oluşur.

Adım 2: Uzunluk Ekleme

Kaynak uzunluğunun 64 bit gösterimi (eklenmeden önce) Mesajları bitlerdeki mesajlar ilk adımın sonucuna birleştirilir. İlk uzunluk 2,64'ten büyükse, yalnızca son 64 bit kullanılır. Böylece, alan modül 2 64 tarafından kaynak mesajının uzunluğunu içerir.

İlk iki adımın bir sonucu olarak, uzunluğu birden fazla 512 bit olan bir mesaj oluşturulur. Bu genişletilmiş mesaj, 512-bit blok yı 0, y 1 dizisi olarak gösterilir. . ., Y L-1, genişletilmiş mesajın toplam uzunluğu L * 512 bitlerine eşittir. Böylece, alınan ileri mesajın uzunluğu on altı'dan fazla 32 bitlik kelimesidir.

İncir. 8.2.Genişletilmiş bir mesajın yapısı

Adım 3: MD-Tampon Başlatma

Hash fonksiyonunun orta ve nihai sonuçlarını saklamak için 128 bit bir tampon kullanılır. Tampon, dört adet 32 \u200b\u200bbit kayıt (A, B, C, D) olarak gösterilebilir. Bu kayıtlar aşağıdaki onaltılık sayılarla başlatılır:

A \u003d 01234567 B \u003d 89AbCDEF C \u003d FEDCBA98 D \u003d 76543210

Adım 4: 512-bit (16-lirik) bloklar dizisinin işlenmesi

Algoritmanın temeli, HMD5 olarak gösterilen dört döngüsel tedaviden oluşan bir modüldür. Dört döngü benzer bir yapıya sahiptir, ancak her döngü, sırasıyla F, F G, F H ve F ile gösterilen ilköğretim mantıksal işlevini kullanır.

İncir. 8.3.Sonraki 512 bit bloğu işleme

Her döngü, şu anda işlenmiş olan 512 bit blok y q, bir ara sindirim değeri olan ve bu tamponun içeriğini değiştiren ABCD tamponun 128 bit değeri olarak alır. Her döngü ayrıca, günah fonksiyonuna göre 64 eleman tablosu T'nin dördüncü bölümünü kullanır. T [i] tarafından gösterilen I-TH elemanı T, 2 32 * ABS'nin tamamına eşittir (SIN (I)), Radyalılara ayarlanır. ABS (SIN (I)) 0 ile 1 arasında bir sayıdır, her öğe t 32 bit olarak gösterilebilecek bir bütündür. Tablo, giriş verilerindeki herhangi bir düzenliliği ortadan kaldırması gereken 32 bit değerlerin "rastgele" bir ayarını sağlar.

MD Q + 1 elde etmek için, dört döngü verimi MD Q ile modül 2 32 ile oluşturulur. Ekleme, tampondaki dört kelimenin her biri için bağımsız olarak gerçekleştirilir.

CLS S, 32 bit argüman bitlerinin solundaki bir döngüsel değişimdir.

X [K] - M - K-O 32 bit kelime, Q-Ohm 512 mesaj bloğunda.

T [i] - I-O, Matris T'de 32 bit kelime

+ - Modülün eklenmesi 2 32.

Algoritmanın dört döngüsünün her birinde, dört temel mantıksal fonksiyondan biri kullanılıyor. Her bir temel özellik, girişte üç adet 32 \u200b\u200bbit kelime alır ve çıkış bir 32 bit kelime oluşturur. Her işlev çok sayıda parti mantıksal işlemdir, yani. NTH çıkış biti, üç girişin N-B bitinden bir fonksiyondur. İlköğretim fonksiyonları aşağıdaki gibidir:

32 bitlik kelimelik bir dizi X, şu anda işlendiği mevcut 512 bit giriş bloğunun değerini içerir. Her döngü 16 kez çalışır ve giriş mesajının her bloğu dört döngüde işlendiğinden, her giriş ünitesi, Şekil 2'de gösterilen diyagrama göre işlenir. 4, 64 kez. Giriş 512-bit bloğunu on altı 32 bit kelime biçiminde gönderirseniz, her giriş 32 bit kelime dört kez, her bir döngüde bir kez ve Tablo T'nin her bir elemanı, 64 32 bitlikten oluşur. Kelimeler, sadece bir kez kullanılır. Döngünün her aşamasından sonra, A, B, C ve D'in solundaki bir döngüsel kayma oluşuyor. Her adımda, ABCD tamponun dört kelimesinden sadece biri değişir. Sonuç olarak, her bir tampon kelime 16 kez değişir ve ardından bu birimin son çıktısını elde etmek için sonunda 17. kez.

sindirmek.

2. Hız: Algoritmanın program uygulaması oldukça hızlı bir şekilde gerçekleştirilmelidir. Özellikle, algoritma 32 bit mimaride yeterince hızlı olmalıdır. Bu nedenle, algoritma, 32 bitlik kelimelerden fazla bir temel operasyon setine dayanır.

3. Sadelik ve kompaktlık: Algoritma açıklamada basit olmalı ve programları, büyük programlar veya joker karakterler olmadan kolay olmalıdır. Bu özellikler sadece açık bir program faydalarına sahip değil, aynı zamanda güvenlik açısından da arzu edilir, çünkü olası zayıf noktaları analiz etmek için basit bir algoritmaya sahip olmak daha iyidir.

4. Little- Endian mimarisi tarafından istenen: Bazı işlemci mimarileri (Intel 80xxx hattı gibi), baytın düşük bayt adreslerini (küçük endian). Diğerleri (Sun Sparcstation gibi), kelimenin doğru baytlarını junior bayt adreslerinin konumunda saklayın (ilk döngüde büyük MD4 ek sabiti geçerli değildir. İkinci döngündeki her adım için benzer bir ek sabit kullanılır. Başka bir ek Sabit, üçüncü döngüdeki adımların her biri için kullanılır.. Hash kodu, girişin her bitinden bir fonksiyondur. FF F, FG, FH ve FF'nin temel fonksiyonlarının karmaşık tekrarı, sonucun iyice karıştırılmasını sağlar; Yani, açıkça benzer kalıplara sahip olsalar bile, aynı çıktı değerini oluşturan aynı şeye sahip olsa bile, aynı çıktı değerini yaratan aynı şeye sahip olmanın olası değildir. Bu, MD5'ün 512 bit'in tek bloğu üzerindeki yürütülmesinin ABCD tamponundaki iki farklı giriş değeri için aynı çıktı. Bu yaklaşımı başarılı bir saldırı için genişletme yöntemi MD5 mevcut değil.