Kısmi Homomorfik Şifreleme Algoritmalarının Python İle Kullanımı
Homomorfik şifreleme (homomorphic encryption) verileriniz bir kere gizli anahtarınız ile şifrelendikten sonra bir daha gizli anahtara bir daha ihtiyaç duymadan şifreli veriler üzerinde toplama, çarpma gibi matematiksel işlemler yapmanıza izin veren algoritmalara verilen isimdir. Bir algoritma eğer toplama veya çarpma işlemi üzerinde homomorfik özellikler gösteriyorsa buna kısmi homomorfik şifreleme (partially homomorphic encryption); eğer hem toplama hem de çarpma üzeride homomorfik özellikler gösteriyorsa da buna da tam homomorfik şifreleme (fully homomorphic encryption) diyoruz. Bu blog yazısında LightPHE kullanarak python ile homomorfik işlemleri nasıl adım adım gerçekleştirebileceğimizi inceleyeceğiz.
Homomorfik Şifreleme Neden Önemlidir?
Eğer çalışanlarınızın maaş gibi hassas verilerini şifreledikten sonra bir bulut ortamında saklıyorsanız ve tercihen DES, AES gibi simetrik bir şifreleme algoritması kullanıyorsanız, maaşların güncellenmesi gerektiği noktada tüm maaş bilgilerini bulut ortamdan yerel ortamınıza şifreli olarak çekip, her bir şifreli maaşı açıp, açılmış maaşları güncelledikten sonra tekrar şifreleyip bulut ortama aktarmalısınız. Aksi takdirde maaşları şifrelediğiniz anahtarı bulut ortamına gönderip şifrenin açılımı, güncelleme ve tekrar şifreleme işlemini bulutta yapmak isterseniz birisi anahtarı ele geçirip tüm verilerinizi görebilir.
Öte yandan maaşlar homomorfik özelliği olan bir algoritma ile şifrelenip buluta saklandı ise, bulut ortamda gizli anahtara ihtiyaç duymadan maaşların güncellenmesini gerçekleştirebilirsiniz. Hem simetrik şifrelemede uygulamanız gereken şifreleme ve şifre açma adımlarından kurtulmuş olacaksınız hem de güncelleme işlemini yerel ortamınız yerine bulutun gücünden faydalanarak gerçekleştirebileceksiniz.
Kısmi Homomorfik vs Tam Homomorfik
Tam homomorfik şifreleme 2009 yılından beri hayatımızda ve bugün TenSEAL gibi kütüphanelerle şifreli veriler üzerinde hem toplama hem de çarpma yapabiliyoruz. Ancak tam homomorfik şifrelemenin handikapı şifreli verilerin çok büyük boyutlarda olması ve şifreleme işleminin simetrik şifrelere göre çok daha yavaş olması. Eğer şifreli veri üzerinde toplama ya da çarpma yapmak sizin için yeterli ise tam homomorfik şifreleme yerine kısmi homorfik şifreleme yapmanızın size katacağı artıları şu şekilde sıralayabiliriz:
- 🏎️ Çok daha hızlı şekilde şifreleme, şifre açma ve homomorfik işlemler
- 💻 Daha az işlemci gücüne ihtiyaç duyulması
- 📏 Daha kısa şifreli metinlerin üretilmesi
- 🧠 Bellek kısıtı ortamlara daha uyumlu olması
🐍 Python
Bu yazıda Python ile LightPHE kütüphanesini kullanarak nasıl kısmi homomorfik şifreleme işlemlerini gerçekleştirebileceğimizi inceleyeceğiz. Kütüphane Lightweight Partially Homomorphic Encryption Library for Python’un kısaltması.
Kütüphaneyi kurmanın en kolay yolu paketi pip ile indirmek.
1 2 3 4 5 |
pip install lightphe |
Daha sonra kütüphaneyi aşağıdaki import edebilir ve fonksiyonlarını kullanabileceksiniz.
1 2 3 4 5 |
from lightphe import LightPHE |
Kütüphane, toplama veya çarpma veya XOR işlemleri üzerinde homomorfik özellikler gösteren 10 algoritmayı desteklemekte. Özetle çarpma özelinde homomorfik özellikler gösteren RSA ve ElGamal; ve toplama üzerinde homomorfik özellikler gösteren Üssel ElGamal, Elliptic Curve ElGamal, Paillier, Damgard-Jurik, Benaloh, Naccache-Stern, Okamoto-Uchiyama; ve XOR üzerinde homomorfik özellikler gösteren Goldwasser-Micali algoritmalarını desteklemekte. Bu kadar algoritma ismini saymak gözünüzü korkutmasın, kullanıcı olarak sadece algoritmanın adını ve sahip olduğu homomorfik özelliği bilmeniz sizin için yeterli. Yine de algoritmaların arkasındaki matematiğe merak ediyorsanız algoritma isimlerinin üzerinde verdiğim linkleri takip edebilirsiniz.
Örneğin, RSA algoritması yukarıdaki tabloda görüldüğü üzere çarpımsal olarak homomorfik. İlk olarak bu algoritma ile bir kripto sistem yaratalım. Bu adım RSA algoritması için gerekli gizli ve açık anahtarların üretimini gerçekleştirecek.
1 2 3 4 5 6 |
# kripto sistemin olusturulmasi cs = LightPHE(algorithm_name = "RSA") |
Şifreleme ve Deşifreleme
Açık bir veriyi oluşturduğumuz kriptosistem ile şifreleyelim ve açılabildiğini test edelim.
1 2 3 4 5 6 7 8 9 10 11 12 |
# acik veri m = 17 # sifrelenme c = cs.encrypt(m) # desifreleme assert cs.decrypt(c) == m |
Çarpımsal Homomorfik İşlemler
Kripto sistemi oluştururken çarpımsal olarak homomorfik olan RSA algoritmasını kullanmıştık. Örneğin maaş bilgimiz aylık 10,000 USD olsun ve şifreli maaşımızı %5 oranında arttıralım. Bir şeyin %5 arttırılması onu 1.05 ile çarpmaya eşdeğerdir. Dolayısıyla RSA ila 1.05’i şifreledikten sonra şifreli maaşımız ile çarparsak maaşımızın %5 fazlasının şifreli haline sahip oluruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 10000 USD maas ve %5 artis verileri m1 = 10000 m2 = 1.05 # sifreleme c1 = cs.encrypt(m1) c2 = cs.encrypt(m2) # homomorfik carpma - gizli anahtara ihtiyac yok! c3 = c1 * c2 # kanıt assert cs.decrypt(c3) == m1 * m2 |
Görüldüğü üzere c3 = c1 * c2 adımı gizli anahtara ihtiyaç duymadan bulut ortamda gerçekleştirilebilir. Yeni şifreli maaşın şifresini açarsak 10,000 USD’nin %5 fazlası olan 10,500 USD’yi elde ederiz.
Toplamsal Homomorfik İşlemler
Şimdi de aynı işlemi toplama üzerinde homomorfik özellikler gösteren bir algoritma ile yapalım. İlk olarak Paillier algoritması ile kriptosistemi oluşturacağım ve bu da gizli ve açık anahtar çiftini rastgele üretecek.
1 2 3 4 5 |
cs = LightPHE(algorithm_name = "Paillier") |
Yine baz maaşımız olan 10,000 USD’yi ve üzerine ekleme yapmak istediğimiz 500 USD’yi şifreleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# baz maas ve eklenecek zam bilgileri m1 = 10000 m2 = 500 # bu bilgilerin sifrelenmesi c1 = cs.encrypt(m1) c2 = cs.encrypt(m2) # homomorfik toplama - bu adimda gizli anahtara ihtiyac yok c3 = c1 + c2 # kanit assert cs.decrypt(c3) == m1 + m2 |
Görüldüğü üzere şifreli maaş ve şifreli zam bilgilerini gizli anahtara ihtiyaç duymadan toplayabiliyoruz ve elde ettiğimiz değeri deşifrelersek maaş ve zam verilerinin toplamını elde ediyoruz.
Şifreli verilerin açık bir sabit ile çarpılması
Her ne kadar Paillier ve diğer toplamsal homomorfik algoritmalar şifreli verilerin çarpımını desteklemese de şifreli bir verinin açık bir sabit ile çarpımına imkan sağlamakta. Dolayısıyla şifreli maaş açık haldeki %5 bilgisiyle yine de çarpılabilir. Sonuç yine baz maaşın %5 fazlası olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
cs = LightPHE(algorithm_name = "Paillier") # bas maas m1 = 10000 # sifreli maas c1 = cs.encrypt(m1) # maasi %5 arttirmak icin kullanilacak sabit k = 1.05 # homomorfik skalar carpma - gizli anatara ihtiyac yok! c4 = k * c1 # kanit assert cs.decrypt(c4) == k * m1 |
Çoğunlukla yanılgıya düşülen bir olay şifreli bir metin açık bir sabitle çarpılabiliyorsa bu onu çarpımsal olarak da homomorfik yapar algısıdır. Ancak bu doğru değildir. Bir algoritma ancak ve ancak eğer iki şifreli metinin çarpımını destekliyorsa çarpımsal olarak homomorfiktir.
Desteklenmeyen Homomorfik İşlemler
Belirttiğimiz gibi Paillier çarpımsal olarak homomorfik olmadığı için eğer 2 şifreli veriyi çarpmayı denerseniz hata alacaksınız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import pytest from lightphe import LightPHE cs = LightPHE(algorithm_name = "Paillier") # acik veriler m1 = 17 m2 = 23 # sifreli veriler c1 = cs.encrypt(m1) c2 = cs.encrypt(m2) # Pailler carpimsal olarak homomorfik degildir with pytest.raises(ValueError): c1 * c2 |
RSA ile oluşturulan kriptosistemde de toplama işlemini deneseydiniz benzer bir hata alacaktınız.
Sonuç
Bu yazımızda hafifsiklet bir kısmi homomorfik şifreleme kütüphanesi olan LightPHE ile şifreleme, deşifreleme ve homomorfik işlemlerin nasıl yapılacağını sıfırdan ve adım adım göstermeye çalıştık. Bununla birlikte tam homomorfik şifreleme yerine kısmi homomorfik şifreleme kullanılmasının hangi durumlarda fayda sağlayacağını özetlemeye çalıştık. Yazıyı beğendiyseniz açık kaynak kodlu projeyi yıldızlayarak ⭐ destekte bulunabilirsiniz.