MD en basit şekilde herhangi uzunluktaki bir veriyi işleyip sonuç olarak sabit uzunlukta bir veri elde eden işlev olarak tanımlanabilir. Matematiksel olarak tanımlayacak olursak:
M: değişken uzunlukta veri, h: sabit uzunlukta veri, H: işlev
h = H(M)
Sabit uzunkta çıktı elde etmenin yanında, MD işlevinin sağlaması gereken bazı özellikler vardır. Bu özellikler söyle sıralanabilir:
• M verildiği zaman, h’yı hesaplamak kolay olmalı
• h verildiği zaman M’yi hesaplamak çok zor olmalı (hatta imkansız olmalı). Bu yönüyle MD işlevi tek yönlü işlev (one-way function) olarak adlandırılır.
• M veridiğinde H(M) = H(M’) eşitliğini sağlayan M’ çok zor bulunmalı (hatta imkansız olmalı).
Nerelerde Kullanılabilir?
MD işlevinin taşıması gereken özelliklerinden bahsettikten sonra, nerelerde kullanılabilir sorusu daha kolay anlaşılabilir. MD, verilerin bütünlük denetimi yani verinin değişikliğe uğrayıp uğramadığının denetlenmesi için kullanılmaktadır şeklinde özetlenebilir.
Örneğin internete indirilmek üzere yerleştirdiğiniz bir dosyaya ek olarak bu dosyanın MD sonucunuda dağıtırsanız, bu dosyayı sizin sitenizden indiren kullanıcılar, kendi bilgisayalarında bu dosyanın MD’sini hesaplayıp sizin hesapladığınız MD değeri ile kontrol ederler ve böylece indirdikleri dosyanın değiştirilip değiştirilmediğini, yani güvenilir olup olmadığını anlayabilirler (Bu noktada sizin güvenlir olduğunuz farzedilmektedir).
İleti Özümleme Algoritmaları
Bugüne kadar MD işlevi için bir çok algoritma tasarlanmıştır, fakat bunlardan sadece bir kısmı yukarıda sıralanan özellikleri birarada barındırdığından genel kabul görmüşlerdir. Bu algoritmaların başta gelenleri md5 (message digest 5) ve sha’dır (secure hash algorithm).
MD5 (Message Digest 5)
MD5, Ron Rivest tarafıdan 1992 yılında tasarlanmış bir MD algoritmasıdır. Ron Rivest, yine kendi tasarladığı MD4 algoritmasındaki bir takım zayıflıkları gidermiş ve günümüzde sıkça kuallanılan MD5 algoritması ortaya çıkmıştır. MD5, sonsuz uzunlukta veriyi girdi olarak kabul edebilir ve sonuçta 128 bit uzunluğunda bir çıktı üretir. Kısaca algoritmanın nasıl işlediğine bakacak olursak:
• MD5, veriyi 512 bitlik bloklara ayırır ve her bir blok üzerinde aynı işlem uygulanır.
• Üzerinde işlem yapılacak verinin 512 bitin katları olması gerekmektedir, fakat gerçek verimiz bu özelliği sağlamayabilir. Bu sorunu çözmek için ekleme (padding) işlemi uygulanır (gerçek verimiz 512 in katı olsa dahi ekleme yapılır!).
Ekleme işleminde şu kural gözetilir: Verinin uzunluğu 512 bitin en yakın katından 64 eksik olacak şekilde, verinin sonuna bir adet 1 ve geri kalanlar için ise 0 eklenir. Bu 64 bitlik fark verinin uzunluğunu belirtmekte kullanılır.
Bir örnekle açıklayacak olursak; diyelim verimiz 300 bit uzunlukta olsun. Bunu 448 bite (512-64) tamamlamız gerekmektedir. Dolayısı ile 301. bit olarak 1 ve geri kalan 147 tane bit için ise 0 ataması yaparız. Elimizde şu anda 448 bit var. Gerçek verimizin uzunluğu 300 bit idi ve bunuda ikilik tabanda 64 bit ile ifade edip 448 bitlik verimize ekleriz. Böylece 512-bitlik yeni oluşturduğumuz veri üzerinde MD5 algoritmasını uygulayabiliriz.
• Ekleme işleminden sonra, MD5 veriyi işlemeye başlar.
MD5 Ana Döngüsü:
Döngünün başlangıcında 32 bitlik dört tane (A,B,C,D) değişken bulunur. Başlangıçta bunların değeri sabittir ve her 512 bitlik bloğu işleme soktukça bu değişkenlerin değerleri değişir ve en sondaki bloğuda işledikten sonra elde ettiğimiz A,B,C ve D değişkenlerinin değerlerini yanyana dizdiğimizde (A-B-C-D) 128 bitlik MD sonucumuzu elde etmiş oluruz.
Burada 4 adım (F-G-H-I) göze çarpmaktadır. Her adımın önceden tanımlı ve kendisine özgü birer işlevi bulunmaktadır ve bu işlevler her adımda 16 kez çağırılarak elde edilen sonuç bir sonraki adıma iletilir. Yani her bir 512 bitlik blok için MD5 algoritması 4 adım * 16 işlem = 64 adet işlem yapmaktadır. Bu kadar fazla adımın amacı simetrikliği engelleyip farklı girdiler için farklı sonuçlar üretebilme özelliğini sağlayabimektir. Aşağıda her adımda kullanılan işlevler gösterilmiştir.
Her adımda 16 kez FF işlevi hesaplanır:
from (j = 0 to 15)
FF (a, b, c, d, Mj, s, ti)
Burada:
i: adım numarası
FF (a, b, c, d, Mj, s, ti) => a = b + ((a + F(b, c, d) + Mj + ti) <<< s)
1. adım için F(X, Y, Z) = (X and Y) or ((not X) and Z)
2. adım için F(X, Y, Z) = (X and Z) or (Y and (not Z))
3. adım için F(X, Y, Z) = X xor Y xor Z
3. adım için F(X, Y, Z) = Y xor (X or (not Z))
SHA (Secure Hash Algorithm)
NİST (National Institute of Standards and Technology) ve NSA (National Security Agency) kuruluşlarının ortak çalışmaları sonucunda 1994 yılında Sayısal İmza Standardında (DSA-Digital Signature Standard) kullanılmak üzere tasarlanmış bir algoritmadır. MD5’le benzerlik göstermektedir. MD5 ile karşılaştıracak olursak;
MD5 - SHA Karşılaştırması
• MD5’in çıktısı 128 bit iken, SHA’nın çıktısı 160 bittir. Yani MD5’te 4 adet 32 bitlik değişken kullanılırken, SHA’da 5 adet 32 bitlik değişken kullanılır.
• Her ikiside 512 bitlik bloklar üzerinde işlem yaparlar.
• SHA’da ekleme (padding) işlemi, MD5’teki ile aynı şekilde yapılır.
• SHA’da da her 512 bitlik blok için 4 adımda işlemler yapılır, fakat bir farkla: MD5’de her adımda önceden tanımlı işlevlerin kullanımı 16 kez tekrarlanırken, bu sayı SHA’da 20 kezdir.
• SHA girdi olarak maksimum 264-1 uzunluğunda veriyi kabul eder. Bunu yanında MD5 için böyle bir kısıtlama yoktur.
• SHA ürettiği 160 bitlik sonuç ile brute-force (bütün olası sonuçların denenmesi ile gerçekleştirilir) ataklara karşı daha dayanıklıdır.
Diğerleri
MD5 ve SHA’nın yanında daha birçok MD algoritması tasarlanmıştır. Bunlardan bazıları MD2, MD4, Haval, Ripe-MD, Snefru, N-Hash’dır.
Uygulamalar
Çok çeşitli MD algoritmalarını gerçekleyen uygulamaları farklı platformlar için bulmak mümkündür.
Unix/Linux Uygulamaları
Unix/Linux platformlarında MD5 ve SHA algoritmaların gerçekleyen en bilindik uygulamalar sırasıyla md5sum ve sha1sum’dır. Uygulamaların çalıştırılmasına ilişkin örnekler:
~$ md5sum deneme
d39100ac38f7bde184d48d1ad0af0318 deneme
~$ sha1sum deneme
394916cffc20a1e087ede73a8b66ce1063ea4b9f deneme
~$
M: değişken uzunlukta veri, h: sabit uzunlukta veri, H: işlev
h = H(M)
Sabit uzunkta çıktı elde etmenin yanında, MD işlevinin sağlaması gereken bazı özellikler vardır. Bu özellikler söyle sıralanabilir:
• M verildiği zaman, h’yı hesaplamak kolay olmalı
• h verildiği zaman M’yi hesaplamak çok zor olmalı (hatta imkansız olmalı). Bu yönüyle MD işlevi tek yönlü işlev (one-way function) olarak adlandırılır.
• M veridiğinde H(M) = H(M’) eşitliğini sağlayan M’ çok zor bulunmalı (hatta imkansız olmalı).
Nerelerde Kullanılabilir?
MD işlevinin taşıması gereken özelliklerinden bahsettikten sonra, nerelerde kullanılabilir sorusu daha kolay anlaşılabilir. MD, verilerin bütünlük denetimi yani verinin değişikliğe uğrayıp uğramadığının denetlenmesi için kullanılmaktadır şeklinde özetlenebilir.
Örneğin internete indirilmek üzere yerleştirdiğiniz bir dosyaya ek olarak bu dosyanın MD sonucunuda dağıtırsanız, bu dosyayı sizin sitenizden indiren kullanıcılar, kendi bilgisayalarında bu dosyanın MD’sini hesaplayıp sizin hesapladığınız MD değeri ile kontrol ederler ve böylece indirdikleri dosyanın değiştirilip değiştirilmediğini, yani güvenilir olup olmadığını anlayabilirler (Bu noktada sizin güvenlir olduğunuz farzedilmektedir).
İleti Özümleme Algoritmaları
Bugüne kadar MD işlevi için bir çok algoritma tasarlanmıştır, fakat bunlardan sadece bir kısmı yukarıda sıralanan özellikleri birarada barındırdığından genel kabul görmüşlerdir. Bu algoritmaların başta gelenleri md5 (message digest 5) ve sha’dır (secure hash algorithm).
MD5 (Message Digest 5)
MD5, Ron Rivest tarafıdan 1992 yılında tasarlanmış bir MD algoritmasıdır. Ron Rivest, yine kendi tasarladığı MD4 algoritmasındaki bir takım zayıflıkları gidermiş ve günümüzde sıkça kuallanılan MD5 algoritması ortaya çıkmıştır. MD5, sonsuz uzunlukta veriyi girdi olarak kabul edebilir ve sonuçta 128 bit uzunluğunda bir çıktı üretir. Kısaca algoritmanın nasıl işlediğine bakacak olursak:
• MD5, veriyi 512 bitlik bloklara ayırır ve her bir blok üzerinde aynı işlem uygulanır.
• Üzerinde işlem yapılacak verinin 512 bitin katları olması gerekmektedir, fakat gerçek verimiz bu özelliği sağlamayabilir. Bu sorunu çözmek için ekleme (padding) işlemi uygulanır (gerçek verimiz 512 in katı olsa dahi ekleme yapılır!).
Ekleme işleminde şu kural gözetilir: Verinin uzunluğu 512 bitin en yakın katından 64 eksik olacak şekilde, verinin sonuna bir adet 1 ve geri kalanlar için ise 0 eklenir. Bu 64 bitlik fark verinin uzunluğunu belirtmekte kullanılır.
Bir örnekle açıklayacak olursak; diyelim verimiz 300 bit uzunlukta olsun. Bunu 448 bite (512-64) tamamlamız gerekmektedir. Dolayısı ile 301. bit olarak 1 ve geri kalan 147 tane bit için ise 0 ataması yaparız. Elimizde şu anda 448 bit var. Gerçek verimizin uzunluğu 300 bit idi ve bunuda ikilik tabanda 64 bit ile ifade edip 448 bitlik verimize ekleriz. Böylece 512-bitlik yeni oluşturduğumuz veri üzerinde MD5 algoritmasını uygulayabiliriz.
• Ekleme işleminden sonra, MD5 veriyi işlemeye başlar.
MD5 Ana Döngüsü:
Döngünün başlangıcında 32 bitlik dört tane (A,B,C,D) değişken bulunur. Başlangıçta bunların değeri sabittir ve her 512 bitlik bloğu işleme soktukça bu değişkenlerin değerleri değişir ve en sondaki bloğuda işledikten sonra elde ettiğimiz A,B,C ve D değişkenlerinin değerlerini yanyana dizdiğimizde (A-B-C-D) 128 bitlik MD sonucumuzu elde etmiş oluruz.
Burada 4 adım (F-G-H-I) göze çarpmaktadır. Her adımın önceden tanımlı ve kendisine özgü birer işlevi bulunmaktadır ve bu işlevler her adımda 16 kez çağırılarak elde edilen sonuç bir sonraki adıma iletilir. Yani her bir 512 bitlik blok için MD5 algoritması 4 adım * 16 işlem = 64 adet işlem yapmaktadır. Bu kadar fazla adımın amacı simetrikliği engelleyip farklı girdiler için farklı sonuçlar üretebilme özelliğini sağlayabimektir. Aşağıda her adımda kullanılan işlevler gösterilmiştir.
Her adımda 16 kez FF işlevi hesaplanır:
from (j = 0 to 15)
FF (a, b, c, d, Mj, s, ti)
Burada:
i: adım numarası
FF (a, b, c, d, Mj, s, ti) => a = b + ((a + F(b, c, d) + Mj + ti) <<< s)
1. adım için F(X, Y, Z) = (X and Y) or ((not X) and Z)
2. adım için F(X, Y, Z) = (X and Z) or (Y and (not Z))
3. adım için F(X, Y, Z) = X xor Y xor Z
3. adım için F(X, Y, Z) = Y xor (X or (not Z))
SHA (Secure Hash Algorithm)
NİST (National Institute of Standards and Technology) ve NSA (National Security Agency) kuruluşlarının ortak çalışmaları sonucunda 1994 yılında Sayısal İmza Standardında (DSA-Digital Signature Standard) kullanılmak üzere tasarlanmış bir algoritmadır. MD5’le benzerlik göstermektedir. MD5 ile karşılaştıracak olursak;
MD5 - SHA Karşılaştırması
• MD5’in çıktısı 128 bit iken, SHA’nın çıktısı 160 bittir. Yani MD5’te 4 adet 32 bitlik değişken kullanılırken, SHA’da 5 adet 32 bitlik değişken kullanılır.
• Her ikiside 512 bitlik bloklar üzerinde işlem yaparlar.
• SHA’da ekleme (padding) işlemi, MD5’teki ile aynı şekilde yapılır.
• SHA’da da her 512 bitlik blok için 4 adımda işlemler yapılır, fakat bir farkla: MD5’de her adımda önceden tanımlı işlevlerin kullanımı 16 kez tekrarlanırken, bu sayı SHA’da 20 kezdir.
• SHA girdi olarak maksimum 264-1 uzunluğunda veriyi kabul eder. Bunu yanında MD5 için böyle bir kısıtlama yoktur.
• SHA ürettiği 160 bitlik sonuç ile brute-force (bütün olası sonuçların denenmesi ile gerçekleştirilir) ataklara karşı daha dayanıklıdır.
Diğerleri
MD5 ve SHA’nın yanında daha birçok MD algoritması tasarlanmıştır. Bunlardan bazıları MD2, MD4, Haval, Ripe-MD, Snefru, N-Hash’dır.
Uygulamalar
Çok çeşitli MD algoritmalarını gerçekleyen uygulamaları farklı platformlar için bulmak mümkündür.
Unix/Linux Uygulamaları
Unix/Linux platformlarında MD5 ve SHA algoritmaların gerçekleyen en bilindik uygulamalar sırasıyla md5sum ve sha1sum’dır. Uygulamaların çalıştırılmasına ilişkin örnekler:
~$ md5sum deneme
d39100ac38f7bde184d48d1ad0af0318 deneme
~$ sha1sum deneme
394916cffc20a1e087ede73a8b66ce1063ea4b9f deneme
~$