SHA-1 VE SHA-2’NİN TANITIMI, ANALİZLERİ VE GÜVENLİK DURUMU

(KAYNAK GÖSTERİLEREK ALINTI YAPILABİLİR)

SHA-1 VE SHA-2’NİN TANITIMI, ANALİZLERİ VE GÜVENLİK DURUMU

Özet fonksiyonları, bir mesajın uzunluğu ne olursa olsun benzersiz sabit bir uzunluğa indirgeyen algoritmalardır. Özetler bilgi ve mesaj bütünlüğünü sağlamak için ve veri yerine imzalanacak değerleri oluşturmak için kullanılır, ayrıca özet fonksiyonları diğer şifreleme algoritmalarında da kullanılır. Bir verinin özeti her özet alma işleminde aynı çıkar ve çıkan özet değeri başka verilerden elde edilemez.

Büyük miktardaki verilerin imzalanması çok uzun süreceği için verilerin imzalanması yerine belirli algoritmalarla oluşturulmuş özet değerlerinin imzalanması tercih edilmiştir. İmzalanmış verinin doğrulanması esnasında doğrulanacak verinin özeti alınarak imzalanmış özet değer ile karşılaştırılır. Ayrıca özet değer, parolaların korunmasında da önemli rol oynar. Parolalar açık metin ya da şifreli metin olarak saklamak yerine özet değer olarak saklanır. Bu sayede saldırgan parolaların özetlerini ele geçirse bile kullanamaz. Parolaların saklanmasında; parolaların özet değerini almanın yanında tuzlama yapılarak güvenliğin arttırıldığını da unutmamak gerekir. Bilgisayar şifrelerinin hemen hemen hepsi bu yöntemle saklanmaktadır. Kullanıcının oluşturduğu parolanın özeti alınarak veritabanında saklanır, kullanıcı giriş yapacağı zaman girilen parolanın özeti alınarak veritabanındaki değer ile karşılaştırılarak doğru olup olmadığı kontrol edilir. Parolaların bu yöntemle saklanmasından dolayı unutulan parolaları kullanıcıya geri vermek yerine parola sıfırlama işlemi yapılır.

1993 yılında National Security Agency (NSA), MD5 benzeri Secure Hash Algorithm (SHA) diye adlandırılan bir hash fonksiyonu yayımladı. Daha sonra 1995 yılında, SHA fonksiyonundaki bir zayıflıktan dolayı güncelleme yapıldı ve güncellenen SHA fonksiyonu SHA1 ismini aldı. 1993 yılında ilk geliştirilen SHA fonksiyonu ise SHA0 adıyla anılmaya başlandı.

Günümüzde en yaygın kullanılan özet fonksiyonu bu SHA1 fonksiyonudur. SHA1 algoritması TLS, SSL, PGP, SSH gibi en yaygın uygulama ve protokollerde yer almaktadır. SHA2 algoritması da yaygınlaşarak ileride SHA1’in yerini alacağı düşünülüyor. SHA ailesinde SHA0, SHA1, SHA2, SHA3 olarak adlandırılan dört adet şifreleme algoritması vardır.

Özet fonksiyonlarının iki özelliği sağlaması beklenir. Birincisi tek yönlü olma özelliğidir. Yani alınan bir mesajdan özet oluşturulması kolay bir şekilde gerçekleştirilmeli ancak özetten mesaj oluşturmak imkânsız olmalıdır. Diğer özellik ise çakışmaya izin vermemesidir. Aynı özet değerini veren iki mesaj bulmak imkânsız olmalıdır. Özet fonksiyonlarının kırılması demek, bu iki özellikten birisinin ya da her ikisinin birden gerçekleşmediği durumdur.

SHA1 Özeti nasıl alınır:

mavi” kelimesinin SHA1 özetini alalım:

  • Karakterler ASCII formatına çevrilir:

m=109            a=97                v=118             i=105

  • Binary formatına çevrilir:

m=109 = 01101101                a=97= 01100001

v=118= 01110110                  i=105= 01101001

  • Binary’ye çevrilen karakterler birleştirilir:

0­1­1­0­1­1­0­1­0­1­1­0­0­0­0­1­0­1­1­1­0­1­1­0­0­1­1­0­1­0­0­1­

  • Birleştirilen karakterlerin sonuna 1 eklenir:

0­1­1­0­1­1­0­1­0­1­1­0­0­0­0­1­0­1­1­1­0­1­1­0­0­1­1­0­1­0­0­1­1­

  • Mod 512’de 448 karakter uzunluğunda olacak şekilde yukardaki değerin sonuna 415 adet 0 eklenir:

0­1­1­0­1­1­0­1­0­1­1­0­0­0­0­1­0­1­1­1­0­1­1­0­0­1­1­0­1­0­0­1­1­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­1­0­0­0­0­0

  • Mesajın sonuna orijinal mesajın uzunluk bilgisi 64 bit olacak şekilde eklenir: (orijinal mesajımızın uzunluğu 32 bit)

0­1­1­0­1­1­0­1­0­1­1­0­0­0­0­1­0­1­1­1­0­1­1­0­0­1­1­0­1­0­0­1­1­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­1­0­0­0­0­0­

  • Mesajın uzunluğu 512 bitten uzun olsaydı 512 bit’lik parçalara bölünmesi gerekiyordu. 512 bitlik mesaj 32 bit’lik 16 parçaya bölünür:

0: 01101101011000010111011001101001

1: 10000000000000000000000000000000

2: 00000000000000000000000000000000

3: 00000000000000000000000000000000

4: 00000000000000000000000000000000

5: 00000000000000000000000000000000

6: 00000000000000000000000000000000

7: 00000000000000000000000000000000

8: 00000000000000000000000000000000

9: 00000000000000000000000000000000

10: 00000000000000000000000000000000

11: 00000000000000000000000000000000

12: 00000000000000000000000000000000

13: 00000000000000000000000000000000

14: 00000000000000000000000000000000

15: 00000000000000000000000000100000

  • Bu adımdan sonra 16 parçalı mesaj 80 parça oluncaya kadar bir döngü ile çoğaltılır.

Psödokod: for i from 16 to 79        w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) leftrotate 1

 

  • Başlangıçta 4 parça seçilir:13, 8, 2 ve 0 numaralı parçalar. Yapılacak olan döngü parçaların birbirleriyle XOR işlemine girmesiyle bulunur: 13 ve 8. Parçalar XOR’lanır, çıkan sonuç 2 ile XOR’lanır, burdan çıkan sonuç da 0 ile XOR’lanır. Sonuçta çıkan mesaj 1 bit sola ötelenerek yeni bir mesaj oluşturulmuş olur:

Bu şekilde 16 adet mesajdan yeni mesajlar oluşturulur, sonuçta 80 mesaj elde edilir.

  1. parça: 00000000000000000000000000000000
  2. parça: 00000000000000000000000000000000
  3. parça XOR 8. Parça: 00000000000000000000000000000000

 

  1. parça XOR 8. Parça: 00000000000000000000000000000000
  2. parça: 00000000000000000000000000000000
  3. parça XOR 8. Parça XOR 2. Parça: 00000000000000000000000000000000

 

  1. parça XOR 8. Parça XOR 2. Parça: 00000000000000000000000000000000
  2. parça: 01101101011000010111011001101001
  3. parça XOR 8. Parça XOR 2. Parça XOR 0. Parça: 01101101011000010111011001101001

 

1 bit sola öteleme: 11011010110000101110110011010010

  1. mesaj: 11011010110000101110110011010010
  2. mesaj: ….

…………….

  • SHA1 algoritmasında 5 adet başlangıç değişkeni kullanılır:

h0=      01100111010001010010001100000001

h1=      11101111110011011010101110001001

h2=      10011000101110101101110011111110

h3=      00010000001100100101010001110110

h4=      11000011110100101110000111110000

 

  • 5 adet başlangıç değişkeninden, elde edilen 80 mesajın çeşitli işlemlerden geçirilmesiyle yeni değerler elde edilir. Bulunan bu yeni değerler birleştirildiğinde özet değeri bulunmuş olur.

Başlangıç değişkenleri h0=A, h1=B, h2=C, h3=D, h4=D olacak şekilde harfle ifadelendirilir.

İlk 20 mesaj için fonksiyon 1, ikinci 20 için fonksiyon 2, üçüncü 20 için fonksiyon 3, dördüncü 20 için fonksiyon 4 kullanılır. Her fonksiyonda farklı işlemler yapılır.

Örnek olarak ilk fonksiyon için işlemleri yapalım:

Birinci fonksiyonda f = (B and C) or ((not B) and D) işlemi yapılır.

!B:               0010000001100100101010001110110

D:                00010000001100100101010001110110

B AND D:      00010000001100100101010001110110

 

B:                11101111110011011010101110001001

C:                10011000101110101101110011111110

B AND C:      10001000100010001000100010001000

 

!B AND D:                                 00010000001100100101010001110110

B AND C:                                  10001000100010001000100010001000

F: (!B AND D) OR (B AND C):      10011000101110101101110011111110

 

Her fonksiyonda bir de k değeri kullanılır. 1. Fonksiyondaki K değeri:  01011010100000100111100110011001’dir.

 

  • F değeri bulunduktan sonra şu işlem yapılır: A değeri 5 bit sola ötelenir, F, E, K ve ilk mesajla toplanır: (A lrot 5) + F + E + K + Word 0

K:                         1011010100000100111100110011001

A lrot 5:                11101000101001000110000000101100

F:                         10011000101110101101110011111110

(A lrot 5) + F:        110000001010111110011110100101010

 

:(A lrot 5) + F:       110000001010111110011110100101010

E:                         11000011110100101110000111110000

(A lrot 5) + F + E:   1001000101001100100001111100011010
(A lrot 5) + F + E:           1001000101001100100001111100011010

K:                                   01011010100000100111100110011001

(A lrot 5) + F + E + K:       11010011111101101001001100010110011

 

(A lrot 5) + F + E + K:                 11010011111101101001001100010110011

Word 0:                                   01101101011000010111011001101001

(A lrot 5) + F + E + K + Word 0:   111100001101000101100000111100011100

Bulunan değere temp adı verilmektedir:

Temp: 111100001101000101100000111100011100

Yukarıdaki işlemlerin kod şeklinde gösterimi:

for i from 0 to 79        if 0 ≤ i ≤ 19 then            f = (b and c) or ((not b) and d)            k = 0x5A827999        else if 20 ≤ i ≤ 39            f = b xor c xor d            k = 0x6ED9EBA1        else if 40 ≤ i ≤ 59            f = (b and c) or (b and d) or (c and d)             k = 0x8F1BBCDC        else if 60 ≤ i ≤ 79            f = b xor c xor d            k = 0xCA62C1D6         temp = (a leftrotate 5) + f + e + k + w[i]        e = d        d = c        c = b leftrotate 30        b = a        a = temp

  • Toplama işleminde 32 bitlik değerler toplandığında uzama olursa 32 bit kalacak şekilde soldaki fazla bitler atılır. Ardından değişkenler şu şekilde yeniden belirlenir:

E = D

D = C

C = B Left Rotate 30

B = A

A = temp

 

Kısaltılmış temp:             0001101000101100000111100011100

E = D                              00010000001100100101010001110110

D = C                              10011000101110101101110011111110

C = B Left Rotate 30         01111011111100110110101011100010

B = A                              01100111010001010010001100000001

A = Temp                        00001101000101100000111100011100

 

  • Her mesaj döngüye girince ilgili fonksiyon çalıştırılır, fonksiyondaki işlemler ve yukardaki işlemler yapılır, daha sonra bir sonraki mesaja geçilir. 80 mesaj da döngüye girip çıktıktan sonra A, B, C, D, E değerleri her döngüde değişerek 80. Mesajda son halini alır. Son işlem olarak yukarıda bulunan değerler baştaki değerlerle toplanır ve 32 bit olacak şekilde kısaltılır:

h0 = h0 + A

h1 = h1 + B

h2 = h2 + C

h3 = h3 + D

h4 = h4 + E

Kısaltılmış değerler:

H0: 11110000101000000000011110011100

H1: 10010111010001110011010100011000

H2: 10111110101110001111001000000001

H3: 00101000110101110001000010100100

H4: 01001001100101110000110100011001

 

Mavi kelimesinin SHA1 özet değeri:

1111000010100000000001111001110010010111010001110011010100011000101111101011100011110010000000010010100011010111000100001010010001001001100101110000110100011001

Ya da:

f0a0079c97473518beb8f20128d710a449970d19

SHA1 Özet Fonksiyon Güvenliği

SHA1 algoritması 160bit özetler oluşturur, mesajın uzunluğu ne olursa olsun sonuçta çıkan değer 160 bit olur. Kaba kuvvet saldırısında, 160bit’lik bir özet değeri için birbirinin aynı özet değerini veren iki mesajı bulmak için 280 tane mesajın özeti alınması gerekebilir. Yani 280 mesajın özeti birbirleriyle karşılaştırılırsa içlerinden iki tanesi aynı olabilir. Özet algoritmasının kırılması demek kaba kuvvet saldırısından daha kolay bir şekilde çakışma bulunması demektir.

SHA algoritmaları blok ve algoritmaların yapısından dolayı mesaj uzunluğu artırma (length-extension) ve parçalı mesaj çakışma ataklarıyla (partial-message collision attacks) karşı karşıya kalmaktadır. Özetin iki kere alınmasıyla bu ataklara karşı önlem alınabilir.

2005 yılında SHA1 algoritmasının kaba kuvvet saldırısından 2000 kez daha kolay kırılabildiği kanıtlandı; 269 işlemde bulunan çakışma daha sonra geliştirilerek 263 işlemde bulunabildi. Bu ataklar zor ve çok pahalı olmasına rağmen, atakların giderek hızlandığı ve ucuzlaştığı düşünüldüğünde SHA1 algoritmasını kullanmanın güvenli sayılmayacağı zamanın geleceği ve yeni algoritmaların geliştirilmesi gerektiği görülmektedir. 2012 yılında Moore yasasına dayanarak tahmin yürüten Jesse Walker, SHA1 çakışma atağı maliyetinin 2012 yılında $2M olduğu, 2015 yılında $700K olacağını 2018 yılında $173K ve 20123 yılında $43K olacağını öngörmüştür. Bu gibi varsayımlara ve yapılan ataklara dayaranarak Sertifika Otoriteleri 2018 yılında SHA1 algoritmasına pratik atak yapılabileceğini öngörmektedirler.

2015 Kasım ayında Marc Stevens, Pierre Karpman ve Thomas Peyrin SHA1’in sıkıştırma fonksiyonuna 257 değerlendirme gerektiren çakışma atağı yayınladılar. Bu atak tam SHA1 özet fonksiyonuna direk etki etmese de güvenlik iddialarını zayıflatmıştır. Tam SHA1 fonksiyonuna yapılan ilk atak olma özelliğini gösteren bu atak SHAppening olarak adlandırılmıştır. Atağı yayınlayanlar bu atağın maliyetinin 75-120bin dolar civarında gerçekleştirilebileceğini tahmin etmektedirler. Daha önce maliyetten dolayı gerçekleştirilmesi imkansız olan ataklara oranla bu rakamlar çok daha düşük olduğu görülmektedir.

SHA-2 Algoritması

SHA2 algoritması 2001 yılında NIST tarafından ulusal standart olarak yayımlanmıştır. SHA1 160 bitlik özetler oluşturmasına rağmen SHA2 algoritması çeşitli boyutlarda özetler oluşturulmasına izin vermektedir. 6 adet SHA2 algoritması vardır:  SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256. En çok kullanılan SHA2 özet fonksiyonları SHA-256 ve SHA-512’dir. Diğer SHA2 algoritmaları aynı fonksiyonları kullanır ancak başlangıç değerleri ve çıkış değerleri farklılık gösterir. SHA256 ve SHA512 farklı sabitler kullanır ve bitlerin öteleme sayısı farklıdır, aynı yapıları kullanmalarına rağmen çevrim sayılarında farklılık vardır. SHA224 ve SHA386 bunların kısaltılmış versiyonlarıdır. SHA-512/224 ve SHA-512/256, SHA512’nin kısaltılmış ve başlangıç değerlerinin farklı şekilde seçilmiş versiyonlarıdır.

SHA-256 Özeti nasıl alınır:

SHA256 algoritması ile “mavi” kelimesinin özetini alalım:

SHA256 algoritması 512 bit mesaj blok uzunluğunu kullanır ve 256 bit özet değeri oluşturur. Başlangıç değeri olarak aşağıda hex değerleri verilmiş 8 adet mesaj kullanılır.

h0 := 0x6a09e667

h1 := 0xbb67ae85

h2 := 0x3c6ef372

h3 := 0xa54ff53a

h4 := 0x510e527f

h5 := 0x9b05688c

h6 := 0x1f83d9ab

h7 := 0x5be0cd19

SHA1’deki gibi mesajın uzunluğu padding yöntemiyle 512 bite tamamlanır:

  • Karakterler ASCII formatına çevrilir:

m=109            a=97                v=118             i=105

  • Binary formatına çevrilir:

m=109 = 01101101                a=97= 01100001

v=118= 01110110                  i=105= 01101001

  • Binary’ye çevrilen karakterler birleştirilir:

0­1­1­0­1­1­0­1­0­1­1­0­0­0­0­1­0­1­1­1­0­1­1­0­0­1­1­0­1­0­0­1­

  • Birleştirilen karakterlerin sonuna 1 eklenir:

0­1­1­0­1­1­0­1­0­1­1­0­0­0­0­1­0­1­1­1­0­1­1­0­0­1­1­0­1­0­0­1­1­

  • Mod 512’de 448 karakter uzunluğunda olacak şekilde yukardaki değerin sonuna 415 adet 0 eklenir:

0­1­1­0­1­1­0­1­0­1­1­0­0­0­0­1­0­1­1­1­0­1­1­0­0­1­1­0­1­0­0­1­1­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­1­0­0­0­0­0

  • Mesajın sonuna orijinal mesajın uzunluk bilgisi 64 bit olacak şekilde eklenir: (orijinal mesajımızın uzunluğu 32 bit)

0­1­1­0­1­1­0­1­0­1­1­0­0­0­0­1­0­1­1­1­0­1­1­0­0­1­1­0­1­0­0­1­1­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­0­1­0­0­0­0­0­

  • Mesajın uzunluğu 512 bitten uzun olsaydı 512 bit’lik parçalara bölünmesi gerekiyordu. 512 bitlik mesaj 32 bit’lik 16 parçaya bölünür:

0: 01101101011000010111011001101001

1: 10000000000000000000000000000000

2: 00000000000000000000000000000000

3: 00000000000000000000000000000000

4: 00000000000000000000000000000000

5: 00000000000000000000000000000000

6: 00000000000000000000000000000000

7: 00000000000000000000000000000000

8: 00000000000000000000000000000000

9: 00000000000000000000000000000000

10: 00000000000000000000000000000000

11: 00000000000000000000000000000000

12: 00000000000000000000000000000000

13: 00000000000000000000000000000000

14: 00000000000000000000000000000000

15: 00000000000000000000000000100000

 

  • Bu adımdan sonra 16 parçalı mesaj 64 parça oluncaya kadar bir döngü ile çoğaltılır:

Bu döngüdeki k değerleri de sabit değerlerdir, k0…….k63:

428a2f98 71374491 b5c0fbcf e9b5dba5 3956c25b 59f111f1 923f82a4 ab1c5ed5

d807aa98 12835b01 243185be 550c7dc3 72be5d74 80deb1fe 9bdc06a7 c19bf174

e49b69c1 efbe4786 0fc19dc6 240ca1cc 2de92c6f 4a7484aa 5cb0a9dc 76f988da

983e5152 a831c66d b00327c8 bf597fc7 c6e00bf3 d5a79147 06ca6351 14292967

27b70a85 2e1b2138 4d2c6dfc 53380d13 650a7354 766a0abb 81c2c92e 92722c85

a2bfe8a1 a81a664b c24b8b70 c76c51a3 d192e819 d6990624 f40e3585 106aa070

19a4c116 1e376c08 2748774c 34b0bcb5 391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3

748f82ee 78a5636f 84c87814 8cc70208 90befffa a4506ceb bef9a3f7 c67178f2

  • Döngüden çıkan her değer aşağıdaki şekilde atama yapılarak yeniden döngüye girer:

h := g

g := f

f := e

e := d + temp1

d := c

c := b

b := a

a := temp1 + temp2

 

  • mesaj da döngüden çıktıktan sonra elde edilen mesajlar aşağıdaki işlemden geçirildikten sonra özet değeri elde edilmiş olur.

h0 := h0 + a

h1 := h1 + b

h2 := h2 + c

h3 := h3 + d

h4 := h4 + e

h5 := h5 + f

h6 := h6 + g

h7 := h7 + h

Özet değeri: h0 append h1 append h2 append h3 append h4 append h5 append h6 append h7

“mavi” kelimesinin SHA256 özeti:

Hex: 5d5b15cbf8c0c4e86c05761fae20feaf40b30a396e5ae645166a9bef732b9efc

Binary: 0101110101011011000101011100101111111000110000001100010011101000011011000000010101110110000111111010111000100000111111101010111101000000101100110000101000111001011011100101101011100110010001010001011001101010100110111110111101110011001010111001111011111100

SHA256 algoritmasında kullanılan sıkıştırma fonksiyonu diyagramı şu şekildedir:

 

 

SHA512 algoritmasının SHA256’dan farkı özeti alınacak verinin 1024 bitlik bloklara bölünmesi ve 32 bit yerine 64 bit mesaj bloklarının kullanılmasıdır. SHA512’de de 8 adet başlangıç değeri vardır ancak bunlar 64 bit uzunluktadır ve özet algoritmasından çıkan 64 bitlik 8 değer 512 bitlik özet değerini oluşturur. Ayrıca SHA256’da 16 adet mesaj 64 adete çıkarılarak bu 64 mesaj döngüye sokulur, SHA512’de ise 80’e kadar çoğaltılan mesajlar döngüye girer.

“mavi” kelimesinin SHA512 özeti: 56395c08cf51757c7d8106ce6194fdfc45cddc21a8bec6e80a8d9b204e85174d06680773897532983c8d234d84d745b05e263411ee7be8ebf5b6cbb57d9bbfc5

SHA2 Özet Fonksiyon Güvenliği

SHA2 algoritmasına bilinen en iyi atak SHA256 için 52 çevrim, SHA512 için 57 çevrimdir. SHA256 için çakışma direnci ise 46 çevrimdir. SHA2 için henüz bilinen başarılı bir atak olmamıştır ancak yeni bir özet fonksiyonu için yarışma düzenlendiği SHA3 için çalışmaların başladığı bilinmektedir.

 

 

Referanslar:

  1. https://www.schneier.com/blog/archives/2005/02/cryptanalysis_o.html
  2. https://konklone.com/post/why-google-is-hurrying-the-web-to-kill-sha-1
  3. http://www.metamorphosite.com/one-way-hash-encryption-sha1-data-software
  4. https://en.wikipedia.org/wiki/SHA-1
  5. https://en.wikipedia.org/wiki/SHA-2
  6. http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
  7. http://www.iwar.org.uk/comsec/resources/cipher/sha256-384-512.pdf