PGP İle Şifreleme Uygulamaları
Mahremiyet, elektronik çağda açık bir toplum için gereklidir.
Devletlerin, şirketlerin veya diğer kuruluşların bize kendi çıkarları dışında mahremiyet vermelerini bekleyemeyiz. Eğer mahremiyet sahibi olmayı bekliyorsak kendi mahremiyetimizi savunmalıyız.Bir Şifrepunk’un Manifestosu, Eric Hughes, 1993
Bu yazı içerisinde PGP şifreleme yazılımı ile şifreli mesaj/dosya alıp gönderebilmeye, metin ve uygulamaları imzalamaya ve doğrulamaya dair pratik uygulamalar yapacağım. Hızlı ve kolay bir şekilde şifreleme tekniklerini kullanmaya odaklanacağım için şifreleme algoritmalarına ve PGP’nin detaylarına çok girmeden kısa bir şekilde özetleyeceğim.
PGP’nin açılımı “Pretty Good Privacy” yani “Oldukça İyi Mahremiyet” dir. Veri şifreleme ve imzalama için kullanılan bir yazılımdır.
Geleneksel şifrelemede, düz bir metni şifreleyerek okunmaz hale getirmek için bir gizli anahtar kullanılır. Aynı anahtar şifreli mesajı deşifre etmek için de kullanılır. Bu yöntemin önemli bir dezavantajı şifrelemek için kullanılan anahtarı alıcıya güvenli bir şekilde ulaştırmaktır. Şifrelemek ve de-şifrelemek için aynı anahtar kullanıldığı için bu yönteme simetrik şifreleme de denir.
PGP ise kendi içerisinde “açık anahtar şifrelemeyi” kullanır. Veriyi şifrelemek için bir anahtar (açık anahtar), de-şifrelemek için ise ayrı bir anahtar (gizli anahtar) kullanılır. PGP ile bir veriyi şifreleyebilmek için bir çift açık-kapalı anahtar üretmelisiniz. İsminden de anlaşıldığı üzere ‘açık anahtarınızı’ başkaları ile paylaşırsınız. Diğerleri açık anahtarınızı kullanarak size şifreli metinler gönderebilir. Gizli olarak tuttuğunuz ‘gizli anahtar’ ile de size gönderilen mesajı de-şifreliyorsunuz. PGP’in kullandığı algoritma ile açık anahtarınızdan gizli anahtarınızın üretilmesi mümkün değildir.
Bu yazı ile amaçladığım, PGP ye ihtiyacınız olmadan önce PGP hakkında bilgi sahibi olmanız ve gerektiğinde referans olarak kullanabileceğiniz bir dokümana sahip olmanız.
Yazı içerisinde değineceğim bazı kullanım senaryoları;
— Şifreli olarak metin alış verişi. Sizin açık anahtarınızı bilen bir kişi, sadece sizin okuyabileceğiniz şifreli mesajlar gönderebilir. Gönderilen mesajlar 3. kişilerin eline geçse bile sizin gizli anahtarınızı ele geçirmediği müddetçe mesajın içeriğini göremez. Aynı şekilde siz de başkalarına, onların açık anahtarını kullanarak şifreli mesaj gönderebilirsiniz.
— Dijital imzalama. Açık anahtar şifreleme, herhangi bir veriyi taklit edilemez şekilde imzalamanıza olanak verir. İmzalamak istediğiniz veriyi (metin, yazılım, resim vs.) kendi gizli anahtarınız ile birleştirerek dijital imza oluşturursunuz. İmzanın orjinalliğini herhangi bir kişi sizin açık anahtarınız ile doğrulayabilir.
— İmzalanmış uygulamaların doğrulanması. Bitcoin Core uygulaması gibi güvenliğin önemli olduğu uygulamaları indirirken genellikle yanında geliştiricinin imzasını da olur. İndirdiğiniz uygulamanın doğru uygulama olduğundan, kaynak kodunda değişiklik yapılmadığından, indirme sırasında ağ üzerinde zararlı versiyonu ile değiştirilmediğinden emin olmak için geliştirici imzası ile indirilen dosya üzerinde doğrulama yapılır.
Aynı şekilde sizin uygulamalarınızı ve hatta Github commit’lerinizi de nasıl imzalayacağınıza değineceğim.
— Açık anahtarın ve parmak izinin paylaşılması. Başkalarının sizin açık anahtarınıza kolaylıkla erişebilmesi için açık anahtarınızı yayınlamalısınız. Bunun için kullanılan birden fazla web sitesi var. Aynı zamanda sosyal medya hesaplarınızda da nasıl efektif bir şekilde paylaşabileceğinize de değineceğim.
Uygulama
Açık ve gizli anahtarların üretilmesi, metin ve dosyaların şifrelenmesi/de-şifrelenmesi ve imzaların doğrulanması için online ve offline çeşitli araçlar var. Bazıları basit kurulumlarla kullanabileceğiniz yazılımlar bazıları da komut satırından çalıştırabildiğiniz araçlar.
Hızlı ve basit bir şekilde kullanabilmeniz için bu yazı içerisinde online olarak yayınladığım bir siteyi kullanacağım. https://farukterzioglu.github.io/pgp/
Başka bir Github projesini Türkçeleştirdiğim ve Github Sayfaları üzerinde yayınladığım uygulamanın kodlarını şurada görebilirsiniz.
https://github.com/farukterzioglu/pgp
Uygulamanın offline versiyonunu da şuradan indirebilirsiniz.
https://github.com/farukterzioglu/pgp/releases/tag/1.4.1
Tüm işlemlerinizi bu site üzerinden yapabileceğiniz gibi offline olarak indirdiğiniz .zip dosyasının içindeki ‘index.html’ dosyasından da yapabilirsiniz.
Dikkat etmeniz gereken konu, açık ve gizli anahtarlarını üreteceğiniz ve mesajınızı şifreleyeceğiniz için uygulamanın anahtarlarınızı veya mesajınızı saklamadığından veya 3. kişilere ulaştırmadığından emin olmalısınız. Benim Github sayfamdaki projeye ve yayınladığın siteye de güvenmemelisiniz.
Emin olmanın yollarından biri, uygulamayı indirdikten sonra internet bağlantısı olmadan kullanmak. Yalnız indirdiğiniz uygulamanın güvenilir olduğundan emin olmak için de kaynak kodlarını incelemelisiniz. Kaynak kodlarını inceleyemediğiniz durumda, indirdiğiniz uygulamanın güvenilir olduğundan emin olmanın bir yolu da güvendiğiniz bir geliştirici tarafından imzalanması ve indirdikten sonra da geliştiricinin açık anahtarı ile doğrulanması. PGP yazılımının önemli bir kullanım alanı da budur ve yazının ileriki kısımlarında bunun da örneğini yapacağım. Bu sayede ‘PGP Suite’ uygulamasını bilgisayarınıza indirip, ‘güvenilir yazılımcı’ olarak benim açık anahtarım ile imzalandığını kontrol edip kullanmaya başlayabilirsiniz. Yazının akışı için bu kısmı sona bırakacağım. Uygulamaların güvenliğini geliştirici imzaları ile doğrulamanın bir örneğini de Bitcoin Core uygulaması üzerinde yazının devamında anlatacağım.
Anahtarların Üretilmesi
Şifreleme ve de-şifreleme yapmak için ve şifrelenmiş mesajlar alabilmeniz için bir çift anahtar (açık ve gizli) üretmeliyiz. Bunun için yayınladığım web sitesine girelim. https://farukterzioglu.github.io/pgp/
Açılan sayfadaki bilgilerin doldurmamız gerekiyor.
- PGP anahtarları isim-soy isim ve mail ile ilişkilendirilir. Bu bilgiler açık anahtarın içinde de yer alır. De-şifreleme uygulamaları açık anahtarınız ile mailinizi ilişkilendirmek için bu bilgiyi kullanır.
- Daha sonrasında anahtarların üretileceği algoritmayı seçiyoruz. Bunun için RSA algoritmasını seçebiliriz.
- Anahtar boyutu olarak da test için 1024 bit seçebiliriz. Ne kadar büyük seçersek o kadar güvenli olur fakat anahtarların üretilmesi aynı oranda uzun sürer.
- Geçerlilik süresi ise, açık anahtarınızı ne süre boyunca kullanabileceğinizi belirtir. Bu süre sonunda şifreleme için anahtarınızı kullanamazsınız ve yeni anahtar üretmeniz gerekir.
- Parola, gizli anahtarını kullanmanız için gerekli olan şifredir. Gizli anahtarınızın çalınması durumunda ekstra bir koruma sağlar. Eğer unutursanız gizli anahtarınızı kullanmanız mümkün olmaz ve dolayısıyla size gönderilen şifreli mesajları de-şifre edemezsiniz.
“Anahtarları Üret” dediğimizde seçilen anahtar uzunluğuna ve bilgisayarın performansına göre bir süre sonra anahtarlarınız sağ tarafta kopyalamak ve kaydetmek üzere oluşacaktır. Daha sonra kullanmak üzere bilgisayarınız indirebilirsiniz.
İmzalama
Artık açık ve gizli anahtarınız olduğuna göre imzalama ve şifreleme işlemleri yapabiliriz.
Eğer bir metnin sizden geldiğini ispatlamak istiyorsanız, onu kendi gizli anahtarınız ile imzalamalısınız. İmzalanmış metni alan herhangi biri, sizin açık anahtarınız ile mesajın imzasını doğrulayabilir. Bu sayede mesajın sizden geldiğinden emin olabilir. Burada dikkat etmemiz gereken konu, herhangi biri mesajın içeriğini görebilir. İmzalamak için 2. sekme ‘İmzala’ yı açalım.
‘Gizli Anahtarınız’ kutusuna az önce ürettiğiniz anahtarı yapıştırın. ‘Mesajınız’ kısmına imzalamak istediğiniz mesajı yapıştırıyorsunuz. ‘Mesajı İmzala’ düğmesine tıkladıktan sonra aşağıdaki kutuda imzalanmış mesajınız oluşacaktır. Artık bu mesajı istediğiniz kişiye gönderebilir veya herhangi bir yerde yayınlayabilirsiniz.
Doğrulama
Sizden gelen bir mesajı herhangi bir kimsenin doğrulayabilmesi için sizin açık anahtarınızı bilmesi gerekmektedir. Diğerlerinin açık adresine nasıl ulaşabileceğimize dair yazının ileriki kısımlarında değineceğim. Az önce imzaladığımız mesajı doğrulamak için 3. sekme ‘Doğrulayı’ açalım. Buraya kendi açık anahtarınızı ve imzalanmış mesajı yapıştırarak doğrulayabiliriz.
Bu sayede sizin açık adresinizi bilen herhangi bir kimse aşağıdaki mesajı sizin yazdığınızdan emin olabilir.
Metin Şifreleme ve Açık Anahtar Paylaşımı
Bu kısımda başkalarına nasıl şifrelenmiş metin veya dosya gönderebileceğimizi anlatacağım. Şifreli mesaj göndermek istediğimiz birisinin açık adresini bilmemiz gerekiyor. Yukarıda bahsettiğim gibi bir mesajı o kimsenin açık anahtarı ile şifreliyoruz ve alıcı da kendi gizli anahtarı ile bu mesajı de-şifreliyor.
Başkalarının açık anahtarına erişmek için çeşitli yöntemler var. En basiti o kimseden istemek. Size daha önce gönderdiği bir e-postaya eklemiş olabilir, sitesinde veya sosyal medya hesaplarında belirtmiş olabilir.
Açık anahtar bulmanın yaygın bir yöntemi de “Açık Anahtar Sunucu” larında aramak. Bunun için bir kaç web sitesi vardır.
http://pgp.mit.edu/
http://pgp.surfnet.nl/
https://keybase.io/
Bu sitelerde açık anahtarını aradığınız kişinin isim veya e-posta adresi ile arama yapabilirsiniz. Benim e-posta adresim ile arandığında aşağıdaki sonuç çıkıyor.
Çıkan sonucu incelersek, açık anahtarımın (pub) 4096 bit anahtar uzunluğuna sahip olduğunu, anahtar id’sinin 0B073370 olduğunu görebiliriz. En önemli bilgilerden biri de anahtar parmak izidir (Fingerprint).
Açık anahtarlar oldukça uzun olduğu için metin olarak kontrol edilmesi zor oluyor. Bunun için parmak izinden yararlanıyor. Birisinin PGP anahtar iznini o kişiden sözlü olarak veya kartvizit olarak alabilir, sosyal medya hesaplarında görebilirsiniz.
Eğer yukarıdaki anahtar id’sine tıklarsanız açık anahtarımı görebilirsiniz;
Yaygın bir anahtar paylaşımı sitesi de https://keybase.io’dur. Bu sitede açık anahtarlarınızı paylaşabilir, sosyal medya hesaplarınızla ilişkilendirebilirsiniz. Aynı zamanda anahtarlar oluşturmak ve şifreleme işlemleri yapmak için bir yazılım da sunmakta.
Hesabımda görüldüğü üzere aynı parmak izine sahip açık anahtarıma anahtar id’sine tıklayarak ulaşabilirsiniz.
Bu gibi açık anahtar paylaşım siteleri çeşitli kurumların kontrolü altında, ve bu sitelere açık anahtar yüklemek için herhangi bir kontrol yapılmamakta. Yani birisi sizin adınıza/e-postanıza tanımlı bir anahtar oluşturup yüklemiş olabilir.
Bunun için bu sitelerden açık anahtar indirdiğinizde yapmanız gereken çok önemli bir kontrol, anahtar parmak izini alıcı kimseden doğrulamak. Yani benim açık anahtarımı bu sitelerden birinden indirdikten sonra benim yayınladığımdan emin olduğunuz bir anahtar parmak izi ile eşleşiyor mu diye kontrol edebilirsiniz. Benim anahtar parmak izimi sözlü olarak, kartvizit olarak, sosyal medya hesaplarımdan veya https ile yayınlamış bir web sitemden edinmelisiniz. Örnek olarak Twitter üzerinde yayınladığım parmak izimi alabilirsiniz.
Açık anahtarım;
http://pgp.mit.edu/pks/lookup?op=get&search=0xCA64F05A0B073370Açık anahtar parmak izim;
E32C 3986 CFBB 6CA2 10A2 894A CA64 F05A 0B07 3370
Artık alıcının (benim) açık anahtarıma sahip olduğumuza ve parmak izi ile de kontrol ettiğimize göre bana şifreli mesaj gönderebiliriz.
Şifreleme + İmzalama
Şifreli mesaj göndermek için PGP Suite uygulamasının 4. sekmesi ‘(İmzala+)Şifrele’ açalım. Burada “Alıcının açık anahtarı” kutusuna benim açık anahtarımı, daha sonra ‘Mesajınız’ kutusuna şifrelemek istediğiniz metni yazıp “Mesajı şifrele” düğmesine tıklayabilirsiniz. Bu sayede benim açık anahtarım ile şifrelenmiş ve sadece benim de-şifreleyebileceğim bir mesaj elde etmiş oluruz. Artık bana bu şifreli metni herhangi bir ortamdan güvenli bir şekilde, 3. kişilerin okuyamayacağından emin olarak gönderebilirsiniz.
Opsiyonel olarak eğer mesajın sizden geldiğinden emin olmak isteniyorsa şifrelerken bir de imzalayabilirsiniz. Şifreli mesajı artı olarak imzalamak için “İmzalayanın gizli anahtarı” kutusuna kendi gizli anahtarınızı ekleyebilirsiniz. Bu sayede ben mesajı aldığımda bunun sizden geldiğinden emin olabileceğim.
De-şifreleme
De-şifreleme sekmesinde, benim açık anahtarımla şifrelenmiş bir metni de-şifrelemek istediğim için kendi gizli anahtarımı kullanıyorum. Şifrelenmiş metin kutusuna bana gönderilen şifreli mesajı yazdığımda artık de-şifreleyebilirim. Eğer göndereni biliyor ve açık anahtarına ulaşabiliyorsam, imzasını da kontrol etmek için gönderenin açık anahtarını kullanabilirim.
Bu bilgiler ile de-şifreleme yaparsam ham metne ulaştığımı ve imzanın da doğrulandığın görebilirsiniz. İmzalayana ait açık anahtar parmak izi de bilgi olarak verildi. Bu imza ile de açık anahtarın sahibini doğrulamalıyım.
Şifrele ve de-şifreleme ekranlarında ‘Dosya Yükleme/İndirme’ düğmelerini kullanarak bilgisayarınızdaki herhangi bir dosyayı da (word, excel, resim, video vs.) şifreleyip gönderebilirsiniz.
Uygulama Dosyalarının Doğrulanması
PGP Suite uygulamasını bilgisayarınıza indirip offline olarak kullanabileceğinizden bahsetmiştim. Bu uygulama gibi güvenliğin ve doğruluğun önemli olduğunda, indirilen dosyalar imzalarla doğrulanması gerekiyor. Dosyaların doğrulanması için Linux dağıtımlarıyla beraber gelen GPG (GnuPG — GNU Privacy Guard)uygulamasını kullanacağız. (Windows ve Mac alternatifleri de var)
GPG uygulaması ile, yukarıda PGP Suite ile yaptıklarımıza ek olarak daha bir çok şifreleme ile ilgili işlemler yapılabilmekte. Bizim yapacağımız örnek ise, indirilmiş PGP Suite uygulamasının benim imzam ile doğrulanması.
GPG üzerinden açık ve gizli anahtarlar tanımlayabilirsiniz veya daha önce oluşturduğunuz anahtarlarınızı içeri aktarabilirsiniz. Aynı zamanda başkalarının anahtarını da içeri aktararak onların anahtarı ile imzalarını doğrulayabilirsiniz. Benim açık anahtarımı (public.key) indirdikten sonra GPG uygulaması ile içeri aktarmak için aşağıdaki komutu çalıştıralım.
$ gpg --import public.key
Bilgisayarınızdaki anahtarları listelemek için aşağıdaki komutu çalıştıralım. Sonuçlarda benim açık anahtarımın imzasını görebilirsiniz.
$ gpg --list-keys
Doğrulamada kullanmak üzere benim anahtarımı içeri aktardığımıza göre uygulama dosyalarını ve imzalarını indirebiliriz.
https://github.com/farukterzioglu/pgp/releases/tag/1.4.1
Uygulama dosyasının yanında (pgp-1.4.1.zip) aynı isimde ‘.sig’ uzantılı imzalarını da görebiliriz. Bunları kullanarak dosyaların benim imzaladıklarım olup olmadığı kontrol edelim.
$ gpg --verify pgp-1.4.1.zip.sig
Aşağıdaki çıktıda gördüklerimiz; kullandığımız imza ile aynı isimdeki dosyanın (pgp-1.4.1.zip) imzalandığı varsayılmış ve imzanın benden geldiği doğrulanmış (Good signature from “Faruk Terzioğlu”). Doğrulama daha önce içeri aktardığımız imza ile yapıldı. Ayriyeten imzanın bana ait olduğunu doğrulamak için parmak izi de listelendi.
Çıktı da görülen uyarı, imzanın bana ait olup olmadığının bilinmemesi. İçeri aktardığınız anahtardan emin olduktan sonra bunları güvenli olarak işaretlemek için şu komutları çalıştırabiliriz.
$ gpg --edit-key "Faruk Terzioğlu"
gpg> trust
İndirilen dosyaların doğrulanması için tercih edilen ikinci bir yöntem de dosyaların hash’lerinin imzalanması. Eğer indirilen dosyalar birden fazla ise veya farklı işletim sistemleri için farklı dosyalar varsa bunların hepsini ayrı ayrı imzalamak yerine hash listesi çıkarılır ve bu liste imzalanır.
PGP Suite dosyalarının yanındaki ‘SHA256SUMS’ dosyasına bakarsak tüm uygulama dosyaları için SHA256 ile hesaplanmış hash’leri görebiliriz.
Hash listesinin yanındaki imza dosyası “SHA256SUMS.sig” ile bu listenin yine benim tarafımdan imzalandığını kontrol edelim.
Ayriyeten kontrol etmemiz gereken ikinci konu da liste içindeki hash’lerin doğruluğu, yani indirdiğimiz uygulama dosyalarının doğru dosyalar olup olmadığı.
$ sha256sum --check SHA256SUMS
Çıktıda görüldüğü üzere tüm dosyaların hash’leri eşleşmektedir ve imzaları da doğrulandığına göre güvendiğiniz ve açık anahtarına sahip olduğunuz yazılımcı tarafından geliştirildiğinden emin olarak kullanabilirsiniz.
Dosya Doğrulama : Bitcoin Core
Uygulama dosyalarının doğrulanmasına bir örnek de Bitcoin uygulaması üzerinden yapalım. Bitcoin Core uygulamasının son versiyonunu (0.18.0) şu linkden indirelim; https://bitcoincore.org/en/download/
İşletim sisteminize uygun versiyonu indirdikten sonra hash’lerinin olduğu dosyayı da “Verify release signatures” linkinden indirelim; “SHA256SUMS.asc”
Aşağıdaki dosyada gördüğümüz üzere tüm işletim sistemleri için kurulum dosyalarının hash’leri var.
İndirdiğimiz yükleme dosyasını doğrulayalım. Hash listesi içerisinde tüm versiyonlar var, sadece bizim indirdiğimizi doğrulamak için --ignore-missing
parametresini ekleyelim.
sha256sum --ignore-missing --check SHA256SUMS.asc
Bitcoin Core uygulamasının Linux versiyonunun hash’i doğrulandı. Peki hash dosyası güvenli bir kaynaktan mı gelmektedir? Bunun yolu da imzasının kontrol edilmesidir. İmzayı doğrulamak üzere Bitcoin Core uygulamasının geliştiricisi “Wladimir J. van der Laan” imzasını indirme sayfasında listenen PGP parmak izi “01EA5486DE18A882D4C2684590C8019E36C2E964” ile indirelim.
$ gpg --recv-keys 01EA5486DE18A882D4C2684590C8019E36C2E964
İmzayı bilgisayarımıza indirdiğimize göre Bitcoin Core uygulamasının yükleme dosyalarını doğrulayabiliriz.
$ gpg --verify SHA256SUMS.asc
Dosyaların İmzalanması
Gizli anahtarınızı kullanarak siz de herhangi bir yükleme dosyalarını imzalayabilirsiniz. Yukarıda anlattığım hash’lerin hesaplanması ve ardından hash özetinin imzalanmasını PGP Suite uygulaması üzerinden anlatayım.
Dosyaları imzalamak için bilgisayarınıza gizli anahtarınızı yüklemelisiniz. Bunun için yine gpg aracını kullanacağız. PGP Suite uygulaması ile ürettiğiniz gizli anahtarı private.key dosyasını içine kaydettikten sonra şu komutu çalıştıralım.
$ gpg --import private.key
$ gpg --list-secret-keys
PGP Suite uygulamasının arşiv dosyalarının (.zip ve .tar.gz) hash’lerini SHA256SUMS dosyasına kaydedelim.
$ sha256sum pgp-1.4.1.tar.gz pgp-1.4.1.zip > SHA256SUMS
Oluşturduğumuz hash özetini kendi gizli anahtarımız ile imzalayalım.
$ gpg --detach-sign SHA256SUMS
Bunun sonucunda hash özetlerinin imzası ‘SHA256SUMS.sig’ dosyasını da elde etmiş olduk.
Bu iki dosyayı dağıtmak üzere yükleme dosyalarının yanında yayınlıyoruz ki kullanacak olanlar indirdikten sonra açık anahtarımız ile doğrulayabilsin.
PGP anahtarlarının bir başka kullanım alanı da Github commit’lerinin imzalanmasıdır. Bu sayede yaptığınız commit’lerin sizden geldiğini açık anahtarınız ile doğrulayabilirsiniz.
Git commit’lerinin imzalanmasına ve GPG uygulamasına dair detaylı bir yazıyı şurada bulabilirsiniz;
Faydalandığım kaynaklar;
https://tr.wikipedia.org/wiki/Pretty_Good_Privac
http://irtfweb.ifa.hawaii.edu/~lockhart/gpg/
https://gist.github.com/cyphar/21a1b213901a0a0ec19764ac03646ebe
https://medium.com/@serhattsnmz/gpg-gnupg-nedir-git-commitleri-gpg-ile-nas%C4%B1l-imzalan%C4%B1r-2f8158f0cb2d
http://www.bitcoinnotbombs.com/beginners-guide-to-pgp/
https://ssd.eff.org/module/deep-dive-end-end-encryption-how-do-public-key-encryption-systems-work
yhttps://www.chosenplaintext.ca/articles/signing-files-vs-signing-hashes.html