Şifreleme konusunda çok deneyimli olmamakla beraber bir süre önce konu hakkında bayağı araştırma yaptım. Bu araştırmalarımı eğitimim sırasında edindiğim bilgilerle birleştirdiğimde ortaya güzel bir kod çıkarmayı başardım.

Edindiğim bilgilerle şifreleme ile ilgili bir yazı dizisi hazırlamaya karar verdim. Bu yazı dizisinde AES ve RSA ile farklı modlarda şifreleme yapıp şifrelediğimiz verileri geriye getireceğiz.

Serisinin ilk parçasında openssl ile AES anahtar oluşturacağız ve ECB modunda zayıf şifreleme yapacağız.

AES standardının birden fazla modu bulunmakta bunların en zayıfı ECB’dir. Yüksek güvenlik sağlamamakla beraber fazla önemli olmayan veriler için yeterli koruma sağlar. Öncelikle bir anahtar oluşturmalıyız.

Anahtar oluşturmak için kullanacağımız araç linux, ve türevlerinde halihazırda bulunur. Ancak windows alternatifleri de mevcut. Windows alternatifini araştırıp burada paylaşırsanız sevinirim. Kullanacağımız aracın adı “openssl”.

Aşağıdaki komut bir 256 bit AES anahtarı üretmek için gerekli olan komuttur. Sonrasında bir şifre soracak bu girdiğiniz şifre ile bu anaktarı oluşturacaktır. Kullanımı hakkında detaylı bilgi almak için konsolda “man enc” yazıp dökümanı inceleyebilirsiniz.

256 bit bir AES anahtarını ECB modunda oluşturmak için aşağıdaki komutu kullanacağım. Güvenlik ihtiyaçlarınıza göre 128/192/256 bit anahtar oluşturup kullanabilirsiniz.

$ openssl enc -aes-256-ecb -P -md sha256

Benim örneğimde aşağıdaki anahtarı elde ettim.

key=0E9826AC44B33DD5EF220FB233951642BB5FA56AC980E09A931D3870E2A716C6

Bu anahtarı kullanabilmek için bir byte dizisine çevirmemiz gerekir. Anahtar aslında bize hex-string olarak verilir. Hex-string’i byte dizisine çevirmek için çeşitli yöntemler var. Hatta bloğumda ki ilk postumda da bu methodlardan birini kullandım. Kod içinden ilgili bölümü bu işlem için kullanabilirsiniz.

Anahtarımız hazır artık string şifreleme işlemine girişebiliriz. Bunun için çeşitli kütüphaneler bulunması ile beraber aslında böyle birşeye ihtiyacımız yok. Java ve Android bizim için ihtiyacımız olan herşeyi sağlıyorlar.

Aşağıda şifreleme için kullanacağımız en basit hali ile kod bloğu..

// Keyimizi byte dizisine çevirelim
byte[] keyBytes = hexStringToByteArray("0E9826AC44B33DD5EF220FB233951642BB5FA56AC980E09A931D3870E2A716C6");
// Byte key'i kullanabilmemiz için hazırlanmış objeyi oluşturalım.
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
// Şifreleyeceğimiz string
String plainText = "Hello AES =)";
// String güzel ancak bize byte lazım..
byte[] plainBytes = plainText.getBytes("UTF-8");
// Şifreleme objemizi yaratalım..
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// ve şifreleme için hazırlayalım..
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
// Sonunda şifrelenmiş byte dizimiz
byte[] cipherBytes = cipher.doFinal(plainBytes);
// Base64 olarak encode ederek istediğimiz gibi kullanabiliriz.
String cipherText = Base64.encodeToString(cipherBytes, Base64.DEFAULT);

Ve bu şekilde tekrar çözüyoruz.

// Keyimizi byte dizisine çevirelim
byte[] keyBytes = hexStringToByteArray("0E9826AC44B33DD5EF220FB233951642BB5FA56AC980E09A931D3870E2A716C6");
// Byte key'i kullanabilmemiz için hazırlanmış objeyi oluşturalım.
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
// Çözeceğimiz Base64 string
String cipherText = "5/w35zsClfl3m7iznnejNg==";
// String güzel ancak bize yine byte lazım..
byte[] cipherBytes = Base64.decode(cipherText, Base64.DEFAULT);
// Şifreleme objemizi yaratalım..
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// ve çözme için hazırlayalım..
cipher.init(Cipher.DECRYPT_MODE, keySpec);
// Sonunda şifrelenmiş byte dizimiz
byte[] plainBytes = cipher.doFinal(cipherBytes);
// Byte dizimizi string'e çevirip kullanabiliriz.
String plainText = new String(plainBytes, "UTF-8");

Aşağıda görüldüğü gibi şifrelenmiş ve çözülmüş string verimizi yukarıda paylaştığım kod ile yapabildik. Bu yazıda gereksiz bilgi ile çok fazla sıkmamaya çalıştım. Ancak çok sevdiğim şifreleme konusunda daha detaylı açıklamaları içeren bir post’u yakında sizlerle paylaşacağım.

Image

Kaynak kodlar (GitHub)

Şifreleme serisinin bir sonraki adımı olan AES ile CBC modunda şifreleme postunda görüşmek üzere…