Algoritma ilk kez 1976 yılında Whitfield Diffe ve Martin Hellman tarafından “New Directions in Cryptography” isimli makalelerinde yayınlanmıştır.

Diffie-Hellman algoritması gizli iletişimlerde kullanılabilecek ortak gizli anahtar üretir. Bu anahtar güvensiz açık ağlarda (internet) güvenli veri alışverişini sağlar.

Ortak gizli anahtar üretilirken her iki taraf g ve p sayılarını belirler ve açık kanaldan iletirler. g ve p sayıları açık kanaldan iletilse de 3. Kişiler tarafından bilinmesinde mahsur yoktur. İletilen g ve p sayıları ortak gizli anahtarın hesaplanmasında kullanılacaktır.

Ortak gizli anahtarın oluşmasında öncelikle açık bir anahtar oluşturulup paylaşılır. Açık anahtar a1 ve a2 olarak ifade edilsin ve taraflar kendilerinde bulunan gizli bir sayı değeri seçerler, bunlar gs1 ve gs2 olarak adlandırılsın.  a1=(g^gs1) mod p  ve  a2=(g^gs2) mod p  formülü ile hesaplanan açık anahtarlar ağ üzerinden paylaşılır.

İletilen açık anahtar ile ortak gizli anahtar hesaplanacaktır. Ortak gizli anahtar her iki istemci tarafından ayrı ayrı hesaplanırlar ancak hesaplanan gizli anahtarlar aynı olacaktır. Ortak gizli anahtar oga olarak adlandırılsın bu değer, istemci1 oga=(a2^gs1) mod p  ve  istemci2 oga=(a1^gs2) mod p formülü ile hesaplanır. Üretilen ortak gizli anahtar artık iletişim için kullanılabilir.

Örnek hesaplama;

İstemci 1

İstemci 2

p= 25, g=9 belirlendi ve iletildi

gs1=3 gs2=6
a1=(g^gs1) mod p a2=(g^gs2) mod p
4=9^3 (mod 25) 16=9^6 (mod 25)
oga=(a2^gs1) mod p oga=(a1^gs2) mod p
21=16^3 (mod 25) 21=4^6 (mod 25)
Ortak gizli anahtar : 21 Ortak gizli anahtar : 21

 

Örnek hesaplama kodu:

static void Main(string[] args)
{
    float p, g, gs1, gs2, a1, a2, oga1, oga2;
    p = 25;
    Console.WriteLine($"p değeri {p} olarak seçildi ve iletildi.");

    g = 9;
    Console.WriteLine($"g değeri {g} olarak seçildi ve iletildi.");

    gs1 = 3;
    Console.WriteLine($"gs1 değeri {gs1} olarak seçildi. (İstemci 1 Gizli Sayı)");

    gs2 = 6;
    Console.WriteLine($"gs2 değeri {gs2} olarak seçildi. (İstemci 2 Gizli Sayı)");

    a1 = (float)Math.Pow(g, gs1) % p;
    Console.WriteLine($"a1 değeri {a1} olarak hesaplandı ve iletildi. (İstemci 1 Açık Anahtar)");

    a2 = (float)Math.Pow(g, gs2) % p;
    Console.WriteLine($"a2 değeri {a2} olarak hesaplandı ve iletildi. (İstemci 2 Açık Anahtar)");

    oga2 = (float)Math.Pow(a2, gs1) % p;
    Console.WriteLine($"oga değeri {oga2} olarak hesaplandı (İstemci 1)");

    oga1 = (float)Math.Pow(a1, gs2) % p;
    Console.WriteLine($"oga değeri {oga1} olarak hesaplandı (İstemci 2)");

    //ortak anahtar ile veri şifreleme
    string veri = "Abdurrahman,";
    Console.WriteLine($"Şifrelenecek Veri: {veri}");

    var veriBytes = Encoding.Default.GetBytes(veri);
    var sifrelenmisVeri = sifrele(veriBytes, oga1.ToString());
    var sifresiAcilmisVeri = sifrele(sifrelenmisVeri, oga2.ToString());

    string donenVeri = Encoding.Default.GetString(sifresiAcilmisVeri);
    Console.WriteLine($"Şifresi çözülmüş veri: {donenVeri}");
    Console.ReadLine();
}

public static byte[] sifrele(byte[] veri, string sifre)
{
    int XOR = 0;
    for (int i = 0; i < sifre.Length; i++)
    {
        XOR = XOR + (int)(sifre[i] * (i + 1));
    }

    byte[] sifreliByte = new byte[veri.Length];

    for (int i = 0; i < veri.Length; i++)
    {
        sifreliByte[i] = (byte)((int)veri[i] ^ XOR);
    }

    return sifreliByte;
}

Örnek ekran çıktısı:

Kategoriler: CSharp

0 yorum

Bir cevap yazın

Avatar placeholder

E-posta hesabınız yayımlanmayacak.

*