İnternet ağında biri gizli diğeri açık olmak üzere ikili anahtar sistemini kullanan protokoller üzerinden (https, ssh, vpn çözümleri vb.) iletişim kurduğumuzda güvende olduğumuzu düşünüyoruz. İki bilgisayar sistemi arasında bu şekilde gerçekleştirilmiş olan bağlantıdaki veriler üçüncü bir sistem tarafından gözlemlenebilir ancak görülebilenler tümüyle şifreli olacaktır. Bu şifreyi çözmek ise güncel teknolojiyle yüzyıllar mertebesinde süre almaktadır. Dolayısıyla iletişimin güvenli olduğunu söyleyebiliriz. Bu temel varsayım üzerinde sadece kişisel bilgilerimiz, eposta arşivimiz değil e-ticaret ve ödeme sistemleri de dahil olmak üzere pek çok operasyon güvenli biçimde çalışmasını sürdürmektedir. Peki gerçekten de bu kadar güvende miyiz? Örneğin NSA gibi kuruluşların bu trafiği izlemesi mümkün müdür?
2012 yılında Wired'da çıkan bir yazıda ismini vermek istemeyen bir NSA çalışanının ifadelerini doğru kabul edecek olursak [1], NSA'nın halihazırda şifrelenmiş trafiği çözebilme yeteneği olduğuna dair önemli ipuçlarına ulaşıyoruz. Aynı yazıda NSA'nın şifrelenmiş trafiğin çözülebilmesi konusunda ne büyüklükte yatırımlar yaptığını da görebiliyoruz. Bunlara ek olarak Edward Snowden'in NSA'nın şifreli VPN trafikleri ile HTTPS trafiğinin önemli bir kısmını çözebildiğine dair yorumlarını da dikkate almamız gerekiyor.
Hemen herkes Amerika'nın (yani Ulusal Güvenlik Ajansı olan NSA'nın) bu trafiği dinleyebiliyor olacağını tahmin etse de esasında bu işin matematiksel zorluklarını bilenler için söylenti ve tahminlerden ötede bir noktaya varılamıyordu. Ek olarak pek çok devletin HTTPS trafiğini dinleyebilmek için onca çaba sarfetmesine rağmen başarıya ulaşamadığını da en azından bir kısmımız biliyoruz.
Fakat 2015 Ekim ayında olaya dair bakışımızı değiştirecek ve söylentileri yerli yerine oturtacak bir gelişme yaşandı. Michigan Üniversitesi'nden J. Alex Halderman ve Pennsylvania Üniversitesi'nden Nadia Heninger, kendilerine aynı zamanda CCS 2015 en iyi makale ödülünü de getiren şu makaleyi yayınladılar: Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice [2]
Şifreleme Algoritmaları Hakkında
Makaleyi değerlendirmeye geçmeden önce sürece kısaca değinmekte yarar var. Şifrelemenin tarihçesi çok eskilere dayanmakla birlikte, en önemli dönüm noktalarından biri 1977 yılında yaşanmıştır. Bu yılda hem RSA Algoritması hem de Diffie-Hellman anahtar değişimi algoritmaları duyurulmuştur.
RSA Algoritması özetle çok büyük tam sayıları çarpanlarına ayırma işleminin algoritmik zorluğu esasına dayanılarak geliştirilmiş bir açık anahtar sistemidir. Matematiksel doğruluk ispatı isa Fermatın küçük teoremi ile (17. yüzyıl) sağlanabilmektedir. RSA dahil olmak üzere tüm açık anahtar tabanlı sistemlerde, gönderilecek mesaj alıcının herkese açık anahtarı ile şifrelenir ve bu mesaj sadece alıcının kendisinin bildiği özel anahtarla açılabilir. Temel amaç, şifreleme sürecinin kolay, şifreyi çözmenin ise gizli anahtar bilinmeksizin çok zor olmasını sağlamaktır. RSA örneğimizde şifrelemeyi yaparken büyük asal sayıların çarpımı gerçekleştirilirken şifrenin çözülebilmesi, sayının asal çarpanlarına ayrılmasıyla mümkün olabilmektedir ki gizli anahtara sahip olunmadığı durumda bu işlem oldukça güçtür.
Meraklısı İçin Basit Bir RSA Örneği
Yazımızın bu noktasında benim gibi kriptografiyle fazla ilgilenmeyen ancak RSA'nın çalışmasını biraz daha iyi anlamak isteyenler için sürecin nasıl işlediğine dair basit bir örnek yapmaya çalışacağım. Bu örneği inceleyip anahtar olarak gerçekten devasa büyüklükte sayılar kullanıldığında, gizli anahtarı bilmeden şifreyi kırmanın neden olağanüstü bir hesaplama gücü gerektirdiği daha iyi anlaşılabilir.
Şifrelemek istediğimiz metin ABC olsun diyelim. Öncelikle kendimize bir adet açık anahtar (public key) bir adet de bu açık anahtarla uyumlu gizli anahtar (private key) üretelim. İşe 2 adet asal sayı seçmekle başlıyoruz, bu sayılara p ve q diyelim. Bu sayıların çarpımı ise şifreleme işleminde çeşitli aşamalarda kullanacağımız maksimum değeri verecektir, buna da n diyelim. Örneğimizin basit olması için 7 ve 19 asal sayılarını seçtiğimizi varsayalım:
p = 7
q = 19
n = 7 x 19 = 133
şeklinde olacaktır. Şimdi kendimize ait açık anahtarı seçelim ve buna da e diyelim. Seçeceğimiz e açık anahtarı n değerinden küçük ve n'in bölenlerinden biri olmayan bir asal sayı olmalıdır. Örnek olarak e değeri için 133'ün bölenlerinden biri olan 19'u seçemeyiz. Hesaplama kolaylığı için e değerini 23 olarak seçelim, böylece açık anahtarımız e = 23 olmuş oldu.
Şimdi gizli anahtarımızı üretme aşamasına geçebiliriz. Bunun için Extended Euclidean algoritmasını kullanmamız gerekiyor. İşe önceki aşamada bulduğumuz n değerinin totient'ini hesaplamakla başlıyoruz. Bir tam sayının totient'i, kendisinden küçük ve aralarında asal olan sayıların adedi şeklinde ifade edilir. Örnek olarak 8 sayısının totient'i 4'dür ve bu 4 adet sayı 1, 3, 5 ve 7 şeklindedir.
133 değerinin totient'ini bulmak için ek bir özellikten faydalanacağız. Tıpkı bizim örneğimizdeki p ve q gibi iki asal sayının çarpımı şeklinde ifade edilen bir tam sayının totient değerini,
totient(n) = (p - 1) x (q - 1)
formülüyle kolayca bulabiliriz. Bu durumda totient(n) değerimiz (7 - 1) x (19 - 1) = 72 olacaktır.
Sonraki adımda e x mod totient(n) ifadesinin multiplicative inverse değerini bulmamız gerekiyor ki bu değer aynı zamanda bizim gizli anahtarımız olacaktır. Bu problemi bir başka şekilde şöyle de ifade edebiliriz:
(e x d - 1) mod totient(n) = 0
ifadesini sağlayan d değeri nedir?
Aşağıdaki gibi bir fonksiyonla d değerini yani gizli anahtarımızı hesaplayabiliriz:
int calculate_d (int e, int totient) {
int d = 1;
while (1) {
if (((e * d - 1) % totient) == 0) break;
d++;
}
return d;
}
Örneğimizde e değerimiz 23, totient ise 72 idi, yerlerine koyduğumuzda gizli anahtarımız olacak d değerini 47 olarak buluruz. Artık işlevsel bir RSA için tüm parametreleri biliyoruz. Şimdi açık anahtarımız olan e değeri ile ABC kelimesini şifreleyelim. Bunun için ABC kelimesinin her bir karakterinin ASCII değerlerini aşağıdaki formülle şifreleyeceğiz:
Şifreleyeceğimiz değer m ise, şifrelenmiş hali me mod n formülüne göre bulunacaktır. Örneğin A'nın ASCII değeri olan 65'in şifrelenmiş hali 6523 mod 133 = 88 şeklinde olacaktır.
Şifrelenmiş bir sayıdan geriye gitmek içinse gizli anahtarımızı kullanacağız. Örnek olarak 65 ASCII kodlu A'nın şifreli hali 88 çıkmıştı. Şifreleme amacıyla yukarıda kullandığımız formüldeki açık anahtar e yerine gizli anahtar olan d'yi kullandığımızda verinin orjinaline yani 65 değerine erişmeliyiz: 8847 mod 133 = 65 Bingo! Aynı değere eriştik. Kontrol etmek isteyenler için ilk 6 harfin açık anahtarımızla şifrelenmiş değerlerini aşağıdaki tabloda bulabilirsiniz:
A (65)
B (66)
C (67)
D (68)
E (69)
F (70)
88
54
79
45
27
14
Asal sayıyı kırmak ne demek?
Konuya uzak olanlar için bu sayı kırma terimi biraz komik geliyor olabilir. Dizilerden tanıdığımız hacker karakterleri genelde şatafatlı ekranlarda şapkaları başlarında, şifreyi bir çırpıda kırarken en fazla arka planda Matrix'den apartılmış kayan sayılardan oluşan hareketli bir video olurdu.
İşin şakası bir yana, öğrencilik zamanlarında bu logaritmadır, türevdir, sayı teorisidir vs. gerçek hayatta ne işimize yarayacak dediğimiz konular şu an tüm veri güvenliğinin tam ortasına oturmuş ve bir yerde internet ağının varlığının sürdürülmesini sağlamaktadırlar. Muhtemelen büyük devletler arasındaki asıl savaşlar görünenlerden ziyade artık bu alanlara kaymış durumdadır ve gün geçtikçe de önemi artmaya devam etmektedir.
Asal sayının kırılması sürecinde bir ayrık logaritma problemi ile karşı karşıyayız: elinizde sadece açık anahtar ve bu anahtar ile şifrelenmiş veri varsa, buradan gizli anahtarı hesaplamız çok güçtür. Matematiksel ifadesiyle elimizde sadece g, p, ga mod(p) ve gb mod(p) değerleri var ise, g(a*b) mod(p) değerini hesaplamak çok zordur ve işlemi hızlıca yapmamıza olanak verecek hiç bir kısayol bulunamamıştır. Dolayısıyla yapılabilecek yegane işlem, tek tek bu hesaplamaları yapmaktır.
Kullanılan açık ve gizli anahtarlar o kadar büyük sayılardır ki, tek birini ifade edebilmek için bile bu yazıda bir paragraf dolusu rakam kullanmamız gerekecektir. Dolayısıyla bu boyutlardaki sayıları asal çarpanlarına ayırmak çok zordur. Ek olarak bulunan asal çarpan doğrudan gizli anahtarı vermeyecektir. Formüllerde yer alan mod alma işlemi nedeniyle, gizli anahtarı belirlemekte ek bir güçlük de söz konusudur.
Madem her şey imkansız derecede zor, makalede farklı ne var?
Yazımızda sürekli sürecin zorluklarından bahsettik. Diğer taraftan da NSA'nın büyük olasılıkla açık/gizli anahtar şifrelemesini bir yere kadar kırabildiğini ifade ettik. İşte yayınlanan makale tam bu noktada şifrenin kırılmasının nasıl mümkün olabileceğine dair bizlere bazı ipuçları sunuyor.
Öncelikle şunu belirtmek gerekiyor ki, gizli anahtarı hesaplamaya yönelik bir formül bulunmuş değil. Süreci hızlandırmanın tek yolu, belirli bir kümedeki (512 bit, 756 bit, 1024 bit, vb.) tam sayıların tümünü önceden asal çarpanlarına ayırıp bunu bir veritabanında saklamak ve şifre kırma sürecinde bu sayılardan biri ile karşılaşıldığında asal çarpanlarına ayırmakla uğraşmayıp, veritabanındaki önceden hesaplanmış değerlerle test etmektir.
SSL/TLS Freak Atak
Makalede öncelikle ilk defa Mart 2015'de farkedilen ve Freak Attack [3] olarak isimlendirilen güvenlik zaafiyetinden nasıl faydalanılabileceği üzerinde durulmuş. Bu yöntemi anlamak için hızlıca bir geçmişe gitmek gerekiyor. SSL teknolojisi 1990'ların başlarında Netscape firması tarafından ilk duyurulduğunda Amerikan Hükümeti tarafından kriptografik yöntemler içeren yazılımların ABD dışına ihracıyla ilgili yaptırımlarla karşılaştı. Bu sebeple Netscape tarayıcısı ABD içerisinde 1024 bit açık anahtar / 128 bit gizli anahtar kullanabilirken, ABD dışındaki versiyonlarında maksimum 512 bit açık anahtar ve 40 bit'lik gizli anahtar kullanabiliyordu. (Internet Explorer kullanıcıları 40bit sertifika zamanlarını veya eski Debian kullanıcıları bir zamanlar non-us.debian.org şeklinde ayrı bir arşiv olduğunu hatırlayacaktır). 512/40 bitlik anahtar limitinin arkasında yatan neden tahmin edeceğiniz üzere, ABD dışındaki tüm şifrelenmiş trafiğin bu şekilde kırılabilmesine imkan tanımaktı ve mevcut teknolojilerle bu uzunluktaki anahtarlarla yapılan şifrelemeleri kırmak mümkündü.
Anahtar uzunluğunun 512 bit'ten 1024'e çıkması işi 2 kat değil, yüzbinlerce kat daha fazla zorlaştırmaktadır. Web sunucu ve web tarayıcı yazılımları arasında farklı uzunluktaki anahtar ikilileri ile çalışabilmeyi mümkün kılmak için oturumun kurulumu sırasında Diffie-Hellman anahtar değişimi sürecinde, web tarayıcı ve web sunucunun karşılıklı olarak kullanabilecekleri anahtar uzunluklarında anlaşmasına yönelik yöntemler geliştirildi. Böylelikle bir web sunucu aynı anda 1024 bit'lik ve 512 bit'lik açık anahtarı ile 2 farklı istemciyle konuşabilmekteydi.
Yıllar içerisinde ABD'deki ihraç yasağı değişti (Bu konuda D.J.Bernstein özelinde ayrı bir yazı hazırlayacağım) ve 40 bit'lik gizli anahtar kullanımı mecburiyeti ortadan kalktı. Fakat sunucular halen daha istemci (tarayıcı) tarafından talep edilmesi halinde 512/40 bit anahtar kullanımını büyük oranda desteklemektedir.
Gününümüzdeki internet tarayıcı yazılımları sunucuyla güvenli iletişimi başlatırken 40 bit'lik gizli anahtar kullanımını tercih etmediğinden teorik olarak bu şekilde düşük güvenlikli bir oturum kurulamıyor olması gerekir. Ancak pratikte geçen Mart ayında görüldü ki, SSL/TLS kütüphanelerindeki bazı hatalar nedeniyle, web tarayıcısı daha yüksek şifreleme anahtar uzunlukları talep etse dahi, trafiğin arasına giren zararlı bir yazılım tarafından dönülecek yanıtla 512/40 bitlik anahtar kullanımını zorlamak mümkün olmaktadır. Hata farkedildiğinde aralarında Apple'ın Secure Transport ve Facebook'un connect.facebook.com gibi pek çok önemli servislerinin de bu durumdan etkilenmekte olduğu görüldü.
Her ne kadar tarayıcı ile sunucu arasına giren bir sistemle, FREAK atak yöntemiyle iletişim 512/40 bit anahtarlarına zorlansa da, seçilen anahtarın kısa sürede çarpanlarına ayrılması ve gizli anahtarın elde edilmesi gereklidir. Bu anahtar uzunluklarını kırmak günümüzde mümkün olmakla birlikte, bir kaç saniye sürecek kısa süreli bir iletişimde o kadar kolay da değildir. Bu noktada saldırganların imdadına sunucularda kullanılan yazılım implementasyonları yetişmiştir. Anahtarları üretmek de görece zaman maliyetli bir operasyon olduğundan performans optimizasyonu amacıyla örnek olarak Apache/mod-ssl sunucuları servis ayağa kalkarken bir defa anahtar üretmekte, daha sonra servis ayakta kaldığı müddetçe bağlanan tüm istemcilerle aynı anahtarı kullanarak iletişim kurmaktadır.
Bu da bir defa ilgili sunucunun anahtarı kırıldığında, sunucu tarafında servis yeniden başlatılmadığı sürece geçen tüm trafiğin rahatlıkla izlenebileceği anlamına gelmektedir.
Çıkarılan yamalara rağmen günümüz internetinin halen %12'lik bir kesiminin bu saldırıdan etkilendiği düşünülmektedir.
Sunucuların aynı asal sayıyı kullanması problemi
Makalede üzerinde durulan diğer önemli nokta, HTTPS/SSH/VPN sunucularında Diffie-Hellman anahtar değiş-tokuşu sürecinde sunucu tarafında genellikle hep aynı asal sayının kullanılıyor olmasıdır. Öyle ki bazı yazılımlarda bu değer hard-coded olarak yazılım içerisinde tanımlı iken, bir kısmında her servis açılışında veya belirli periyotlarda yenilenmekte, neredeyse hiç birinde her bir oturum için yeni anahtar üretimi yapılmamaktadır.
Makalede akademik imkanlarla kurulabilecek bir dağıtık mimaride (4000+ çekirdek sayısı) 768 bit uzunluğundaki anahtarların kırılabileceği gösterilmektedir. Olayı akademik seviyeden ulusal seviyeye çıkardığımızda yapılabilecek ek yatırımlarla öncelikle Diffie-Hellman anahtar değişimi aşamasında tüm hard-coded asal sayı kullanılan senaryolar için kullanılabilecek çözümleme kümesinin oluşturulabileceği gösterilmiştir. Ek olarak kullanılan anahtar uzunluklarına göre inceleme yapıldığında mevcut HTTPS trafiğinin %18'i, mevcut SSH trafiğinin %26'sı ve mevcut VPN trafiklerinin %66'sının kırılabileceği belirlenmiştir.
Çözüm nedir?
En kısa çözüm, minimum 2048 bitlik anahtar kullanımına geçmektir. Kuantum bilgisayarlar gerçek olmadığı müddetçe bu boyuttaki bir anahtarın en özel şartlarda dahi kırılabilmesi mümkün görünmüyor.
Madem öyle neden 2048 ile sınırlı kalalım, 4096 bitlik hatta işi abartıp 64K'lık devasa anahtarlar kullansak daha iyi olmaz mı? diye de düşünebilirsiniz. Fakat 64K'lık bir anahtarın sadece hesaplanmasının dahi iyi bir sunucuda 5 saatten fazla zaman aldığını da bu hesaba eklemeniz gerekir. 1024'ten bitten 2048'e bite geçiş de minimum 5 katı kadar ek sunucu yükü getirmektedir. Bu nedenle gereksiz bir işlem yaparak sunucuları normalde karşılayabileceklerinden çok daha az istek karşılar duruma düşürmek de iyi bir fikir olarak görünmemektedir.
Hem performanstan ödün vermeyip hem de çok daha güvenli bir iletişim sağlamanın yolu ise Elliptic Curve Cryptography ve ECDSA algoritmasından geçmektedir. Ancak bu konuyu ayrı bir yazıda ayrıntılarıyla ele almayı planlıyorum.
NSA 1024 bit anahtarların tümünü kırmış olabilir mi?
NSA'nın 2013 bütçesinin 10 milyar$ olduğu ve bunun %10'unun özellikle 35.000 çalışanla bu gibi kriptografi problemlerine atak edilerek şifreli ağ trafiğinin çözülmesine harcandığı Snowden'in belgelerinde geçmekteydi. Yapılan kaba bir hesapla, 1024 bitlik anahtarlar için 300 milyon$ civarında maliyetlerle kurulabilecek bir süperbilgisayar sayesinde bu boyuttaki asal sayıları kırmanın mümkün olabileceği anlaşılıyor.
NSA için bütçe pek de sorun olmadığına göre, günümüz teknolojileri ile servislerdeki zayıflıkları kullanarak sadece belirli anahtarları değil, 1024 bit uzayındaki tüm asal sayıları kırmış ve çözüm tablosunu hesaplamış olabilirler mi?
Muhtemelen hayır! Zira bu şekilde yaklaşık 21023/ln(2) = 1.297 * 10308 adet asal sayı bulunmaktadır. 1024 bite kadar olan bu sayıların her birini saklamak için 128 byte'lık alana ihtiyacımız bulunuyor. Dolayısıyla burada elde ettiğimiz adedi bir de 128 ile çarptığımızda, toplamda 1.66 x 10310 Byte toplam saklama kapasitesi ihtiyacı ortaya çıkıyor. Neyse ki böyle bir saklama ve saklanan veriye de erişim kapasitesi NSA için bile olası değil!
Bitirirken
Güvenlik ve kriptografi konusu daha çok su kaldırır. Burada amacımız belli sorunlara ve konunun önemine dikkat çekmekten ibaret. Matematiğin ve özellikle sayı teorisinin güvenlik için herşeyden daha önemli olduğu bir çağa girmiş bulunuyoruz. Kuantum bilgisayarlar bir gün teoriden pratiğe dönüşecek olursa o günden sonra artık bambaşka şeyler konuşulacak ve güvenlik konusu apayrı bir mecrada ele alınmaya başlayacaktır. Bugünün fotoğrafında ise, teknolojisi ve akademik birikimi yüksek olanlar lehine orantısız bir fark bulunuyor.
HTTPS / SSH Trafiğinizi NSA Nasıl Dinleyebiliyor?
İnternet ağında biri gizli diğeri açık olmak üzere ikili anahtar sistemini kullanan protokoller üzerinden (https, ssh, vpn çözümleri vb.) iletişim kurduğumuzda güvende olduğumuzu düşünüyoruz. İki bilgisayar sistemi arasında bu şekilde gerçekleştirilmiş olan bağlantıdaki veriler üçüncü bir sistem tarafından gözlemlenebilir ancak görülebilenler tümüyle şifreli olacaktır. Bu şifreyi çözmek ise güncel teknolojiyle yüzyıllar mertebesinde süre almaktadır. Dolayısıyla iletişimin güvenli olduğunu söyleyebiliriz. Bu temel varsayım üzerinde sadece kişisel bilgilerimiz, eposta arşivimiz değil e-ticaret ve ödeme sistemleri de dahil olmak üzere pek çok operasyon güvenli biçimde çalışmasını sürdürmektedir. Peki gerçekten de bu kadar güvende miyiz? Örneğin NSA gibi kuruluşların bu trafiği izlemesi mümkün müdür?
2012 yılında Wired'da çıkan bir yazıda ismini vermek istemeyen bir NSA çalışanının ifadelerini doğru kabul edecek olursak [1], NSA'nın halihazırda şifrelenmiş trafiği çözebilme yeteneği olduğuna dair önemli ipuçlarına ulaşıyoruz. Aynı yazıda NSA'nın şifrelenmiş trafiğin çözülebilmesi konusunda ne büyüklükte yatırımlar yaptığını da görebiliyoruz. Bunlara ek olarak Edward Snowden'in NSA'nın şifreli VPN trafikleri ile HTTPS trafiğinin önemli bir kısmını çözebildiğine dair yorumlarını da dikkate almamız gerekiyor.
Hemen herkes Amerika'nın (yani Ulusal Güvenlik Ajansı olan NSA'nın) bu trafiği dinleyebiliyor olacağını tahmin etse de esasında bu işin matematiksel zorluklarını bilenler için söylenti ve tahminlerden ötede bir noktaya varılamıyordu. Ek olarak pek çok devletin HTTPS trafiğini dinleyebilmek için onca çaba sarfetmesine rağmen başarıya ulaşamadığını da en azından bir kısmımız biliyoruz.
Fakat 2015 Ekim ayında olaya dair bakışımızı değiştirecek ve söylentileri yerli yerine oturtacak bir gelişme yaşandı. Michigan Üniversitesi'nden J. Alex Halderman ve Pennsylvania Üniversitesi'nden Nadia Heninger, kendilerine aynı zamanda CCS 2015 en iyi makale ödülünü de getiren şu makaleyi yayınladılar: Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice [2]
Şifreleme Algoritmaları Hakkında
Makaleyi değerlendirmeye geçmeden önce sürece kısaca değinmekte yarar var. Şifrelemenin tarihçesi çok eskilere dayanmakla birlikte, en önemli dönüm noktalarından biri 1977 yılında yaşanmıştır. Bu yılda hem RSA Algoritması hem de Diffie-Hellman anahtar değişimi algoritmaları duyurulmuştur.
RSA Algoritması özetle çok büyük tam sayıları çarpanlarına ayırma işleminin algoritmik zorluğu esasına dayanılarak geliştirilmiş bir açık anahtar sistemidir. Matematiksel doğruluk ispatı isa Fermatın küçük teoremi ile (17. yüzyıl) sağlanabilmektedir. RSA dahil olmak üzere tüm açık anahtar tabanlı sistemlerde, gönderilecek mesaj alıcının herkese açık anahtarı ile şifrelenir ve bu mesaj sadece alıcının kendisinin bildiği özel anahtarla açılabilir. Temel amaç, şifreleme sürecinin kolay, şifreyi çözmenin ise gizli anahtar bilinmeksizin çok zor olmasını sağlamaktır. RSA örneğimizde şifrelemeyi yaparken büyük asal sayıların çarpımı gerçekleştirilirken şifrenin çözülebilmesi, sayının asal çarpanlarına ayrılmasıyla mümkün olabilmektedir ki gizli anahtara sahip olunmadığı durumda bu işlem oldukça güçtür.
Meraklısı İçin Basit Bir RSA Örneği
Yazımızın bu noktasında benim gibi kriptografiyle fazla ilgilenmeyen ancak RSA'nın çalışmasını biraz daha iyi anlamak isteyenler için sürecin nasıl işlediğine dair basit bir örnek yapmaya çalışacağım. Bu örneği inceleyip anahtar olarak gerçekten devasa büyüklükte sayılar kullanıldığında, gizli anahtarı bilmeden şifreyi kırmanın neden olağanüstü bir hesaplama gücü gerektirdiği daha iyi anlaşılabilir.
Şifrelemek istediğimiz metin ABC olsun diyelim. Öncelikle kendimize bir adet açık anahtar (public key) bir adet de bu açık anahtarla uyumlu gizli anahtar (private key) üretelim. İşe 2 adet asal sayı seçmekle başlıyoruz, bu sayılara p ve q diyelim. Bu sayıların çarpımı ise şifreleme işleminde çeşitli aşamalarda kullanacağımız maksimum değeri verecektir, buna da n diyelim. Örneğimizin basit olması için 7 ve 19 asal sayılarını seçtiğimizi varsayalım:
şeklinde olacaktır. Şimdi kendimize ait açık anahtarı seçelim ve buna da e diyelim. Seçeceğimiz e açık anahtarı n değerinden küçük ve n'in bölenlerinden biri olmayan bir asal sayı olmalıdır. Örnek olarak e değeri için 133'ün bölenlerinden biri olan 19'u seçemeyiz. Hesaplama kolaylığı için e değerini 23 olarak seçelim, böylece açık anahtarımız e = 23 olmuş oldu.
Şimdi gizli anahtarımızı üretme aşamasına geçebiliriz. Bunun için Extended Euclidean algoritmasını kullanmamız gerekiyor. İşe önceki aşamada bulduğumuz n değerinin totient'ini hesaplamakla başlıyoruz. Bir tam sayının totient'i, kendisinden küçük ve aralarında asal olan sayıların adedi şeklinde ifade edilir. Örnek olarak 8 sayısının totient'i 4'dür ve bu 4 adet sayı 1, 3, 5 ve 7 şeklindedir.
133 değerinin totient'ini bulmak için ek bir özellikten faydalanacağız. Tıpkı bizim örneğimizdeki p ve q gibi iki asal sayının çarpımı şeklinde ifade edilen bir tam sayının totient değerini,
formülüyle kolayca bulabiliriz. Bu durumda totient(n) değerimiz (7 - 1) x (19 - 1) = 72 olacaktır.
Sonraki adımda e x mod totient(n) ifadesinin multiplicative inverse değerini bulmamız gerekiyor ki bu değer aynı zamanda bizim gizli anahtarımız olacaktır. Bu problemi bir başka şekilde şöyle de ifade edebiliriz:
ifadesini sağlayan d değeri nedir?
Aşağıdaki gibi bir fonksiyonla d değerini yani gizli anahtarımızı hesaplayabiliriz:
Örneğimizde e değerimiz 23, totient ise 72 idi, yerlerine koyduğumuzda gizli anahtarımız olacak d değerini 47 olarak buluruz. Artık işlevsel bir RSA için tüm parametreleri biliyoruz. Şimdi açık anahtarımız olan e değeri ile ABC kelimesini şifreleyelim. Bunun için ABC kelimesinin her bir karakterinin ASCII değerlerini aşağıdaki formülle şifreleyeceğiz:
Şifreleyeceğimiz değer m ise, şifrelenmiş hali
me mod n
formülüne göre bulunacaktır. Örneğin A'nın ASCII değeri olan 65'in şifrelenmiş hali6523 mod 133 = 88
şeklinde olacaktır.Şifrelenmiş bir sayıdan geriye gitmek içinse gizli anahtarımızı kullanacağız. Örnek olarak 65 ASCII kodlu A'nın şifreli hali 88 çıkmıştı. Şifreleme amacıyla yukarıda kullandığımız formüldeki açık anahtar e yerine gizli anahtar olan d'yi kullandığımızda verinin orjinaline yani 65 değerine erişmeliyiz:
8847 mod 133 = 65
Bingo! Aynı değere eriştik. Kontrol etmek isteyenler için ilk 6 harfin açık anahtarımızla şifrelenmiş değerlerini aşağıdaki tabloda bulabilirsiniz:Asal sayıyı kırmak ne demek?
Konuya uzak olanlar için bu sayı kırma terimi biraz komik geliyor olabilir. Dizilerden tanıdığımız hacker karakterleri genelde şatafatlı ekranlarda şapkaları başlarında, şifreyi bir çırpıda kırarken en fazla arka planda Matrix'den apartılmış kayan sayılardan oluşan hareketli bir video olurdu.
İşin şakası bir yana, öğrencilik zamanlarında bu logaritmadır, türevdir, sayı teorisidir vs. gerçek hayatta ne işimize yarayacak dediğimiz konular şu an tüm veri güvenliğinin tam ortasına oturmuş ve bir yerde internet ağının varlığının sürdürülmesini sağlamaktadırlar. Muhtemelen büyük devletler arasındaki asıl savaşlar görünenlerden ziyade artık bu alanlara kaymış durumdadır ve gün geçtikçe de önemi artmaya devam etmektedir.
Asal sayının kırılması sürecinde bir ayrık logaritma problemi ile karşı karşıyayız: elinizde sadece açık anahtar ve bu anahtar ile şifrelenmiş veri varsa, buradan gizli anahtarı hesaplamız çok güçtür. Matematiksel ifadesiyle elimizde sadece g, p, ga mod(p) ve gb mod(p) değerleri var ise, g(a*b) mod(p) değerini hesaplamak çok zordur ve işlemi hızlıca yapmamıza olanak verecek hiç bir kısayol bulunamamıştır. Dolayısıyla yapılabilecek yegane işlem, tek tek bu hesaplamaları yapmaktır.
Kullanılan açık ve gizli anahtarlar o kadar büyük sayılardır ki, tek birini ifade edebilmek için bile bu yazıda bir paragraf dolusu rakam kullanmamız gerekecektir. Dolayısıyla bu boyutlardaki sayıları asal çarpanlarına ayırmak çok zordur. Ek olarak bulunan asal çarpan doğrudan gizli anahtarı vermeyecektir. Formüllerde yer alan mod alma işlemi nedeniyle, gizli anahtarı belirlemekte ek bir güçlük de söz konusudur.
Madem her şey imkansız derecede zor, makalede farklı ne var?
Yazımızda sürekli sürecin zorluklarından bahsettik. Diğer taraftan da NSA'nın büyük olasılıkla açık/gizli anahtar şifrelemesini bir yere kadar kırabildiğini ifade ettik. İşte yayınlanan makale tam bu noktada şifrenin kırılmasının nasıl mümkün olabileceğine dair bizlere bazı ipuçları sunuyor.
Öncelikle şunu belirtmek gerekiyor ki, gizli anahtarı hesaplamaya yönelik bir formül bulunmuş değil. Süreci hızlandırmanın tek yolu, belirli bir kümedeki (512 bit, 756 bit, 1024 bit, vb.) tam sayıların tümünü önceden asal çarpanlarına ayırıp bunu bir veritabanında saklamak ve şifre kırma sürecinde bu sayılardan biri ile karşılaşıldığında asal çarpanlarına ayırmakla uğraşmayıp, veritabanındaki önceden hesaplanmış değerlerle test etmektir.
SSL/TLS Freak Atak
Makalede öncelikle ilk defa Mart 2015'de farkedilen ve Freak Attack [3] olarak isimlendirilen güvenlik zaafiyetinden nasıl faydalanılabileceği üzerinde durulmuş. Bu yöntemi anlamak için hızlıca bir geçmişe gitmek gerekiyor. SSL teknolojisi 1990'ların başlarında Netscape firması tarafından ilk duyurulduğunda Amerikan Hükümeti tarafından kriptografik yöntemler içeren yazılımların ABD dışına ihracıyla ilgili yaptırımlarla karşılaştı. Bu sebeple Netscape tarayıcısı ABD içerisinde 1024 bit açık anahtar / 128 bit gizli anahtar kullanabilirken, ABD dışındaki versiyonlarında maksimum 512 bit açık anahtar ve 40 bit'lik gizli anahtar kullanabiliyordu. (Internet Explorer kullanıcıları 40bit sertifika zamanlarını veya eski Debian kullanıcıları bir zamanlar non-us.debian.org şeklinde ayrı bir arşiv olduğunu hatırlayacaktır). 512/40 bitlik anahtar limitinin arkasında yatan neden tahmin edeceğiniz üzere, ABD dışındaki tüm şifrelenmiş trafiğin bu şekilde kırılabilmesine imkan tanımaktı ve mevcut teknolojilerle bu uzunluktaki anahtarlarla yapılan şifrelemeleri kırmak mümkündü.
Anahtar uzunluğunun 512 bit'ten 1024'e çıkması işi 2 kat değil, yüzbinlerce kat daha fazla zorlaştırmaktadır. Web sunucu ve web tarayıcı yazılımları arasında farklı uzunluktaki anahtar ikilileri ile çalışabilmeyi mümkün kılmak için oturumun kurulumu sırasında Diffie-Hellman anahtar değişimi sürecinde, web tarayıcı ve web sunucunun karşılıklı olarak kullanabilecekleri anahtar uzunluklarında anlaşmasına yönelik yöntemler geliştirildi. Böylelikle bir web sunucu aynı anda 1024 bit'lik ve 512 bit'lik açık anahtarı ile 2 farklı istemciyle konuşabilmekteydi.
Yıllar içerisinde ABD'deki ihraç yasağı değişti (Bu konuda D.J.Bernstein özelinde ayrı bir yazı hazırlayacağım) ve 40 bit'lik gizli anahtar kullanımı mecburiyeti ortadan kalktı. Fakat sunucular halen daha istemci (tarayıcı) tarafından talep edilmesi halinde 512/40 bit anahtar kullanımını büyük oranda desteklemektedir.
Gününümüzdeki internet tarayıcı yazılımları sunucuyla güvenli iletişimi başlatırken 40 bit'lik gizli anahtar kullanımını tercih etmediğinden teorik olarak bu şekilde düşük güvenlikli bir oturum kurulamıyor olması gerekir. Ancak pratikte geçen Mart ayında görüldü ki, SSL/TLS kütüphanelerindeki bazı hatalar nedeniyle, web tarayıcısı daha yüksek şifreleme anahtar uzunlukları talep etse dahi, trafiğin arasına giren zararlı bir yazılım tarafından dönülecek yanıtla 512/40 bitlik anahtar kullanımını zorlamak mümkün olmaktadır. Hata farkedildiğinde aralarında Apple'ın Secure Transport ve Facebook'un connect.facebook.com gibi pek çok önemli servislerinin de bu durumdan etkilenmekte olduğu görüldü.
Her ne kadar tarayıcı ile sunucu arasına giren bir sistemle, FREAK atak yöntemiyle iletişim 512/40 bit anahtarlarına zorlansa da, seçilen anahtarın kısa sürede çarpanlarına ayrılması ve gizli anahtarın elde edilmesi gereklidir. Bu anahtar uzunluklarını kırmak günümüzde mümkün olmakla birlikte, bir kaç saniye sürecek kısa süreli bir iletişimde o kadar kolay da değildir. Bu noktada saldırganların imdadına sunucularda kullanılan yazılım implementasyonları yetişmiştir. Anahtarları üretmek de görece zaman maliyetli bir operasyon olduğundan performans optimizasyonu amacıyla örnek olarak Apache/mod-ssl sunucuları servis ayağa kalkarken bir defa anahtar üretmekte, daha sonra servis ayakta kaldığı müddetçe bağlanan tüm istemcilerle aynı anahtarı kullanarak iletişim kurmaktadır.
Bu da bir defa ilgili sunucunun anahtarı kırıldığında, sunucu tarafında servis yeniden başlatılmadığı sürece geçen tüm trafiğin rahatlıkla izlenebileceği anlamına gelmektedir.
Çıkarılan yamalara rağmen günümüz internetinin halen %12'lik bir kesiminin bu saldırıdan etkilendiği düşünülmektedir.
Sunucuların aynı asal sayıyı kullanması problemi
Makalede üzerinde durulan diğer önemli nokta, HTTPS/SSH/VPN sunucularında Diffie-Hellman anahtar değiş-tokuşu sürecinde sunucu tarafında genellikle hep aynı asal sayının kullanılıyor olmasıdır. Öyle ki bazı yazılımlarda bu değer hard-coded olarak yazılım içerisinde tanımlı iken, bir kısmında her servis açılışında veya belirli periyotlarda yenilenmekte, neredeyse hiç birinde her bir oturum için yeni anahtar üretimi yapılmamaktadır.
Makalede akademik imkanlarla kurulabilecek bir dağıtık mimaride (4000+ çekirdek sayısı) 768 bit uzunluğundaki anahtarların kırılabileceği gösterilmektedir. Olayı akademik seviyeden ulusal seviyeye çıkardığımızda yapılabilecek ek yatırımlarla öncelikle Diffie-Hellman anahtar değişimi aşamasında tüm hard-coded asal sayı kullanılan senaryolar için kullanılabilecek çözümleme kümesinin oluşturulabileceği gösterilmiştir. Ek olarak kullanılan anahtar uzunluklarına göre inceleme yapıldığında mevcut HTTPS trafiğinin %18'i, mevcut SSH trafiğinin %26'sı ve mevcut VPN trafiklerinin %66'sının kırılabileceği belirlenmiştir.
Çözüm nedir?
En kısa çözüm, minimum 2048 bitlik anahtar kullanımına geçmektir. Kuantum bilgisayarlar gerçek olmadığı müddetçe bu boyuttaki bir anahtarın en özel şartlarda dahi kırılabilmesi mümkün görünmüyor.
Madem öyle neden 2048 ile sınırlı kalalım, 4096 bitlik hatta işi abartıp 64K'lık devasa anahtarlar kullansak daha iyi olmaz mı? diye de düşünebilirsiniz. Fakat 64K'lık bir anahtarın sadece hesaplanmasının dahi iyi bir sunucuda 5 saatten fazla zaman aldığını da bu hesaba eklemeniz gerekir. 1024'ten bitten 2048'e bite geçiş de minimum 5 katı kadar ek sunucu yükü getirmektedir. Bu nedenle gereksiz bir işlem yaparak sunucuları normalde karşılayabileceklerinden çok daha az istek karşılar duruma düşürmek de iyi bir fikir olarak görünmemektedir.
Hem performanstan ödün vermeyip hem de çok daha güvenli bir iletişim sağlamanın yolu ise Elliptic Curve Cryptography ve ECDSA algoritmasından geçmektedir. Ancak bu konuyu ayrı bir yazıda ayrıntılarıyla ele almayı planlıyorum.
NSA 1024 bit anahtarların tümünü kırmış olabilir mi?
NSA'nın 2013 bütçesinin 10 milyar$ olduğu ve bunun %10'unun özellikle 35.000 çalışanla bu gibi kriptografi problemlerine atak edilerek şifreli ağ trafiğinin çözülmesine harcandığı Snowden'in belgelerinde geçmekteydi. Yapılan kaba bir hesapla, 1024 bitlik anahtarlar için 300 milyon$ civarında maliyetlerle kurulabilecek bir süperbilgisayar sayesinde bu boyuttaki asal sayıları kırmanın mümkün olabileceği anlaşılıyor.
NSA için bütçe pek de sorun olmadığına göre, günümüz teknolojileri ile servislerdeki zayıflıkları kullanarak sadece belirli anahtarları değil, 1024 bit uzayındaki tüm asal sayıları kırmış ve çözüm tablosunu hesaplamış olabilirler mi?
Muhtemelen hayır! Zira bu şekilde yaklaşık 21023/ln(2) = 1.297 * 10308 adet asal sayı bulunmaktadır. 1024 bite kadar olan bu sayıların her birini saklamak için 128 byte'lık alana ihtiyacımız bulunuyor. Dolayısıyla burada elde ettiğimiz adedi bir de 128 ile çarptığımızda, toplamda 1.66 x 10310 Byte toplam saklama kapasitesi ihtiyacı ortaya çıkıyor. Neyse ki böyle bir saklama ve saklanan veriye de erişim kapasitesi NSA için bile olası değil!
Bitirirken
Güvenlik ve kriptografi konusu daha çok su kaldırır. Burada amacımız belli sorunlara ve konunun önemine dikkat çekmekten ibaret. Matematiğin ve özellikle sayı teorisinin güvenlik için herşeyden daha önemli olduğu bir çağa girmiş bulunuyoruz. Kuantum bilgisayarlar bir gün teoriden pratiğe dönüşecek olursa o günden sonra artık bambaşka şeyler konuşulacak ve güvenlik konusu apayrı bir mecrada ele alınmaya başlayacaktır. Bugünün fotoğrafında ise, teknolojisi ve akademik birikimi yüksek olanlar lehine orantısız bir fark bulunuyor.
Kaynaklar
[1] : http://www.wired.com/2012/03/ff_nsadatacenter
[2] : https://weakdh.org/imperfect-forward-secrecy-ccs15.pdf
[3] : https://freakattack.com