Android uygulamasınd asimetrik şifreleme yapmanızı gerektirecek farklı yerler vardır. Bunların başında Server-Client uygulamalarında gezinen verinin güvenliğini sağlamak gelir.

Client (Android aygıt) üzerinde şifrelediğiniz veri ancak sır (private) anahtar ile şifrelediğiniz verinin ancak server tarafında çözülebilmesini istiyorsanız bu işlem için bir asimetrik şifreleme algoritması kullanmanız gerekecektir..

İşte bu makalemde bundan bahsedeceğim ve bir örnek hazırlayacağım. Bu örnek sırasında kullanacağım anahtar daha önce hazırladığım Java ile RSA anahtar üretme makalemde ki uygulama tarafından üretilmiş olacak.

Şifreleme için kullandığım kod aşağıdaki gibi.

// Anahtarımızı byte dizisine çevirelim.
byte[] modulusBytes = Base64.decode("AJmvQm09j0UQEvHgZVt6KFjF8SI6Tj1M4xCpU1/Tof14UrUQycR238bFbbIVYuoyXGCsKi/kEqCJyZ0GrDeShXLaVoD5ErPZ7Yw6KMXsoprYlRo77h7zqb6Bep+UUhRtPR/PIhUoaLzDX3UaqKuEiaLlQcILqhqePIFtfrRZafT/zLIDGtyMOGK9E0API7ADddLPBd3jVqDUBA4mSXFqBOVIi+nHxvvEDi5IEdisEVYvKYv7xeAklsPRKmeQ0PsbO16z2fq4iXhus6Wn9Kcf/I4sz/AsF0puTlDczVScPdzRtVRM9lPg68MWFM10WaFmmJ4alNGmn0pDlWD9jsXLk2k=", Base64.DEFAULT);
byte[] exponentBytes = Base64.decode("AQAB", Base64.DEFAULT);

// Algoritme BigInteger objesi istiyor. Aynı bizim bu anahtarları ilk ürettiğimzde bize verdiği gibi.
BigInteger modulusBigInteger = new BigInteger(1, modulusBytes);
BigInteger exponentBigInteger = new BigInteger(1, exponentBytes);

// Anahtarımızla şifreleme için kullanacağımız PublicKey objemizi hazırlayalım.
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulusBigInteger, exponentBigInteger);
PublicKey publicKey = keyFactory.generatePublic(keySpec);

// Şifreleme objemizi hazırlayalım.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);

// Açık metnimiz..
String plainText = "Hello AES =)";

// Metnimizi byte dizisine çevirelim.
byte[] plainBytes = plainText.getBytes("UTF-8");

// Burada açık metni şifreleyip şifrelenmiş byte dizisini elde ediyoruz.
byte[] cipherBytes = cipher.doFinal(plainBytes);

// Şifrelenmiş veriyi saklamak ve taşımak için Base64 olarak encode ediyoruz.
String cipherText = Base64.encodeToString(cipherBytes, Base64.DEFAULT);

Ve şifrelenmiş veriyi çözmek için aşağıdaki kodu kullandım..

// Anahtarımızı byte dizisine çevirelim.
byte[] modulusBytes = Base64.decode("AJmvQm09j0UQEvHgZVt6KFjF8SI6Tj1M4xCpU1/Tof14UrUQycR238bFbbIVYuoyXGCsKi/kEqCJyZ0GrDeShXLaVoD5ErPZ7Yw6KMXsoprYlRo77h7zqb6Bep+UUhRtPR/PIhUoaLzDX3UaqKuEiaLlQcILqhqePIFtfrRZafT/zLIDGtyMOGK9E0API7ADddLPBd3jVqDUBA4mSXFqBOVIi+nHxvvEDi5IEdisEVYvKYv7xeAklsPRKmeQ0PsbO16z2fq4iXhus6Wn9Kcf/I4sz/AsF0puTlDczVScPdzRtVRM9lPg68MWFM10WaFmmJ4alNGmn0pDlWD9jsXLk2k=", Base64.DEFAULT);
byte[] exponentBytes = Base64.decode("AmWHRajWGR+dDASR0BFhm7DKh9wc6DvQtqvNTws/1XIQ6B3w541rA/CEO2i1+Cz8380Pg1utJq+/YyF9gghY6GebPbuknQVi/PLTO/LqvjtuZ9BTcEwgc4YVYXOwq/zgHSTfxTCyIW9yh6L4ymPwuYeVtO71oiChlOseNLXIPzfPyw51pbn4TBlAEkDY+ppNy2F+x6YBEe37V315BrZ3u6Xq0co/Ut9ldZyuIPnsGk80WbCrDqtz2Klx1NgRcLCe+sRYR/5naRNNI+Ut+ilDR4RlGYlGkPluP/o6QSD2EtatJCmpddXt9I2tmneEauRo+AF/SYHjoPUJQm1IKFz24Q==", Base64.DEFAULT);

// Algoritme BigInteger objesi istiyor. Aynı bizim bu anahtarları ilk ürettiğimzde bize verdiği gibi.
BigInteger modulusBigInteger = new BigInteger(1, modulusBytes);
BigInteger exponentBigInteger = new BigInteger(1, exponentBytes);

// Anahtarımızla şifreleme için kullanacağımız PublicKey objemizi hazırlayalım.
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(modulusBigInteger, exponentBigInteger);
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);

// Şifreleme objemizi hazırlayalım.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);

// Şifreli metnimiz..
String cipherText = "CTpW+9OE88I6bLS5nW1UNswAMoubcbm1pvUrRqUtUSOjGq4shPe8jrN7Bjq1+dMD4M068V8SlHq8UsR6/9TkIQDMAWsnq3Ya3806VGi83RKwN7FO136C8t3GRHqLdHHzvu3DU/9wxrpm1W1T6y4VOa/8Qowx0Bw5XqSQjg4Ib7/Y3buEkbb8ywIZwMqWbfFn9B31PRIRlbe1U/6xeIuzbI63oMkYJ8PW6iKjjn6StTIKXRpcWgBBkvc3AFVzmjkpM7bLcIqpZBwr9C7S3+IhlIA0id6Jfz2uvsTbzMDUJVim0dZ5LDSvVzhYn8mOmyhWD27Cv2sW3FPCHScaPXGdEg==";

// Metnimizi byte dizisine çevirelim.
byte[] cipherBytes = Base64.decode(cipherText, Base64.DEFAULT);

// Burada şifreli verimizi çözüp açık byte dizisini elde ediyoruz.
byte[] plainBytes = cipher.doFinal(cipherBytes);

// Açık veriyi string formatına geri çeviriyoruz.
String plainText = new String(plainBytes, "UTF-8");

Bu şekilde RSA şifrelemeyi Android cihazımızda uygulamış olduk.. Ve sonuç olarak aşağıdaki ekran görüntüsünü elde ettik. 2048 bit RSA anahtarı kullanarak yaptığımız bu şifrelemeyi farklı uzunlukta anahtarlar ile daha güvenli ancak daha uzun veya daha zayıf ancak daha az yer kaplayan sonuçlar almak mümkün.

Image

RSA ile şifreleme makaleminde sonuna geldim. Soru ve önerilerinizi yazmaktan çekinmeyin..

GitHub

Görüşmek üzere…