1. bölümde GnuPG (Gnu Privacy Guard) ile bilgisayarımızda bulunan verileri şifrelemek için yapılması gereken en temel işlemleri komut satırından nasıl yapacağımızı görmüştük. Bunlar öncelikle kendimiz için bir açık anahtar (public key) / gizli anahtar (private key) çifti yaratma sonra da bu anahtarları kullanarak bir belgeyi şifreleme ve şifrelenmiş belgeyi deşifre etme yani eski haline döndürme işlemleri idi. Ayrıca kötü adamların eline geçmesini istemediğimiz bir belgenin WIPE programı ile nasıl güzelce diskimizden kazınacağına (!) dair bir örnek de vermiştik.
Bu bölümde ise bir arkadaşımızın anahtarına Internet üzerinden nasıl ulaşırız, bunu kendi sistemimize nasıl aktarırız, bu anahtara nasıl olur da güveniriz ve kendi anahtarımızı arkadaşımıza nasıl yollarız gibi biraz daha detaylı ama olmazsa olmaz işlemler üzerinde duracağız.
Tekrar belirtmeliyim ki verdiğim örnekler Debian GNU/Linux 3.0 işletim sistemi çalıştıran ev bilgisayarımda denenmiştir ve sizdeki ekran çıktısı ufak tefek de olsa değişiklikler gösterebilir ancak bu işlemlerin doğasını etkilemez.
Nerede Bu Açık Anahtar?
Artık GnuPG (ya da komut satırında kullandığımız şekli ile gpg) yazılımını kullanarak şifreleme ve deşifreleme işlemlerini öğrendiğimize göre arkadaşlarımızla güvenli şekilde iletişim kurmanın zamanı geldi de geçiyor bile.
Arkadaşıma bir belgeyi şifrelemek için ne yapmalıyım? Tabii ki öncelikle onun açık anahtarına ulaşmalı ve bunu sistemime kaydetmeliyim ki gpg ile arkadaşımın açık anahtarını kullanarak belgeleri şifreleyip sadece ve sadece onun açabileceği hale getireyim.
Bir insanın açık anahtarına ulaşmanın iki temel yöntemi vardır, ya bizzat o insan size bunu gönderir ya da bir anahtar sunucu (keyserver) kullanırsınız. Burada ikinci yöntemi ele alacağız ve bir anahtar sunucuya bağlanıp birisinin açık anahtarını öğreneceğiz. Anahtar sunucu deyip durduğumuz aslında bir web sunucusundan başka bir şey değildir (ldap sunucu da olabilir ama şimdilik bunun kafanızı karıştırmasına izin vermeyin). Burada pek çok kişinin açık anahtarı durur ve siz buraya bağlanıp eğer varsa bir insanın açık anahtarını öğrenebilirsiniz. Söz konusu anahtar sunucular periyodik olarak birbirlerini senkronize ederler yani bir anahtar sunucusuna gönderilmiş bilgi kısa bir süre içinde tüm anahtar sunuculara dağıtılır (klasik FTP sunucularındaki "mirror" mekanizması gibi düşünebilirsiniz).
gpg yazılımı size bir anahtar sunucuya ulaşıp belli bir kullanıcı ID'si ile ilişkili açık anahtarı çekmeye yardımcı olur. Ancak burada küçük bir problem var. Şu ID dediğimiz maalesef birkaç basamaklı ve onaltılık sistemde kodlanan bir sayı. Yani arkadaşınızın açık anahtarını anahtar sunucudan çekebilmesi için gpg'ye bu ID'yi vermeniz gerekiyor. Peki biz ölümlüler, biz sıradan kullanıcılar bunu nasıl bilebiliriz ki! Cevap: Bilmeyiz ve zaten gerek de yoktur çünkü işimizi kolaylaştıracak yazılımlar mevcuttur.
İşimizi kolaylaştıracak yazılımlar içinde en basiti ve komut satırından standart olarak kullanılabilecek olanı KEYLOOKUP yazılımıdır. Söz konusu yazılım benim işletim sistemi CD setimde mevcuttu ancak eğer sizde yoksa (düşük ihtimal!) GnuPG anasayfasındaki Tools bölümüne gidip bu yazılımı çekebilirsiniz.
Keylookup aslında basit bir Perl programıdır (basit masit, Perl programcılarına saygımız sonsuz!) ve eğer biz bu güzel programı yazan saygıdeğer şahıslardan biri olan Peter Palfrader'e şifreli şekilde teşekkür etmek istersek öncelikli olarak vermemiz gereken komut şudur:
fz@debian:~$ keylookup --keyserver=pgp.mit.edu --frontend=plain Peter Palfrader
Programın buna tepkisi aşağıdaki gibi olacaktıri (Internet'e bağlısınız değil mi?):
Unexpected format
Use of uninitialized value in hash element at /usr/bin/keylookup line 173.
Use of uninitialized value in sprintf at /usr/bin/keylookup line 243.
Use of uninitialized value in sprintf at /usr/bin/keylookup line 243.
Use of uninitialized value in sprintf at /usr/bin/keylookup line 243.
Use of uninitialized value in concatenation (.) or string at /usr/bin/keylookup line 249.
/ --
use 0xD1A3A329Now run gpg --keyserver pgp.mit.edu --recv-keys
Bu aşamada haklı olarak diyebilirsiniz ki "nedir bu hatalar!". Valla ben bir Perl programcısı değilim (henüz!) ve bu aşamada yukarıdaki hatalar bizi çok da ilgilendirmemeli çünkü son satırın bir üstünde tam da aradığımız bilgi mevcut yani Peter Palfrader'in ID'si.
Artık ID'yi bildiğimize göre Peter'i (hemen de samimi oldum) sistemimize ekleyebiliriz ve keylookup programı bununla ilgili ipucunu zaten bize son satırında vermektedir, dediğini yapalım:
fz@debian:~$ gpg --keyserver pgp.mit.edu --recv-keys 0xD1A3A329
gpg: requesting key D1A3A329 from pgp.mit.edu ...
gpg: key D1A3A329: public key imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
fz@debian:~$
Güzel, işlem başarı ile tamamlandı ve Peter arkadaşımızın açık anahtarı sistemimize eklendi.
Peki bundan emin miyiz? Hemen anahtar listemize bir göz atalım:
fz@debian:~$ gpg --list-keys
/home/fz/.gnupg/pubring.gpg
---------------------------
pub 1024D/ACE54758 2002-11-11 Emre Sevinc (FZ)sub 1024g/44CB2544 2002-11-11 pub 1024R/D1A3A329 1999-02-22 Peter Palfrader uid Peter Palfrader uid Peter Palfrader uid Weasel fz@debian:~$
Görünen o ki Peter MIT anahtar sunucusunda birden fazla e-posta adresi ile bağlantılı açık anahtar depolamış. Bu bir problem değil çünkü Peter Palfrader dediğimizde sistem bir şekilde yukarıdaki listeye bakacak ve Peter için gerekli açık anahtarı kullanarak şifreleme yapacaktır.
Şimdi Peter'a şifreli teşekkür mesajı yollasak mı? Bu kadar aceleci davranmalı mıyız?
Arkadaşımın Anahtarı Güvenli Mi?
Pratikte yukarıdaki anahtarı hemen kullanmamızda bir sakınca olmayabilir ancak açık anahtar şifreleme ile ilgili kutsal kitaplar der ki: Önce anahtar güvenilebilir mi bir test edin ve sonra da bu anahtarı imzalayın.
Bütün bunların anlamı ne? Aslında hepsi bizim iyiliğimiz için. Yani sistem bize bu anahtarın güvenli olup olmadığını kontrol etmemize izin verir ve eğer gerekli güven ve huzur ortamı sağlandı ise anahtarı sayısal olarak imzalamamızı sağlar.
Bu kadar laftan sonra gelelim Peter'in anahtarını nasıl kontrol edeceğimize, öncelikli olarak şu komutu vereceğiz:
fz@debian:~$ gpg --edit-key peter@palfrader.org
gpg (GnuPG) 1.0.6; Copyright (C) 2001 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.
pub 1024R/D1A3A329 created: 1999-02-22 expires: never trust: -/q
(1) Peter Palfrader(2) Peter Palfrader (3) Weasel (4). Peter Palfrader Command>
Bu aşamada program bize Peter'in açık anahtarı ile ilgili temel bilgileri getirmektedir. Sağda biraz ileride trust: -/q satırını okuyabilirsiniz. Bu anahtarın güvenliği ile ilgili olarak bu satır bize şunu söylemektedir kısaca: Henüz bu anahtarla ilgili herhangi bir onaylama işlemi yapmadınız. Peki bu işlemi nasıl yapacağız? Parmak izi (fingerprint) kontrolü yaparak. "Bu da ne demek?" diye soranlara cevabım basit: Parmak izi dediğimiz şey sadece ve sadece bu açık anahtara / bu kullanıcıya ait ve karmaşık bir algoritma ile hesaplanan bir sayıdır ve eğer arkadaşınızla bağlantı kurup karşılıklı olarak bu sayıyı teyit ederseniz anahtarın güvenilir olduğunu, kötü niyetli kişiler tarafından modifiye edilmediğini bilebilirsiniz. Söz konusu anahtarda arkadaşınızın haberi olmadan tek bir bit ya da byte değişse bile parmak izi çok farklı olacaktır! Arkadaşınızla telefonda konuşarak ve birbirinize parmak izini oluşturan karakterleri/sayıları söyleyerek gerekli kontrolü yapabilirsiniz. Şimdi bu parmak izi bilgisine nasıl ulaşacağımıza bakalım:
Command> fpr
pub 1024R/D1A3A329 1999-02-22 Peter PalfraderFingerprint: BB A2 DC FE D7 D2 09 BF 93 46 36 6F C1 A4 41 1A Command>
Parmak izinin biraz uzun olduğunu söylemiş miydim? Neyse. Şimdi bu aşamada Peter da kendi sisteminde aynı konumda olursa ve bana telefonda kendi parmak izini söylerse gerekli kontrolleri yapabiliriz. En ufak bir fark varsa o zaman açık anahtarı kullanmamak bizim menfaatimize olacaktır.
Güvenlik konusunda elbette hassas olmak gerekli ancak uluslarası telefon görüşmesi biraz tuzlu kaçacağından (Türk Telekom!) bu karşılıklı parmak izi kontrol işlemini şimdilik hakkı ile yerine getiremiyor ve anahtara güvenmeyi tercih ediyorum (en kötü ihtimalle Peter'e şifreli bir deneme mesajı yollar ve bana telefon edip teyit etmesini isterim).
Artık güvendiğimiz bu anahtarı imzalayabiliriz:
Command> sign
Really sign all user IDs? y
pub 1024R/D1A3A329 created: 1999-02-22 expires: never trust: -/q
Fingerprint: BB A2 DC FE D7 D2 09 BF 93 46 36 6F C1 A4 41 1A
Peter PalfraderPeter Palfrader Weasel Peter Palfrader Are you really sure that you want to sign this key with your key: "Emre Sevinc (FZ) "
Really sign? y
You need a passphrase to unlock the secret key for
user: "Emre Sevinc (FZ)"
1024-bit DSA key, ID ACE54758, created 2002-11-11
Command>check
uid Peter Palfradersig! D1A3A329 1999-08-07 [self-signature] sig! ACE54758 2002-11-17 Emre Sevinc (FZ) uid Peter Palfrader sig! D1A3A329 2000-07-03 [self-signature] sig! ACE54758 2002-11-17 Emre Sevinc (FZ) uid Weasel sig! D1A3A329 1999-08-07 [self-signature] sig! ACE54758 2002-11-17 Emre Sevinc (FZ) uid Peter Palfrader sig! D1A3A329 2000-07-03 [self-signature] sig! ACE54758 2002-11-17 Emre Sevinc (FZ) 75 signatures not checked due to missing keys
Yukarıda olup biteni özetlemek gerekirse: İmzala komutunu verir vermez sistem emin olup olmadığımı sordu ve bunu geçer geçmez de sorusunu farklı bir şekilde tekrar etti (hafif bir paranoya kokusu). Ardından da bana "madem imzalamak konusunda bu kadar ısrarcısın, madem Peter Palfrader denen bu adama bu kadar güveniyorsun o halde ver bakalım bana parola cümleni" dedi. Daha sonra "check" komutu ile gerçekten imzalayıp imzalamadığımı kontrol ettim, her şeyin yolunda olduğunu gördüm.
Bu aşamada programa "list" komutunu verirsem Peter'in benim GnuPG sistemindeki güvenilirlik durumunu öğrenebilirim:
Command> list
pub 1024R/D1A3A329 created: 1999-02-22 expires: never trust: -/f
(1) Peter Palfrader(2) Peter Palfrader (3) Weasel (4). Peter Palfrader Command>
Görüldüğü gibi trust: -/f olmuş durumda yani q'dan f'ye geçiş yaptık bu da "fully trusted" anlamına geliyor. Peki f'den önce gelen - sembolü neyi temsil ediyor. Bu sembol şu anda Peter'in imzaladığı anahtarlara güvenip güvenmediğimizi gösteren bir sembol. Şu anda biz Peter'in anahtarına güveniyoruz ama Peter tarafından imzalanmış bir başka kişiye ait bir anahtara güvenmiyor durumdayız ve bu şekilde kalmasının mahsuru yok. İstersek daha sonra "trust" komutu ile bunda değişiklik yapabiliriz (bütün bu güven meselesinin Peter'in Perl kodlaması ile en ufak bir alakası yoktur, inanın!). Gördüğünüz gibi bir anahtar birkaç kişi tarafından imzalanabilir ve insanlar da birbirlerinin imzaladıkları anahtarlara güvenebilirler böylece her anahtar için tek tek orjinal anahtar sahibi ile muhatap olmak zorunda kalmazsınız (dostumun dostu dostumdur hesabı). Tüm bu mekanizmaya ise kısaca "anahtar çemberi / anahtar halkası" (keyring) ismi verilir teknik olarak. Neyse, şimdi bunun detayına çok girmemize gerek yok. Yaptığımız değişiklikleri sisteme kaydedip tekrar komut satırına dönelim:
Command>save
fz@debian:~$
Artık sistemimize aktardığımız bu yeni anahtarla iş güç yapabiliriz. 1. bölümü iyice kurcalamış olanlar nasıl şifreleme yapılabileceğini tahmin ediyorlardır ama ben gene de küçük bir örnek vermek istiyorum, bunun için daha önce kullandığımız hassas.txt isimli çok hassas bilgileri içeren (!) bir dosya kullanacağım ve bunu sadece Peter'in okuyabileceği hassas.txt.gpg dosyasına dönüştüreceğim:
fz@debian:~$ gpg --output hassas.txt.gpg -es hassas.txt"ls" komutu ile şifrelenmiş dosyanın oluşup oluşmadığını kontrol edebilir ve "cat" komutu ile bu dosyadaki abuk sabuk karakterleri görebilirsiniz eğer her şey yolunda gitti ise.
You need a passphrase to unlock the secret key for
user: "Emre Sevinc (FZ)"
1024-bit DSA key, ID ACE54758, created 2002-11-11
You did not specify a user ID. (you may use "-r")
Enter the user ID: Peter Palfrader
fz@debian:~$
Şimdi bu dosyayı deşifre edelim:
fz@debian:~$ gpg --output desifredilmis.txt -dv hassas.txt.gpg
gpg: public key is D1A3A329
gpg: encrypted with 1024-bit RSA key, ID D1A3A329, created 1999-02-22
"Peter Palfrader"
gpg: decryption failed: secret key not available
fz@debian:~$
Şu anda dikkatli ve gülümseyen okuyuculara, 1. bölümü iyice kavramış insanlara dönüp ben de gülümsüyorum ve diyorum ki yukarıdaki komutu çalıştırmamın tek sebebi uyuklayan okuyucuyu biraz şaşırtarak kendine getirmekti. gpg haklı olarak şikayet ediyor ve söz konusu dosyayı deşifre edemeyeceğini belirtiyor. Neden? Çünkü ilgili gizli anahtar yok! Neden? Çünkü biz Peter değiliz! Bu dosya sadece onun için şifrelendi (onun açık anahtarı kullanılarak) ve artık bu dosyayı sadece Peter açabilir. Açık anahtar şifreleme yöntemini keşfetmiş matematikçilere buradan bir kez daha selam yolluyorum.
Bu bölümün sonuna gelirken değinmek istediğim şeylerden biri anahtar alma (import) işleminin simetriği yani kendi anahtarınızı arkadaşınıza gönderme (export) işlemi. Tıpkı bir anahtarı alırken olduğu gibi bu iş için de iki yöntem var, anahtarınızı ya bir anahtar sunucusuna yollayacaksınız ya da bir dosyaya yazıp arkadaşınıza e-mail ile ileteceksiniz (veya web sayfanızda yayınlayacaksınız). Burada anahtarı arkadaşımıza e-posta yolu ile yollamak ya da web sayfamızda yayınlamak amacı ile bir dosyaya ASCII formatlı metin olarak nasıl aktarabileceğimize göz atacağız.
Normalde gpg'den "al benim açık anahtarımı falanca dosyaya yaz" gibi bir talepte bulunursak bunu yapar ancak ortaya çıkan dosya abuk sabuk ve zor okunur karakterleri içerir. Arkadaşımızdaki gpg yazılımı bunu okumakta güçlük çekmez ancak biz insanların kafası biraz karışabilir bu yüzden bu anahtarın bir web sayfasında da yayınlanabileceğini düşünerek tüm çıktı işlemlerimizi ASCII metin tabanlı çıktı olarak ayarlayacağız ve bunun için aşağıdaki komutu vereceğiz:
fz@debian:~$ gpg --armor --output fz_public_key.txt --export fz@debian.org
Ve ardından fz_public_key.txt dosyasının içeriğine bakacak olursak:
fz@debian:~$ cat fz_public_key.txt
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
mQGiBD3PkNURBAC68OBJeDxz5GffoAXU6N5Cu/rtDKvzcKssORN1E8XdtDFhGefa
QoIvt7Nd2rBtmbhvMzxpdZVmxuUKfh23EfXzSFKncaF9F2m+3H5P28msiZbdbvr6
...
2Yhy87qIRgQYEQIABgUCPc+Q1wAKCRBupjjwrOVHWLhDAJ4ho1Cdyyh/Y5IREEiX
uGxHgGPHtQCglppcV0Vt/BnQES9ERVnfnboiy8c=
=2RyO
-----END PGP PUBLIC KEY BLOCK-----
fz@debian:~$
Artık açık anahtarınızı içeren bu dosyayı arkadaşınıza gönderebilirsiniz ve o da "gpg --import fz_public_key.txt" (ya da dosya ismi her ne ise) komutu ile bu açık anahtarı kendi sistemine ekleyebilir.
Üzülerek belirtmek zorundayım ki ikinci bölümün de sonuna geldik. Yazı boyu çok uzamasın diye şimdilik burada bir ara veriyorum. Henüz GnuPG kullanan grafik kullanıcı arabirimlerine ve GnuPG (veya herhangi bir şifreleme sistemi) kullanılırken dikkat edilmesi gereken önemli noktalara değinmedik; bunları ileriki bölümlerde ele almaya çalışacağız.
Bu iki bölümü iyice kavramış olan FM okuyucuları artık GnuPG ile bir kullanıcı adına nasıl anahtar çifti yaratabileceklerini, bir başka kullanıcının açık anahtarına Internet üzerinden nasıl ulaşabileceklerini, bunu kullanarak sadece o kullanıcının çözebileceği şifreli belgeleri nasıl oluşturabileceklerini, kendi açık anahtarlarını nasıl bir dosyaya yazıp arkadaşlarına gönderebileceklerini ve istedikleri dosyaları en güvenli ve geri dönülemez şekilde silebileceklerini biliyor olmalılar. Yukarıda hiç belirtmemiş olmama rağmen çoğu okuyucunun şifreledikleri mesaj dosyasını bir ek belge (attachment) olarak normal bir e-posta mesajına ekleyip göndermeyi akıl edebileceğini var saydım. GnuPG ile tümleşik olarak çalışan e-posta istemcileri (mutt, sylpheed, vs.) anlatılan ara adımları görsel bir arabirimle kullanıcıyı daha az yorarak yapabilirler ancak şu anda bunların detayına girmek yazının amacını aşıyor.
Bu yazı dizisindeki temel kavramları kavrayan okuyucuların her türlü grafik arayüz ortamında ve PGP (Pretty Good Privacy) gibi benzer ortamlarda sıkıntı çekmeden çalışabileceklerini var sayıyorum (tersi doğru mudur bu tartışılır).
Bir sonraki bölüme kadar her türlü yorumunuzu ve en acımasız eleştirilerinizi buraya bekliyorum.
KAYNAKÇA
- "PGP: Pretty Good Privacy", Simson Garfinkel
- The GNU Privacy Handbook
- gnupg manual sayfaları