A Deep Dive into the Digital Signatures, Encryption and Hash Function
Dijital imzalar, simetrik ve asimetrik şifreleme, hash fonksiyonları, RSA ve Eliptik Eğri Algoritması ve nicesi... Blockchain yolculuğundaki kafa karı
Dijital imzalar, elektronik ortamda bir belgeyi imzalamanın yoludur. Bu imzalama işlemi, belgeye bir şifreleme algoritması uygulanarak yapılır. Bu yazımızda genel olarak simetrik ve asimetrik şifreleme işlemlerine, private(özel) ve public(açık) anahtarların bu sistemde nasıl kullanıldığına ve hash fonksiyonlarına değineceğiz.
Dijital imzalar, günümüzde pek çok farklı alanda kullanılmaktadır. Örneğin, e-devlet uygulamalarında, elektronik fatura ve elektronik keşif cetveli gibi çeşitli işlemlerde kullanılmaktadır.
Bu yazımızda yalnızca blockchain tarafında örnekler vereceğiz ama genel yapı tüm uygulamalarda geçerlidir.
Şifreleme ve Hash Uygulamaları
Hash işlemi ve şifreleme kulağa aynı şeylermiş gibi gelse de birbirlerinden farklılar. Şifrelemede girdiğiniz bilgi belirli bir algoritma ve bir çözücü anahtar ile okunamayacak bir hale getirilir, ancak bu çözücü anahtara sahip olunursa girilen veri eski haline getirilebilir ve okunabilir. Hash uygulamalarında ise durum biraz farklı. Hash işlemi tek yönlü bir işlem olduğundan dolayı, hash değeri ele geçirilse bile günümüz bilgisayarları ile girdinin eski haline döndürülebilmesi neredeyse imkansız.
Bir çok hash yöntemi (SHA1, MD5, SHA256…) kullanılabilir. Bunlardan en popüleri, bizim de alanımız dahilinde olacak olan sha256'dır. SHA-256, NIST (National Institute of Standards and Technology) tarafından standartlaştırılmış bir hash algoritmasıdır ve çeşitli uygulamalarda kullanılmaktadır .Sha256 girilen her girdiye karşı bağımsız 256 bitlik bir hash oluşturur.
Yalnızca bir karakterde yapacağımız küçük bir değişiklik tamamen farklı bir hash oluşmasına yol açacaktır. Şimdi ünlemleri silip nokta koyalım.
İletilen verinin değişmezliğinin doğrulanması amacıyla bu algoritmayı sık sık kullanacağız. Şimdi mesajımızı hashledik, peki karşı tarafa nasıl ileteceğiz?
Simetrik Şifreleme
Şimdi anlatacağımız konular yeterince kafa karışıklığına yol açabiliyor ve yer yer sıkıcı olabiliyor. Bu nedenle olabildiğince basit ve görsel örnekleme yaparak ilerlemenin doğru olduğunu düşünüyorum.
Alice ve Bob 10 kişilik bir masada oturuyor ve birbirlerine bir mesaj iletmek istiyorlar. Bu mesajın kimse tarafından anlaşılmaması, yalnızca Alice ve Bob’un bilmesi gerekiyor bunu nasıl yapacaklar?
Alice ve Bob’un 10’lu masası
Alice mesajını bir kutuya koyup kitliyor. Sonra bu anahtar ve kutuyu Bob’a veriyor. Ve başardık, artık masadaki diğer 8 kişi mesajı bilmiyor. Kutu hali hazırda kilitli olduğu için kimse içindekini anahtar olmadan öğrenemez. Bizim güvenli bir şekilde iletmek istediğimiz en önemli şey anahtarın kendisi olacaktır.
Bu anahtar private key’i temsil eder. Alice bir anahtar ve mesaja sahip, mesaj kilitli olduğu için masadakilerin anlaması mümkün değil. Bizim yegane görevimiz private key’i güvenli bir şekilde Bob’a ulaştırmak. İşte tam bu noktada problem başlıyor. Mail ile iletmek, kağıda yazıp vermek gibi seçenekler aklınıza gelmiş olabilir. Maalesef hiçbiri pratik ve güvenli değil.
Simetrik şifreleme bir devrim yaratsa da ortak anahtar kullanımı büyük güvenlik açıklarına yol açmaktadır. Ama yine de simetrik şifreleme yıllarca kullanıldı ta ki birisi olağanüstü bir fikir ortaya atana kadar.
Asimetrik Şifreleme
1976'da Whitfield Diffie bir fikir önerdi. Ya tüm düşünülenin aksine anahtarımızı biz gösterirsek?
Diffie-Hellman anahtar değişim protokolü, iki taraf arasında güvenli bir şifreleme anahtarının nasıl değiştirileceğini açıklar. Bu protokol sayesinde iki taraf, birbirlerine güvenmedikleri bir ortamda bile güvenli bir şekilde bir anahtar paylaşabilirler. Bu sayede, iki taraf arasında güvenli bir şifreleme kullanılarak veri gönderme ve alma işlemleri yapılabilir.
Kafa karışıklığı olmuş olması çok normal. Şimdi Alice ve Bob’u entegre edip adım adım inceleyelim.
Yine aynı durum söz konusu, Alice’in Bob’a iletmesi gereken bir mesaj var ve bu mesaj güvenli bir şekilde iletilmek zorunda.
Alice ve Bob’un anahtar çiftleri
Alice ve Bob birbiriyle uyumlu olan, biri herkes tarafından erişilibilir diğeri ise yalnızca kendine özel olan bir anahtar çiftine sahiptir. Bu anahtar çiftlerinin birbiriyle ilişkisi olması, biri tarafından şifrelenen mesajı diğeri çözebilir anlamı taşımakta.
Şimdi bu anahtar çiftlerini kullanarak mesajımızı iletelim.
Alice ve Bob dijital imza şematik gösterimi — Emre Aslan (@blockenddev)
Alice, Bob’a göndermek istediği mesajı yazdıktan sonra, mesajı şifrelemek için kendi private key’ini kullanır. Bu sayede, mesaj sadece Alice’in key’i ile çözülebilir hale gelir.
Alice, şifrelenmiş mesajın hash’ini alır. (sha256)
Alice, hash’lenmiş mesajı imzalamak için Bob’un public key’ini kullanır. Bu sayede, mesajın Bob tarafından gerçekten okunduğu doğrulanır.
Alice, şifrelenmiş, hash’lenmiş ve imzalanmış mesajı Bob’a gönderir.
Bob, mesajı alır ve mesajı açmak için kendi private key’ini kullanır. Bu sayede, mesaj kendi public key’i ile şifrelenmiş olduğu için, Bob mesajı çözebilir.
Bob, mesajı açtıktan sonra, mesajın gerçekten Alice tarafından gönderildiğini doğrulamak için mesajın imzasını Alice’in public key’i ile doğrular. Eğer mesajın imzası doğrulanırsa, Bob mesajın Alice tarafından gönderildiğine emin olur ve mesajı okur.
Bu şekilde, Alice ve Bob arasında güvenli bir şekilde bir mesaj gönderilmiş olur ve işlemlerin doğrulanması için kriptografik imzalama yöntemleri kullanılmış olur. Bu yöntemler sayesinde, işlemlerin geçerli olup olmadığı doğrulanır ve aynı zamanda, işlemlerin güvenli bir şekilde imzalanması da sağlanır.
6. Adım yani verification(doğrulama) adımı için akıllarda oluşabilecek bazı soru işaretleri yok etmeye çalışalım.
Soru: Bob hashlenmiş mesaja kadar çözüyor ama daha geri gidemiyor. Elinde sadece hash varken Alice’in “I love you” mesajını nasıl okuyabilir?
Alice her ne kadar “I love you” mesajını gönderse de Bob aslında hiçbir zaman Alice’in onu sevdiğini bilemeyecek. Üzücü ama maalesef gerçek bu. Alice eğer gerçekten onu sevdiğini söylemek istiyorsa mesajın hem imzalı ve şifreli halini hem de kendini göndermeli.
Bob ancak bu şekilde mesajı Alice’in public key’i ile şifreleyip daha sonra ise hasledikten sonra gelen hash ile karşılaştırır. Eğer hashler aynı ise mesaj doğrudur değilse mesaj yanlıştır. Çünkü hash fonksiyonları tek yönlüdür ve asla geri döndürülemez.
Bob’un sevildiğini öğrenmesinin bir yolu da asimetrik şifreleme yaparken verinin değişmezliğinden taviz vermek olacaktır. Alice sadece iki adımda şifreli bir şekilde onu sevdiğini söylebilirdi. 1. adım olarak Bob’un public key’i ile mesajını şifrelemek ve bunu Bob’ göndermek. 2.adım olarak da Bob’un bu şifrelemeyi kendi private key’i ile çözmesi ve mesajının içeriğine erişmesi.
En basit haliyle asimetrik şifreleme
Bu yol aslında asimetrik şifrelemenin en basit halidir. Ama tabi ki verinin değişmezliğinden, ve mesajın gerçekten Alice tarafından geldiğinden tavizler içerir.
Soru: İyi güzel de! Mesajı açık olarak gönderdikten sonra şifrelemenin ne anlamı kaldı? Alice Bob’a “I love you” diyebilirdi en başta…
Bizler cüzdanımızı bir marketplace’e bağladığımızda NFT alıp sattığımızda, ya da web3 websitesinde işlemler yaptığımızda bir çok imzalama işlemi yapıyoruz. Buna bağlı olarak da karşı tarafa imzaladığımız mesajları gönderiyoruz. Karşı tarafa mesaj göndersek de bu tür alanlarda okunmasını istemeyiz. Ancak eğer ispat gerekirse veriyi alıp ispat edebiliriz. Alice’in de: Bak ben sana “I love you” demiştim bu da ispatı, diyebileceği gibi.
Soru: Alice’in public key’ine herkes ulaşabildiği için Alice mesajını açık olarak Bob’a ispat için gönderdiğinde herkes doğrulama işlemini yapamaz mı?
Hayır, çünkü hashlenmiş mesaja sadece Alice ve Bob sahiptir. Evet herkes deneyebilir ama karşılaştıracak bir hash’e sahip değiller. Bu yüzden doğrulama işlemini yalnızca Alice ve Bob yapabilir. Geri kalan kullanıcıların böyle bir hamlesi söz konusu olamaz.
Asimetrik şifreleme bir diğer adıyla public key şifrelemesi, private key’in değil public key’in karşılıklı kullanılmasını amaçlamaktadır. Eğer Ethereum ve Solana gibi zincirler üzerinde cüzdan oluşturacaksanız bu zincirlerde asimetrik şifreleme kullanıldığından 256 bitlik public ve private key’lere sahip olacaksınız demektir. Peki bu birbiriyle uyumlu olan bu public ve private key’ler nasıl üretiliyor?
RSA ve Eliptik Eğri Algoritması (ECDSA)
Public key şifreleme için bir çok algoritma yöntem kullanılır. Bunlardan en popülerleri olan RSA ve Eliptik Eğri Algoritmasına kısaca göz atacağız. Kriptografi’nin aşırı derinliklerine inmeden yüzeysel bir şekilde key’lerin nasıl oluştuğuna bakalım.
Açık anahtar şifreleme algoritmaları
RSA (Rivest-Shamir-Adleman) adı verilen kriptografi algoritması, verilerin güvenli bir şekilde şifrelenmesi ve şifre çözme işlemlerinin gerçekleştirilmesi için kullanılan bir algoritmadır. RSA, 1978 yılında Ron Rivest, Adi Shamir ve Leonard Adleman tarafından geliştirilmiştir ve bu algoritma, şu anda birçok uygulamada kullanılmaktadır.
Aşağıdaki örnekte de RSA algoritmasının nasıl çalıştığı gösterilmiştir:
Öncelikle, iki asal sayı seçilir ve bu sayılar, p ve q olarak adlandırılır. Örneğin, p=5 ve q=13 olarak seçilebilir.
Daha sonra, p ve q sayılarının çarpımı olan n sayısı hesaplanır. n sayısı, public key olarak kullanılır. n=pq olduğu için, n=5.13=65 olur.
Euler fonksiyonu olarak adlandırılan (φ(n)) fonksiyonu kullanılarak, p ve q sayılarının çarpımından kalan sayı (phi) hesaplanır. phi=(p-1)(q-1) olduğu için, phi=(5–1)(13–1)=48 olur.
Daha sonra, bir e sayısı seçilir ve bu sayı, 1 ile phi arasında olmalıdır. Örneğin, e=17 olarak seçilebilir. e sayısı, public key olarak kullanılır.
Son olarak, e sayısı ile phi sayısı arasında modulo işlemi uygulanarak, d sayısı hesaplanır. Örneğin, d=27 olarak hesaplanır. d sayısı, private key olarak kullanılır.
Bu işlemler sonucunda, public key olarak (n=65, e=17) ve private key olarak (n=65, d=27) çiftleri oluşturulur. Bu anahtarlar, verilerin güvenli bir şekilde şifrelenmesi ve şifre çözme işlemlerinin gerçekleştirilmesi için kullanılır.
RSA hakkında daha fazla bilgi için…
Eliptik eğri dijital imza algoritması (ECDSA, Elliptic Curve Digital Signature Algorithm) bir kriptografi algoritmasıdır ve bu algoritma, bir mesajın veya verilerin doğruluğunu doğrulamak için kullanılır.
Eğer bir kullanıcı, bir mesajı veya verileri diğer kullanıcılara göndermek istiyorsa, mesaj veya verileri şifreler ve şifrelenmiş mesajı veya verileri diğer kullanıcılara gönderir. Bu mesaj veya veriler, gönderilen kullanıcı tarafından doğrulanır ve doğrulanırsa, mesaj veya verilerin gerçekte gönderilen kullanıcı tarafından gönderildiği doğrulanır.
ECDSA algoritması, bu doğrulama işlemini gerçekleştirir ve bu işlem sonucunda, bir dijital imza oluşur. Bu dijital imza, mesaj veya verilerin doğruluğunu doğrular ve aynı zamanda, mesaj veya verilerin değiştirilmemesi veya değiştirilmesi halinde, bu değişikliğin tespit edilebilmesini sağlar. Bu yöntem ile, mesaj veya verilerin doğruluğu ve değiştirilmemesi güvence altına alınır.
Public key ve private key oluşturulma işlemi şöyle gerçekleştirilir:
Öncelikle, bir eliptik eğri seçilir. Bu eğri, çeşitli özellikler taşıyan bir matematiksel yapıdır ve kriptografi sistemlerinde kullanılır.
Daha sonra, bu eğrinin üzerinde bir nokta seçilir. Bu nokta, G olarak adlandırılır ve bu noktayı oluşturan koordinatlar, (x, y) olarak ifade edilir.
Sonra, bir private key seçilir ve bu private key, d olarak adlandırılır. d, bir sayı olup, 0 ile (n-1) arasında bir değere sahip olmalıdır.
Daha sonra, G noktası ve d private key değeri kullanılarak, public key olarak adlandırılan Q noktası hesaplanır. Q noktası, (x, y) koordinatlarına sahip olur ve bu koordinatlar, public key olarak kullanılır.
Bu işlemler sonucunda, public key olarak (x, y) ve private key olarak d çiftleri oluşturulur. Bu anahtarlar, verilerin güvenli bir şekilde şifrelenmesi ve şifre çözme işlemlerinin gerçekleştirilmesi için kullanılır.
Eliptik eğri ile private ve public key’imizi seçtik hadi şimdi bir de imzalama işlemi yapalım:
Alice ve Bob arasında bir iletişim kurulur ve Alice, Bob’a bir mesaj göndermek istediğini belirtir.
Daha sonra, Alice ve Bob arasında ECDSA algoritması kullanılarak public key ve private key çiftleri oluşturulur.
Alice, mesajını şifrelemek için kullanacağı public key çiftini Bob’a gönderir.
Bob, aldığı public key çiftini kullanarak mesajı şifreler ve şifrelenmiş mesajı Alice’ye gönderir.
Alice ise, aldığı şifrelenmiş mesajı çözmek için kullanacağı private key çiftini kullanır ve orjinal mesajı elde eder.
Eliptik Eğri hakkında daha fazla bilgi için…
Kriptografi derya deniz… Sadece ucundan bazı algoritmaları yüzeysel olarak bilmenin de ciddi faydası olacaktır. Tek seferde RSA ve ECDSA’yı anlamak elbette mümkün değil, zaten kriptografiye ilginiz yoksa temel bilgileri bilmek gayet yeterli olacaktır. Bu yüzden, eğer ilgi alanınız değilse lütfen temel kısımlara odaklanın.
Bildiğiniz gibi artık Alice ve Bob 256 bitlik public ve private keylere sahip. Sadece dikkatli okuyucuların takılabileceği noktaya da değinmesem olmazdı.
Soru: Benim örneğin Ethereum üzerindeki cüzdanımdaki insanlarla paylaştığım, cüzdanımı bağladığım key sadece 40 karakterden oluşuyor. Bu nasıl oluyor 256 bit olması gerekmiyor mu, bu nispeten daha kısa?
Öncelikle örneğin Ethereum üzerindeki 0x ile başlayan ifadeler bizim public ya da private keyimiz değil, hesap numaramız. Public ve private key’e göre daha kısa ve aynı public key gibi insanlarla paylaşmamız hatta twitter kullanıcı adı yapmamız herhangi bir sorun teşkil etmiyor.
Soru: Şifreleme ve imzalama işlemlerinde hiç ens domainlerimizi (cüzdan adreslerimizi) kullanmadık, buna neden ihtiyaç duyulmuş? Public key yeterli değil miydi?
Asimetrik şifreleme yönteminde public key ve private key kullanılır ve bu ikilinin birbirleriyle ilişkisi vardır. Public key, bir mesajı şifreleyebilir ve private key ile şifreli mesajı çözebilirsiniz. Bu şekilde, mesajı gönderen ve alan kişiler arasında güvenli bir iletişim oluşturulur. Bunları zaten yukarıda detaylıca öğrendik.
Ancak Ethereum ağı üzerinde, public key ve private key yalnızca bir bölümü oluşturur. Ethereum ağı üzerinde işlem yaparken cüzdan adresiniz de kullanılır ve cüzdan adresiniz, Ethereum ağı üzerinde bir hesap açtıktan sonra bir public key ile ilişkilendirilir. Cüzdan adresiniz, Ethereum ağı üzerinde işlem yaparken kullandığınız bir benzersiz tanımlayıcıdır ve işlemlerinizi doğrulamak için kullanılır. Cüzdan adresiniz olmadan Ethereum ağı üzerinde işlem yapamaz ve Ethereum ağı üzerinde bir hesap açamazsınız. Bu nedenle cüzdan adresinizin olması Ethereum ağı için önemlidir ve Ethereum ağı üzerinde işlem yapmak için gereklidir.
Sonuç
Tüm amacımız Alice’in Bob’u sevdiğini kulağına fısıldamaktı. Hash fonksiyonlarını öğrendik, public ve private keylerimizi RSA ve ECDSA yardımıyla oluşturduk, imzalama işlemlerini öğrendik. Kısaca bir çok aşama geçtik, eğer buraya kadar sıkılmadan, pes etmeden geldiyseniz tebrik ederim.
Blockchain 101–102 konularının yüzeysel geçilen, genelde kursların ve eğitimlerin öğrenme sürecinde önemsenmeyen ve üzerine düşülmediği önemli bir konuya tik attınız.
Aklınıza takılan sorular ve eleştiriler için mesaj atmaktan çekinmeyin. Yazarı sosyal medya hesaplarından takip edebilirsiniz:
Twitter: https://twitter.com/blockenddev