İnandığım gibi, birçoğu 2007'den beri ABD Ulusal Standartlar ve Teknoloji Enstitüsü'nün (NIST) SHA-1'in ve bir SHA-2 algoritma ailesinin yerini alacak bir karma algoritma geliştirmek için bir yarışma düzenlediğinin farkında. Ancak, bu konu, bir nedenden dolayı, sitede dikkatlerden mahrum bırakılmıştır. Beni sana getiren de bu aslında. Hash algoritmaları üzerine bir dizi makaleyi dikkatinize sunuyorum. Bu döngüde hash fonksiyonlarının temellerini birlikte inceleyeceğiz, en ünlü hash algoritmalarını ele alacağız, SHA-3 yarışmasının atmosferine dalacağız ve onu kazanacağını iddia eden algoritmaları ele alacağız, onları mutlaka test edeceğiz. Ayrıca, mümkünse, Rus hash standartları da dikkate alınacaktır.

Kendim hakkında

Bilgi Güvenliği Bölümü Öğrencisi.

Hashing hakkında

Şu anda, karma kullanılmadan neredeyse hiçbir şifreleme uygulaması tamamlanmamıştır.
Hash işlevleri, genellikle ikili alfabede yazılan rastgele bir mesajı veya veri kümesini, konvolüsyon adı verilen sabit uzunlukta bir bit desenine "sıkıştırmak" için tasarlanmış işlevlerdir. Hash fonksiyonları, istatistiksel deneyler yürütürken, mantıksal cihazları test ederken, hızlı arama için algoritmalar oluştururken ve veritabanlarındaki kayıtların bütünlüğünü kontrol ederken çeşitli uygulamalara sahiptir. Karma işlevleri için temel gereksinim, değerlerinin rastgele bir argüman değeri seçimiyle dağılımının tekdüzeliğidir.
Bir kriptografik karma işlevi, kriptografik olarak güvenli olan, yani kriptografik uygulamalara özgü bir dizi gereksinimi karşılayan herhangi bir karma işlevidir. Kriptografide, aşağıdaki problemleri çözmek için hash fonksiyonları kullanılır:
- iletim veya depolama sırasında veri bütünlüğü kontrol sistemleri oluşturmak,
- veri kaynağı kimlik doğrulaması.

Bir karma işlevi herhangi bir işlevdir h:X -> Y, kolayca hesaplanabilir ve herhangi bir mesaj için M anlam h(M) = H (evrişim) sabit bir bit uzunluğuna sahiptir. X- tüm mesajların seti, Y- sabit uzunlukta ikili vektörler kümesi.

Kural olarak, hash işlevleri, tek adımlı daralma işlevleri olarak adlandırılan temelde oluşturulur. y \u003d f (x 1, x 2) iki değişken, nerede x 1, x2 ve y- ikili uzunluk vektörleri m, n ve n sırasıyla ve n evrişimin uzunluğu ve m- mesaj bloğu uzunluğu.
Değeri almak için h(M) mesaj önce uzunluk bloklarına bölünür m(aynı zamanda, mesajın uzunluğu aşağıdakilerin katı değilse m sonra son blok özel bir şekilde tam blokla tamamlanır) ve sonra alınan bloklara M 1 , M 2 ,.., MN evrişimi hesaplamak için aşağıdaki sıralı prosedürü uygulayın:

H o \u003d v,
H ben = f(M ben ,H ben-1), ben = 1,.., N,
h(M) = HN

Burada v- bazı sabitler, genellikle başlatma vektörü olarak adlandırılır. o dışarı çıkar
çeşitli nedenlerle ve gizli bir sabit veya bir dizi rastgele veri olabilir (örneğin, bir tarih ve saat seçimi).
Bu yaklaşımla, hash fonksiyonunun özellikleri tamamen tek adımlı daralma fonksiyonunun özellikleri ile belirlenir.

Anahtarlı ve anahtarsız olmak üzere iki önemli kriptografik hash işlevi vardır. Anahtar karma işlevlerine mesaj doğrulama kodları denir. Hem veri kaynağının doğruluğunu hem de karşılıklı güvenilen kullanıcıların bulunduğu sistemlerde verilerin bütünlüğünü ek araçlar olmadan garanti etmeyi mümkün kılarlar.
Anahtarsız hash işlevlerine hata algılama kodları denir. Verilerin bütünlüğünü garanti etmek için ek araçlar (örneğin şifreleme) yardımıyla mümkün kılarlar. Bu karma işlevler, hem güvenen hem de güvenmeyen kullanıcılara sahip sistemlerde kullanılabilir.

İstatistiksel özellikler ve gereksinimler hakkında

Dediğim gibi, hash fonksiyonları için temel gereksinim, değerlerinin rastgele bir argüman değeri seçimi ile düzgün dağılımıdır. Kriptografik özet işlevleri için, argümandaki en ufak bir değişiklikle işlevin değerinin büyük ölçüde değişmesi de önemlidir. Buna çığ etkisi denir.

İle anahtar işlevler karma aşağıdaki gereksinimlere sahiptir:
- fabrikasyonun imkansızlığı,
- modifikasyonun imkansızlığı.

İlk gereksinim, bir mesajı doğru katlama değeriyle eşleştirmenin çok zor olduğu anlamına gelir. İkincisi, bilinen bir katlama değerine sahip belirli bir mesajı, doğru katlama değerine sahip başka bir mesajı eşleştirmenin yüksek karmaşıklığıdır.

Anahtarsız işlevler için gereksinimler şunlardır:
- tek yönlü,
- çarpışmalara karşı direnç,
- ikinci prototipi bulma direnci.

Tek yönlülük, belirli bir evrişim değeriyle bir mesaj bulmanın yüksek karmaşıklığı olarak anlaşılır. Unutulmamalıdır ki üzerinde şu an kanıtlanmış tek yönlü kullanımda karma işlevler yok.
Çarpışma direnci, aynı kat değerlerine sahip bir çift mesaj bulmanın zorluğu olarak anlaşılmaktadır. Genellikle, algoritmanın eskidiğinin ve hızlı bir şekilde değiştirilmesi ihtiyacının ilk sinyali olarak hizmet eden, kriptanalistler tarafından çarpışmalar oluşturmanın bir yolunun bulunmasıdır.
İkinci ön görüntüyü bulma direnci, bilinen bir katlama değerine sahip belirli bir mesaj için aynı kat değerine sahip ikinci bir mesaj bulmanın zorluğu olarak anlaşılmaktadır.

Bu, gelecekte bizim için yararlı olacak teorik kısımdı ...

Popüler karma algoritmalar hakkında

algoritmalar CRC16/32- sağlama toplamı (şifreli dönüştürme değil).

algoritmalar MD2/4/5/6. RSA algoritmasının yazarlarından biri olan Ron Rivest'in eseridir.
MD5 algoritması bir zamanlar çok popülerdi, ancak bilgisayar korsanlığı için ilk ön koşullar doksanların sonlarında ortaya çıktı ve şimdi popülaritesi hızla düşüyor.
MD6 algoritması, yapıcı bir bakış açısıyla çok ilginç bir algoritmadır. SHA-3 yarışmasına aday gösterildi, ancak ne yazık ki yazarlar onu standarda getirmeyi başaramadı ve bu algoritma ikinci tura geçen adaylar listesinde değil.

Cetvel algoritmaları SHA Günümüzde yaygın olarak kullanılan algoritmalar. SHA-1'den SHA-2 sürüm standartlarına aktif bir geçiş var. SHA-2, SHA224, SHA256, SHA384 ve SHA512 algoritmalarının toplu adıdır. SHA224 ve SHA384, esasen sırasıyla SHA256 ve SHA512'nin analoglarıdır, ancak evrişim hesaplandıktan sonra içindeki bilgilerin bir kısmı atılır. Yalnızca eski ekipman modelleri ile uyumluluğu sağlamak için kullanılmalıdırlar.

Rus standartı - GOST 34.11-94.

Bir sonraki makalede

MD algoritmalarına genel bakış (MD4, MD5, MD6).

Edebiyat

A.P. Alferov, Kriptografinin Temelleri.

Bruce Schneier, Uygulamalı Kriptografi.

Hashing, verileri adreslemenin özel bir yöntemidir (bir çeşit boşluk algoritması) benzersiz anahtarlarıyla ( anahtar ) ihtiyacınız olan bilgiyi hızlı bir şekilde bulmak için.

Temel konseptler

karma tablo

Karma tablo, bazı işlevler (Hash işlevi) tarafından verilen özel bir adrese sahip normal bir dizidir.

Özet fonksiyonu

Bir veri öğesinin anahtarını tablodaki bir dizine dönüştüren bir işlev ( karma tablo), denir Özet fonksiyonu veya Özet fonksiyonu :

i = h (anahtar );

nerede anahtar- dönüştürülebilir anahtar, i- sonuçtaki tablo dizini, yani anahtar, örneğin tamsayılar ( karma adresleri ), daha sonra verilere erişmek için kullanılır.

Bu şekilde hash, özel bir tablodaki konumunu belirlemek için bir anahtarın değerini kullanmayı içeren bir tekniktir.

Ancak yayılma fonksiyonu birçok benzersiz anahtar değerler aynı konum değerini verir i hash tablosunda. İki veya daha fazla anahtarın aynı dizini (karma adresi) aldığı duruma denir. çarpışma (çarpışma). Bu nedenle, karma şeması şunları içermelidir çakışma çözme algoritması , eylemlerin sırasını tanımlama, eğer pozisyon i=h(anahtar) zaten farklı bir anahtara sahip bir giriş tarafından işgal edilmiş.

Kullanılan karma işlevinde farklılık gösteren birçok karma şema vardır. h(anahtar) ve çatışma çözme algoritmaları.

Bir karma işlevi belirtmek için en yaygın yöntem şudur: bölme yöntemi.

İlk veriler şunlardır: - bazı tamsayı anahtarı anahtar ve masa boyutu m. Bu işlevin sonucu, bu anahtarı tablonun boyutuna bölmenin geri kalanıdır. Böyle bir işlevin C/C++ programlama dilindeki genel biçimi:

int h (int anahtar , int m ) {

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

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

Ele alınan örneklerde, hash fonksiyonu i=h(anahtar) yalnızca anahtarla girişin aranacağı (veya başlangıçta tabloya yerleştirileceği) konumu tanımlar anahtar. Ardından, bir tür karma şema (algoritma) kullanmanız gerekir.

Hashing şemaları

Çoğu problemde, iki veya daha fazla anahtar aynı şekilde özetlenir, ancak özet tablosunda aynı hücreyi işgal edemezler. İki tane olası seçenekler: ya yeni anahtar için farklı bir konum bulun ya da bu dizine eşlenen tüm anahtarların yerleştirildiği her karma tablo dizini için ayrı bir liste oluşturun.

Bu varyantlar iki klasik karma şemadır:

    lineer problama ile açık adresleme ile hashing - doğrusal incelemek, bulmak açık adresleme.

    zincir karma (listelerle) veya çok boyutlu karma olarak adlandırılan - zincirleme ile birlikte ayırmak listeler;

Doğrusal problama ile açık adresleme yöntemi . Başlangıçta, normal bir tek boyutlu dizi olan hash tablosunun tüm hücreleri boş olarak işaretlenir. Bu nedenle yeni bir anahtar eklenirken verilen hücrenin dolu olup olmadığı kontrol edilir. Hücre doluysa, algoritma boş bir alan olana kadar ("açık adres") bir daire içinde arar.

Şunlar. homojen anahtarlara sahip öğeler, elde edilen dizinin yanına yerleştirilir.

Gelecekte, bir arama yaparak, önce tuşun konumunu bulun i tabloda ve anahtar eşleşmezse, sonraki arama, konumdan başlayarak çakışma çözüm algoritmasına göre gerçekleştirilir. i. .

zincir yöntemi baskın stratejidir . Bu durumda i seçilen hash fonksiyonundan elde edilen h(anahtar)=i, bir karma liste tablosuna bir dizin olarak işlenir, yani. önce anahtar anahtar sonraki giriş konumla eşlenir i = h(anahtar) tablolar. Konum boşsa, anahtarlı eleman içine yerleştirilir. anahtar, eğer meşgulse, bu tür anahtarların bir listeye yerleştirilmesinin bir sonucu olarak bir çakışma çözme algoritması üzerinde çalışılır. i-karma tablosunun o hücresi. Örneğin

Sonuç olarak, bir dizi bağlantılı liste veya ağaçtan oluşan bir tablomuz var.

Bir karma tablosunu doldurma (okuma) işlemi basittir, ancak öğelere erişmek aşağıdaki işlemleri gerektirir:

Endeks Hesaplama i;

İlgili zincirde arama yapın.

Yeni bir eleman eklerken aramayı iyileştirmek için, ekleme algoritmasını listenin sonunda değil, sıralama ile, yani. eleman ekle Doğru yer.

Doğrusal problama ile doğrudan adresleme yönteminin uygulanmasına bir örnek . İlk veriler, beyan edilen yapısal tipte 7 kayıttır (basitlik için bilgi kısmı yalnızca tamsayı verilerinden oluşur):

intkey; // Anahtar

bilgi; // Bilgi

(59.1), (70.3), (96.5), (81.7), (13.8), (41.2), (79.9); karma tablo boyutu m = 10.

Özet fonksiyonu i=h(veri) =veri.anahtar%on; şunlar. 10 ile bölündükten sonra kalan - i.

İlk verilere dayanarak, hash tablosunu sırayla dolduruyoruz.

İlk beş anahtarın karma işlemi, farklı dizinler (karma adresleri) verir:

İlk çarpışma 81 ve 41 tuşları arasında meydana gelir - indeks 1'e sahip yer işgal edilir. Bu nedenle, en yakın boş alanı bulmak için hash tablosuna bakarız, bu durumda i = 2.

Bir sonraki anahtar 79 da bir çarpışmaya neden olur: 9. konum zaten dolu. Algoritmanın verimliliği keskin bir şekilde düşer, çünkü ücretsiz bir yer bulmak 6 deneme (karşılaştırma) aldı, indeks ücretsiz çıktı i= 4.

Bu yöntemin toplam örnek sayısı, eleman başına 1 ila n-1 örnek arasındadır, burada n, karma tablosunun boyutudur.

Zincirleme yönteminin uygulanması önceki örnek için. Bir liste elemanı için yapısal bir tip tanımlıyoruz (tek yönlü):

intkey; // Anahtar

bilgi; // Bilgi

zap*Sonraki; // işaretçi sonraki eleman listede

İlk verilere dayanarak, hash tablosunu sırayla ekleyerek dolduruyoruz. yeni eleman yer zaten alınmışsa listenin sonuna.

İlk beş anahtarın birleştirilmesi, önceki durumda olduğu gibi, farklı dizinler (karma adresleri) verir: 9, 0, 6, 1 ve 3.

Bir çarpışma meydana geldiğinde, yeni eleman listenin sonuna eklenir. Bu nedenle, 41 numaralı eleman 81 numaralı elemandan sonra, 79 numaralı eleman ise 59 numaralı elemandan sonra yerleştirilir.

Bireysel görevler

1. İkili ağaçlar. Rastgele sayı üreteci programını kullanarak 1'den 99'a kadar 10 değer alın ve bir ikili ağaç oluşturun.

Bir dönüş yapın:

1.a Soldan sağa geçiş: Sol-Kök-Sağ: önce sol alt ağacı, sonra kökü ve son olarak sağ alt ağacı ziyaret edin.

(Ya da tam tersi, sağdan sola: Sağ-Kök-Sol)

1.b Yukarıdan aşağıya geçiş: Kök-Sol-Sağ: alt ağaçların kökünü ziyaret edin.

1. Aşağıdan yukarıya Geçişte: Sol-Sağ-Kök: alt ağaçlardan sonra kökü ziyaret edin

Çok çeşitli endüstrilerde Bilişim Teknolojileri karma işlevlerinin kullanımlarını bulun. Bir yandan kullanıcılar arasındaki veri alışverişini ve belirli amaçlar için kullanılan dosyaların işlenmesini büyük ölçüde basitleştirmek, diğer yandan ilgili kaynaklara erişim kontrolünü sağlamak için algoritmaları optimize etmek için tasarlanmıştır. Hash işlevi bunlardan biridir. anahtar enstrümanlar verilerin şifreyle korunmasını sağlamanın yanı sıra EDS kullanılarak imzalanan belgelerin değişimini organize etmek. Dosyaların önbelleğe alınabileceği çok sayıda standart vardır. Birçoğu Rus uzmanlar tarafından geliştirilmiştir. Hash fonksiyonlarının türleri nelerdir? Pratik uygulamaları için ana mekanizmalar nelerdir?

Ne olduğunu?

İlk olarak, hash fonksiyonu kavramını inceleyelim. Bu terim genellikle, belirli bir miktardaki bilgiyi matematiksel yöntemler kullanarak daha kısa bir karakter dizisine dönüştürmek için bir algoritma olarak anlaşılır. Hash fonksiyonunun pratik önemi çeşitli alanlarda izlenebilir. Bu nedenle, dosya ve programları bütünlük açısından kontrol ederken kullanılabilirler. Ayrıca şifreleme algoritmalarında kriptografik hash fonksiyonları kullanılmaktadır.

özellikleri

Şimdi incelenen algoritmaların temel özelliklerini ele alalım. Bunların arasında:

  • orijinal uzunluktaki verileri daha kısa bir karakter dizisine dönüştürmek için dahili algoritmaların varlığı;
  • kriptografik doğrulama için açıklık;
  • orijinal verileri güvenli bir şekilde şifrelemenize izin veren algoritmaların varlığı;
  • küçük kullanarak şifre çözmeye uyarlanabilirlik işlem gücü.

Karma işlevinin diğer önemli özellikleri şunları içerir:

  • keyfi uzunluktaki ilk veri dizilerini işleme yeteneği;
  • sabit uzunlukta karma bloklar oluşturmak;
  • çıktıdaki fonksiyon değerlerini eşit olarak dağıtın.

Söz konusu algoritmalar ayrıca 1 bit düzeyindeki giriş verilerine duyarlılığı da varsayar. Yani, nispeten konuşursak, kaynak belgede en az 1 harf değişse bile, karma işlevi farklı görünecektir.

Karma işlevleri için gereksinimler

Belirli bir alanda pratik kullanıma yönelik hash işlevleri için bir takım gereksinimler vardır. İlk olarak, karşılık gelen algoritma, karma belgelerin iç yapısındaki değişikliklere duyarlı olmalıdır. Yani, hash fonksiyonu söz konusu olduğunda tanınmalıdır. Metin dosyası, paragraf permütasyonu, tireleme. Bir yandan belgenin içeriği değişmez, diğer yandan yapısı düzeltilir ve bu işlemin hashing sırasında tanınması gerekir. İkinci olarak, söz konusu algoritma, verileri ters işlem (hash'i orijinal belgeye çevirme) pratikte imkansız olacak şekilde dönüştürmelidir. Üçüncüsü, karma işlevi, aynı karakter dizisini bir karma biçiminde oluşturma olasılığını, başka bir deyişle, sözde çarpışmaların görünümünü pratik olarak dışlayan bu tür algoritmaların kullanımını içermelidir. Özlerini biraz sonra ele alacağız.

Karma fonksiyon algoritmasının karşılaması gereken belirtilen gereksinimler, esas olarak karmaşık matematiksel yaklaşımların kullanılmasıyla elde edilebilir.

Yapı

Düşünülen fonksiyonların yapısının ne olabileceğini inceleyelim. Yukarıda belirttiğimiz gibi, ele alınan algoritmalar için temel gereksinimler arasında tek yönlü şifrelemenin sağlanması yer almaktadır. Elinde sadece bir hash olan bir kişi, pratik olarak orijinal belgeyi buna dayalı olarak alamamalıdır.

Bu tür amaçlar için kullanılan bir karma işlevi hangi yapıda temsil edilebilir? Derlenmesinin bir örneği aşağıdaki gibi olabilir: H (karma, yani karma) = f (T (metin), H1), burada H1, metin işleme algoritması T'dir. Bu işlev T'yi, H1 bilgisi olmadan tam teşekküllü bir dosya olarak açmak neredeyse imkansız olacak şekilde hash eder.

Hash Fonksiyonlarını Pratikte Kullanmak: Dosyaları İndirmek

Şimdi hash fonksiyonlarını pratikte kullanma seçeneklerini daha detaylı inceleyelim. İnternet sunucularından dosya indirmek için komut dosyaları yazarken uygun algoritmaların kullanımı kullanılabilir.

Çoğu durumda, her dosya için belirli bir sağlama toplamı belirlenir - bu karmadır. Sunucuda bulunan ve kullanıcının bilgisayarına indirilen bir nesne için aynı olmalıdır. Durum böyle değilse, dosya açılmayabilir veya yanlış başlatılabilir.

Hash fonksiyonu ve dijital imza

Karma işlevlerinin kullanımı, dijital imza içeren belgelerin değiş tokuşunun düzenlenmesinde yaygındır. Bu durumda, alıcının orijinal olduğunu doğrulayabilmesi için imzalanan dosyaya hashing uygulanır. Hash fonksiyonu yapıya resmi olarak dahil edilmemesine rağmen elektronik anahtar eToken gibi belgelerin imzalandığı donanımın flash belleğinde sabitlenebilir.

Elektronik imza, genel ve özel anahtarlar kullanılarak bir dosyanın şifrelenmesidir. Yani, kaynak dosyaya özel anahtarla şifrelenmiş bir mesaj eklenir ve dijital imza şu şekilde doğrulanır: Genel anahtar. Her iki belgenin karma işlevi eşleşirse, alıcının dosyasının gerçek olduğu ve gönderenin imzasının doğru olduğu kabul edilir.

Hashing, yukarıda belirttiğimiz gibi, doğrudan EDS'nin bir bileşeni değildir, ancak, algoritmaları kullanmak için çok etkili bir şekilde optimize etmenize olanak tanır. Elektronik İmza. Bu nedenle, belgenin kendisi değil, yalnızca karma şifrelenebilir. Sonuç olarak, dosya işleme hızı önemli ölçüde artar ve aynı zamanda daha etkili EDS koruma mekanizmaları sağlamak mümkün hale gelir, çünkü bu durumda bilgi işlem işlemlerinde vurgu ilk verilerin işlenmesine değil, sağlanmasına verilecektir. imzanın kriptografik gücü. Karma işlevi, yalnızca metin değil, çeşitli veri türlerini de imzalamayı mümkün kılar.

Şifre Denetleyicisi

Hashing için bir başka olası uygulama alanı, belirli dosya kaynaklarına erişimi ayırt etmek için oluşturulmuş parola doğrulama algoritmalarının organizasyonudur. Bu tür problemlerin çözümünde belirli türdeki hash fonksiyonları nasıl yer alabilir? Çok basit.

Gerçek şu ki, erişimi farklılaşmaya tabi olan çoğu sunucuda şifreler karma değerler şeklinde saklanır. Bu oldukça mantıklıdır - şifreler orijinal metin biçiminde sunulursa, bunlara erişim sağlayan bilgisayar korsanları gizli verileri kolayca okuyabilir. Buna karşılık, karmaya dayalı olarak şifreyi hesaplamak kolay değildir.

İncelenen algoritmalar kullanıldığında kullanıcı erişimi nasıl kontrol edilir? Kullanıcı tarafından girilen parola, sunucuda depolanan bir karma işlevinde sabitlenenlere karşı kontrol edilir. Metin bloklarının değerleri eşleşirse, kullanıcı kaynaklara gerekli erişimi alır.

En basit karma işlevi, bir parola kontrol aracı olarak kullanılabilir. Ancak uygulamada, BT uzmanları çoğunlukla karmaşık çok aşamalı kriptografik algoritmalar kullanır. Tipik olarak, güvenli kanal iletişim standartlarının kullanılmasıyla desteklenirler, böylece bilgisayar korsanları, karma metin bloklarına karşı doğrulanmadan önce kullanıcının bilgisayarından sunuculara iletilen parolayı algılayamaz veya çözemez.

Hash işlevi çarpışmaları

Hash fonksiyonları teorisinde, çarpışma gibi bir fenomen sağlanır. Özü nedir? Karma çakışması, iki farklı dosyanın aynı karma koduna sahip olduğu bir durumdur. Bu, hedef karakter dizisinin uzunluğu küçükse mümkündür. Bu durumda, bir karma eşleşme olasılığı daha yüksek olacaktır.

Çarpışmayı önlemek için özellikle "hash function hashing" adı verilen ikili bir algoritmanın kullanılması önerilir. Açık ve kapalı kod oluşumunu içerir. Birçok programcı, kritik problemleri çözerken, gerekli olmadığı durumlarda hash fonksiyonlarını kullanmamalarını ve belirli anahtarlarla en iyi uyumluluk için ilgili algoritmaları her zaman test etmelerini önerir.

Görünüm tarihi

Karma fonksiyonlar teorisinin kurucuları Carter, Wegman, Simonson, Bierbrouer araştırmacıları olarak kabul edilebilir. İlk versiyonlarda, karşılık gelen algoritmalar, daha sonra kimlik doğrulama ve özgünlük için doğrulama amacıyla, rastgele uzunluktaki karakter dizilerinin benzersiz görüntülerini oluşturmak için araçlar olarak kullanıldı. Buna karşılık, belirtilen kriterlere göre karma, 30-512 bit uzunluğa sahip olmalıdır. özel olarak faydalı özellik uygun işlevler, dosyaları hızlı bir şekilde aramak veya sıralamak için bir kaynak olarak kullanıma uygunluğu değerlendirildi.

Popüler karma standartları

Şimdi hangi popüler standartlarda karma fonksiyonların temsil edilebileceğini düşünelim. Bunlardan biri CRC'dir. Bu algoritma döngüsel kod, sağlama toplamı da denir. Bu standart, basitlik ve aynı zamanda çok yönlülük ile karakterize edilir - bu sayede en geniş veri yelpazesini elde edebilirsiniz. CRC, kriptografik olmayan en yaygın algoritmalardan biridir.

Buna karşılık, MD4 ve MD5 standartları şifrelemede yaygın olarak kullanılmaktadır. Bir başka popüler şifreleme algoritması SHA-1'dir. Özellikle, MD5'ten daha büyük olan 160 bitlik bir karma boyutu ile karakterize edilir - bu standart 128 biti destekler. Karma işlevlerinin kullanımını düzenleyen Rus standartları var - GOST R 34.11-94 ve yerini alan GOST R 34.11-2012. Rusya Federasyonu'nda benimsenen algoritmaların sağladığı hash değerinin 256 bit olduğu belirtilebilir.

Söz konusu standartlar çeşitli şekillerde sınıflandırılabilir. Örneğin, blok ve özel algoritmalar kullananlar var. İlk türün standartlarına dayanan hesaplamaların basitliğine genellikle düşük hızları eşlik eder. Bu nedenle, blok algoritmalarına alternatif olarak, daha az miktarda gerekli hesaplama işlemlerini içerenler kullanılabilir. Yüksek hız standartlarına, özellikle yukarıda belirtilen MD4, MD5 ve SHA'ya atıfta bulunmak gelenekseldir. SHA örneğinde özel karma algoritmaların özelliklerini daha ayrıntılı olarak ele alalım.

SHA algoritmasının özellikleri

SHA standardına dayalı hash fonksiyonlarının kullanımı çoğunlukla araç geliştirme alanında gerçekleştirilir. elektronik imza DSA belgeleri. Yukarıda belirttiğimiz gibi, SHA algoritması 160 bitlik bir hash'i destekler (bir karakter dizisinin sözde "özetini" sağlar). Başlangıçta, söz konusu standart, veri dizisini 512 bitlik bloklara böler. Gerekirse, son bloğun uzunluğu belirtilen rakama ulaşmazsa, dosya yapısı 1 ve gerekli sayıda sıfır ile doldurulur. Ayrıca ilgili bloğun sonuna mesajın uzunluğunu sabitleyen bir kod girilir. Söz konusu algoritma, 32 bitte temsil edilen 3 kelimenin işlendiği 80 mantıksal işlevi içerir. SHA standardı ayrıca 4 sabitin kullanımını sağlar.

Hash algoritmalarının karşılaştırılması

Yukarıda incelediğimiz Rus standardı GOST R 34.11-94 ve Amerikan SHA'nın özelliklerini karşılaştırma örneğini kullanarak, farklı standartlarla ilgili karma işlevlerin özelliklerinin nasıl ilişkili olduğunu inceleyelim. Her şeyden önce, Rusya Federasyonu'nda geliştirilen algoritmanın, 1 döngü başına 4 şifreleme işleminin uygulanmasını içerdiğine dikkat edilmelidir. Bu 128 tura karşılık gelir. Buna karşılık, 1 tur sırasında, SHA kullanırken, toplamda 80 tur varken, yaklaşık 20 komut hesaplaması beklenir.Bu nedenle, SHA kullanımı, 1 döngü içinde 512 bit başlangıç ​​verisinin işlenmesine izin verir. Rus standardı, 256 bitlik bir veri döngüsünde işlem yapma yeteneğine sahipken.

En son Rus algoritmasının özellikleri

Yukarıda, GOST R 34.11-94 standardının daha yeni bir standartla değiştirildiğini belirttik - GOST R 34.11-2012 Stribog. Özelliklerini daha ayrıntılı olarak inceleyelim.

Vasıtasıyla bu standart yukarıda tartışılan algoritmalarda olduğu gibi kriptografik özet fonksiyonları uygulanabilir. En son Rus standardının 512 bitlik bir giriş verisi bloğunu desteklediği belirtilebilir. GOST R 34.11-2012'nin başlıca avantajları:

  • çatlama şifrelerine karşı yüksek düzeyde koruma;
  • kanıtlanmış tasarımların kullanımıyla desteklenen güvenilirlik;
  • hash fonksiyonunun hızlı hesaplanması, algoritmada fonksiyonun oluşturulmasını zorlaştıran ve hesaplamayı yavaşlatan dönüşümlerin olmaması.

Yeni Rus standardının dikkat çeken avantajları kriptografik şifreleme düzenleyici mevzuat hükümlerinde öngörülen en katı kriterleri karşılayan iş akışının organizasyonunda kullanmanıza izin verir.

Kriptografik hash fonksiyonlarının özgüllüğü

Çalıştığımız algoritma türlerinin kriptografi alanında nasıl kullanılabileceğini daha ayrıntılı olarak ele alalım. Karşılık gelen işlevler için temel gereksinim, yukarıda bahsettiğimiz çarpışmalara karşı dirençtir. Yani, bu değerler komşu algoritmanın yapısında zaten mevcutsa, yinelenen karma değerler oluşturulmamalıdır. Yukarıda belirtilen diğer kriterler de kriptografik fonksiyonlar tarafından karşılanmalıdır. Her zaman bazı teorik iyileşme olasılıklarının olduğu açıktır. Kaynak dosyasıözellikle güçlü bir bilgi işlem aracı varsa, bir karmaya dayalıdır. Ancak, güçlü şifreleme algoritmaları sayesinde bu senaryonun en aza indirilmesi gerekiyor. Bu nedenle, eğer hesaplama gücü 2^(n/2) formülüne karşılık geliyorsa, bir hash fonksiyonunu hesaplamak çok zor olacaktır.

Bir kriptografik algoritma için bir diğer önemli kriter, ilk veri dizisinin düzeltilmesi durumunda karmadaki değişikliktir. Yukarıda şifreleme standartlarının 1 bit düzeyinde hassasiyete sahip olması gerektiğini belirtmiştik. Bu nedenle, bu özellik, dosyalara erişimin güvenilir parola korumasının sağlanmasında önemli bir faktördür.

yinelemeli şemalar

Şimdi kriptografik karma algoritmaların nasıl oluşturulabileceğini inceleyelim. Bu sorunu çözmek için en yaygın şemalar arasında, yinelemeli bir sıralı modelin kullanılması yer alır. Giriş bitlerinin sayısının çıkışta sabitlenenlerden önemli ölçüde daha büyük olduğu sözde daralma fonksiyonunun kullanımına dayanmaktadır.

Elbette sıkıştırma işlevi, gerekli kriptografik güç kriterlerini karşılamalıdır. Etkileşimli şemada, giriş veri akışını işlemek için ilk işlem, boyutu bit olarak hesaplanan bloklara bölünür. Karşılık gelen algoritma, belirli sayıda bitin geçici değişkenlerini de kullanır. İlk değer olarak iyi bilinen bir sayı kullanılır, sonraki veri blokları ise çıktıda söz konusu fonksiyonun değeri ile birleştirilir. Karma değeri, ilk değer de dahil olmak üzere tüm giriş akışını hesaba katan son yineleme için bit çıkışı olur. Karma işleminin sözde "çığ etkisi" sağlanır.

Yinelemeli bir şema olarak uygulanan karma işlemi karakterize eden ana zorluk, girdi akışı, ilk veri dizisinin bölündüğü bloğun boyutuyla aynı değilse, karma işlevlerinin oluşturulmasının bazen zor olmasıdır. Ancak bu durumda, orijinal akışın bir şekilde genişletilebileceği karma standardında algoritmalar yazılabilir.

Bazı durumlarda, çok geçişli algoritmalar, yinelemeli bir şema çerçevesinde veri işleme sürecine dahil olabilir. Daha da yoğun bir "çığ etkisi" oluşumunu öneriyorlar. Böyle bir senaryo, tekrarlanan veri dizilerinin oluşumunu içerir ve yalnızca ikinci sırada genişleme vardır.

Blok Algoritması

Sıkıştırma işlevi, şifrelemenin gerçekleştirildiği bir blok algoritmasına da dayalı olabilir. Bu nedenle, güvenlik seviyesini artırmak için, mevcut yinelemede karmaya tabi olan veri bloklarını anahtar olarak ve bundan önce sıkıştırma işlevinin yürütülmesi sırasında elde edilen işlemlerin sonucunu girdi olarak kullanabilirsiniz. . Sonuç olarak, son yineleme algoritmanın çıktısını sağlayacaktır. Karmanın güvenliği, ilgili algoritmanın sağlamlığı ile ilişkili olacaktır.

Ancak, yukarıda belirttiğimiz gibi, dikkate alındığında Farklı çeşit hash fonksiyonları, blok algoritmalarına genellikle büyük bilgi işlem gücü kullanma ihtiyacı eşlik eder. Eğer mevcut değillerse, dosya işleme hızı, hash fonksiyonlarının kullanımıyla ilgili pratik sorunları çözmek için yeterli olmayabilir. Aynı zamanda, gerekli şifreleme gücü, kaynak veri akışları ile az sayıda işlemle de gerçekleştirilebilir, özellikle dikkate aldığımız algoritmalar - MD5, SHA ve Rus kriptografik şifreleme standartları - bu tür sorunları çözmek için uyarlanmıştır.

hash nedir? Bir karma işlevi, bilginin belirli bir uzunlukta kısa bir diziye matematiksel olarak dönüştürülmesidir.

Bu neden gerekli? Hash fonksiyon analizi genellikle önemli dosyaların bütünlüğünü kontrol etmek için kullanılır. işletim sistemi, önemli programlar, önemli veriler. İzleme, hem ihtiyaç duyulduğunda hem de düzenli olarak gerçekleştirilebilir.

Nasıl yapılır?İlk olarak, izlenmesi gereken dosyaların bütünlüğünü belirleyin. Her dosya için hash değeri özel bir algoritmaya göre hesaplanır ve sonuç kaydedilir. Gerekli süre geçtikten sonra benzer bir hesaplama yapılır ve sonuçlar karşılaştırılır. Değerler farklı ise dosyada yer alan bilgiler değiştirilmiştir.

Bir karma işlevi hangi özelliklere sahip olmalıdır?

  • keyfi uzunluktaki verileri sabit bir veriye dönüştürebilmelidir;
  • kriptografik gücünün araştırılabilmesi için açık bir algoritmaya sahip olmalıdır;
  • tek taraflı olmalı, yani sonuçtan ilk verileri belirlemek için matematiksel bir olasılık olmamalıdır;
  • çarpışmalara “direnmeli”, yani farklı girdi verileri için aynı değerleri üretmemelidir;
  • büyük bilgi işlem kaynakları gerektirmemelidir;
  • giriş verilerindeki en ufak bir değişiklikle sonuç önemli ölçüde değişmelidir.

Popüler karma algoritmalar nelerdir? Aşağıdaki karma işlevleri şu anda kullanımda:

  • CRC, döngüsel artıklık kodu veya sağlama toplamı anlamına gelir. Algoritma çok basittir, gerekli çıktı uzunluğuna bağlı olarak çok sayıda varyasyona sahiptir. Kriptografik değil!
  • MD 5 çok popüler bir algoritmadır. Onun gibi önceki versiyon MD 4 bir kriptografik fonksiyondur. Hash boyutu 128 bittir.
  • SHA -1 ayrıca çok popüler bir şifreleme işlevidir. Hash boyutu 160 bittir.
  • GOST R 34.11-94, bir karma işlevi hesaplamak için bir Rus şifreleme standardıdır. Hash boyutu 256 bittir.

Bir sistem yöneticisi bu algoritmaları ne zaman kullanabilir? Genellikle üreticinin web sitesindeki programlar, müzikler, filmler veya diğer bilgiler gibi herhangi bir içeriği indirirken, belirli bir algoritma kullanılarak hesaplanan bir sağlama toplamı değeri vardır. Güvenlik nedeniyle, indirdikten sonra, hash işlevini bağımsız olarak hesaplamalı ve değeri sitede veya dosya ekinde belirtilenlerle karşılaştırmalısınız. daha önce bunu yaptın mı?

Karmayı hesaplamak için daha uygun olan nedir?Şimdi hem ücretli hem de kullanımı ücretsiz olan çok sayıda bu tür yardımcı program var. Şahsen HashTab'i beğendim. İlk olarak, kurulum sırasında yardımcı program dosya özelliklerine bir sekme olarak gömülür, ikincisi, çok sayıda karma algoritma seçmenize izin verir ve üçüncüsü, ticari olmayan özel kullanım için ücretsizdir.

Rusça nedir? Yukarıda belirtildiği gibi, Rusya'da, birçok bilgi güvenliği aracı üreticisi tarafından yaygın olarak kullanılan bir GOST R 34.11-94 karma standardı vardır. Bu araçlardan biri de sabitleme ve kontrol programıdır. başlangıç ​​hali yazılım paketi"DÜZELTMEK". Bu program, bilgi güvenliği olanaklarının kullanımının etkinliğini izlemenin bir yoludur.

Windows 9x/NT/2000/XP için FIX (sürüm 2.0.1)

  • Uygulanan 5 algoritmadan birini kullanarak verilen dosyaların sağlama toplamlarının hesaplanması.
  • Yazılım paketinin ilk durumunun sabitlenmesi ve ardından kontrolü.
  • Yazılım paketi sürümlerinin karşılaştırılması.
  • Dizinleri düzeltme ve kontrol etme.
  • Belirtilen dosyalardaki (dizinlerdeki) değişikliklerin kontrolü.
  • TXT, HTML, SV formatlarında raporların oluşturulması.
  • Ürün, 01 Haziran 2013 tarihine kadar NDV 3 No. 913'e göre FSTEC sertifikasına sahiptir.

Peki ya ECP? Karma işlevi hesaplamasının sonucu, kullanıcının gizli anahtarıyla birlikte, dijital imzanın hesaplandığı kriptografik algoritmanın girişine girer. Kesin konuşmak gerekirse, hash işlevi EDS algoritmasının bir parçası değildir, ancak bu genellikle bir genel anahtar saldırısını dışlamak için bilerek yapılır.

Günümüzde birçok e-ticaret uygulaması, gizli anahtar belirtecin özel alanındaki kullanıcı (ruToken , eToken ) olmadan teknik fizibilite oradan çıkartıyoruz. Simgenin kendisi, kilobayt olarak ölçülen çok sınırlı bir hafıza alanına sahiptir. Bir belgeyi imzalamak için belgeyi jetonun kendisine aktarmanın bir yolu yoktur, ancak belgenin karmasını jetona aktarmak ve çıktıda bir EDS almak çok kolaydır.

Hash tabloları

karma tablo(karıştırılmış tablo, hesaplanmış adresleri içeren tablo) dinamik küme destekleyici işlemler eleman ekleme, arama ve silme ve özel yöntemler kullanma adresleme.

Tablolar ve diğer dinamik kümeler arasındaki temel fark, eleman adresi hesaplama anahtar değerine göre.

Karma uygulama fikri, büyük bir diziyle çalışmanın birkaç küçük setle çalışmaya indirgenmesidir.

Örneğin, bir defter. Kitabın sayfaları harflerle işaretlenmiştir. Bir harfle işaretlenmiş bir sayfa, o harfle başlayan soyadlarını içerir. Büyük bir soyadı kümesi 28 alt kümeye ayrılmıştır. Arama yapılırken istenilen harf üzerinde hemen kitap açılır ve arama hızlandırılır.

Hash tablosunu programlamada- bu yapıçiftleri (anahtar veya dizin + değer) depolayan ve üç işlemin gerçekleştirildiği veriler: yeni bir çift ekleme, bir çifti anahtarla arama ve silme.

Hash tablolarında ara iki aşamada gerçekleştirilir:

ilk adım - dönüştüren bir karma işlevi hesaplama anahtar elektronik tabloda ara adres:

ikinci adım, bu tür anahtarların işlenmesindeki çakışmaları çözme sürecidir.

Eğer bir farklı değerler tablo anahtarları karma işlevi üretir aynısı adreslerden kaynaklandığı söyleniyor çarpışma(çatışma, çatışma).

Hash fonksiyonları

Karma işlevinin temel amacı, çeşitli anahtarlar Eğer mümkünse çeşitli olumsuz değil tüm sayılar.

Konular karma işlevi daha iyi, nasıl az birebir aynı değerler üretir.

Hash fonksiyonu, aşağıdaki özellikler sağlanacak şekilde seçilmelidir:

    hash fonksiyonu kümenin elemanları üzerinde tanımlanır ve tamsayı negatif olmayan değerler;

    Özet fonksiyonu hesaplanması kolay;

    karma işlevi alabilir çeşitli yaklaşık değerler eşit olasılıkla(çarpışma minimizasyonu);

    üzerinde akraba argüman değerleri karma işlevi alır mesafe birbirinden değerler.

İyi bir hash fonksiyonu oluşturmak için anahtarların dağılımını bilmeniz gerekir. Anahtar dağılımı biliniyorsa, ideal durumda anahtar yoğunluğu ve karma değer yoğunluğu dağılımı aynı olmalıdır.

İzin vermek p ( anahtar ) - anahtar isteklerin dağıtım yoğunluğu. Ardından, ideal durumda, tablo girdi isteklerinin dağıtım yoğunluğu şu şekildedir: g ( H ( anahtar )) öyle olsun ki, ortalama olarak, eleman sayısı, cat. ikiz zincirlerinden geçmek gerekiyordu, çok azdı.

Örnek.

bir set olsun anahtarlar

{0, 1, 4, 5, 6, 7, 8, 9, 15, 20, 30, 40}

ve tablonun izin vermesine izin ver 4 giriş.

Bir karma işlevi oluşturabilirsiniz:

h(anahtar) = anahtar % 4 .

Sonra aşağıdakileri alırsınız adresler girişler için

{0, 1, 2, 3} tablolar:

h(anahtar)

Giriş numarası

Maksimum zincir uzunluğu

% isabet

3 0,5+1,5 0,25+0,5 0,08+1 0,17 ≈ 2,1 liste öğesi.

Örnek farklı bir karma işleviyle.

h(anahtar)

Giriş numarası

% isabet

Ortalama olarak, alacak 4 1,5 0,25 = 1,5 liste öğesi.

Bu bir bilgi erişim sistemiyse, arama performansı yaklaşık %25 oranında artacaktır.

Karma işlevleri oluşturma yöntemleri

Modüler karma

Basit, verimli ve yaygın olarak kullanılan bir karma yöntemi.

Tablo boyutu olarak seçilir basit sayılar m ve hash fonksiyonu şu şekilde hesaplanır: bölümün geri kalanı:

h(anahtar) = anahtar % m

anahtar– anahtarın tamsayı sayısal değeri,

m- karma değerlerinin sayısı (karma tablosu girişleri).

Böyle bir fonksiyon denir modüler ve değişiklikler 0 önceki ( m - 1 ).

C++'da modüler karma işlevi:

typedefintHashIndexType;

HashIndexTypeDoğramak(intanahtar)

{ dönüşanahtar % m; }

Örnek

anahtar = {1, 3, 56, 4, 32, 40, 23, 7, 41,13, 6,7}

İzin vermek m = 5

h(anahtar) = {1, 3, 1, 4, 2, 0, 3, 2, 1, 3, 1, 2}

Seçim önemlidir m.Rastgele bir anahtar dağılımı elde etmek için, basit sayı.

çarpma yöntemi

Özet fonksiyonu:

h(anahtar) =

0 < A < 1 bir sabittir.

12 mod5 = 2 (12'yi 5'e böldükten sonra kalan kısım).

5,04 mod1= 0,04 (öne çıkıyor kesirli kısım)

Örnek

anahtar = 123456

m = 10000

A = 0,6180339887499 = 0,618…

h(anahtar) = =

katkı yöntemi

İçin kullanılır çizgiler değişken uzunluk (tablo boyutu m 256'ya eşittir).

{ HashIndexType h = 0;

süre (*str)

h += (*str)++;

dönüşh;

Toplama yönteminin dezavantajı, benzer kelimelerin ve anagramların ayırt edilmemesidir, yani. h(XY ) = h(YX )

katkı yöntemi, burada anahtar bir karakter dizisidir. Bir karma işlevinde, bir dize, tüm karakterleri toplayarak ve bölündükten sonra kalanı döndürerek bir tam sayıya dönüştürülür. m (genellikle masa boyutu m = 256).int h(char *anahtar, int m) (int s = 0;while(*key)s += *anahtar++;dönüş s % m;) ABC ve taksi.Bu yöntem biraz değiştirilebilir, anahtar dizginin yalnızca ilk ve son karakterlerini toplayarak sonucu alır. int h(char *key, int m) (int len ​​​​= strlen(key), s = 0;if (len< 2) // Если длина ключа равна 0 или 1,s = key; // возвратить keyelse s = key + key;return s % m;}В этом случае коллизии будут возникать только в строках, например, ABC ve amc.

hash işlevi bir anahtar alır ve onu kullanarak tablodaki adresi hesaplar (adres, zincirlerin eklendiği dizide bir dizin olabilir), yani örneğin "abcd dizesinden 3 sayısını alabilir" " ve "efgh" dizisinden 7 sayısını alabilir ve daha sonra zincirin ilk yapısı hash yoluyla alınır veya hash yoluyla arama, karmadan yapılar zincirinde "abcd" bulunana kadar zincir boyunca devam eder. veya "efgh", "abcd" içeren yapı bulunduğunda, verilerinin geri kalanı alınıp döndürüldüğünde veya genel olarak tümü (adresi) döndürüldüğünde, karmadan gelen yapılar zincirinde bulunur. verinin geri kalanını ondan alabilir ve yapı zinciri oluşturulur çünkü birçok farklı tuşlar, tabloda aynı adrese sahip olun, yani örneğin, "abcd" için karma işlevi 3 döndürebilir ve "zxf9" için de 3 döndürebilir, bu nedenle üçüncü dizininde asılı bir zincire bağlanırlar. dizi .... ....

H dizisi, anahtar/değer çiftlerini kendileri depolar. Öğe yerleştirme algoritması, yeni öğenin yazılacağı ilk boş hücre bulunana kadar H dizisinin hücrelerini bir sırayla kontrol eder.

Arama algoritması, istenen anahtara sahip bir öğe veya boş bir hücre bulunana kadar (yani, karma tablosunda hiçbir öğe olmadığı anlamına gelir) ekleme sırasındaki sırayla, karma tablosunun hücrelerini arar.

XOR

Değişken uzunluktaki diziler için kullanılır. Yöntem, toplama yöntemine benzer, ancak benzer kelimeleri ayırt eder. "Özel VEYA" işleminin dize öğelerine sırayla uygulanması gerçeğinden oluşur.

typedef imzasız karakter HashIndexType;

imzasız karakter Rand8;

HashIndexType Hash(char *str)

( işaretsiz karakter h = 0;

while (*str) h = Rand8;

dönüşh; }

Burada Rand8 – 256 sekiz bitlik rasgele sayıdan oluşan bir tablo.

masa boyutu<= 65536

typedef unsigned kısa int HashIndexType;

imzasız karakter Rand8;

HashIndexType Hash(char *str)

( HashIndexType h; unsigned char h1, h2;

if (*str == 0) 0 döndürür;

h1 = *str; h2 = *str + 1; str++;

süre (*str)

( h1 = Rand8; h2 = Rand8;

str++; )

h = ((HashIndexType)h1<< 8) | (HashIndexType)h2;

dönüş h % HashTableSize )

Evrensel karma

ima rastgele sırasında bazı kümelerden bir karma işlevi seçimi yerine getirme programlar.

olarak kullanmak için çarpma yönteminde ise ANCAK sıra rastgele sabit bir sayı yerine değerler, evrensel bir karma işlevi elde edersiniz.

Ancak, rasgele sayılar üretme zamanı çok uzun olacaktır. büyük.

Kullanılabilir sözde rastgele sayılar.

// sözde rastgele sayı üreteci

typedefintHashIndexType;

HashIndexTypeHash(char*v, int m)

( int h, a = 31415, b = 27183;

for(h = 0;*v != 0; v++, a = a*b % (m - l))

h = (a*h + *v) %m;

dönüş(h< 0) ? (h + m) : h;