Bu adımda şifreleme sırasında kullanacağımız açık (Public) ve sır (Private) anahtarlarımızı (Key) oluşturacağız. Bu işlem için küçük bir java programı yazalım.

Yazdığımız bu küçük program ile ürettiğimiz anahtarların farklı platformlarda çalışabilmesini isteriz. İleride de bu şekilde örnekler yapacağız. Bu nedenle Base64 olarak saklamayı tercih etmeliyiz.

Bu ürettiğimiz büyük sayıları Base64’e çevirmek için Apache Commons Codec kütüphanesini kullandım. Ücretsiz olan bu kütüphaneyi indirip projenize dahil edebilirsiniz.

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;

import org.apache.commons.codec.binary.Base64;

public class Main {
  public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException {
    // Anahtar çiftimizi üretecek olan objemizi hazırlayalım
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    // Burada anahtarımızın bit uzunluğunu veriyoruz. 1024, 2048 veya 4096 bit uzunluğunda anahtar üretebiliriz.
    keyPairGenerator.initialize(2048);

    // Anahtarlarımızı ürettirelim ve bu anahtarları uygun değişkenlere atayalım.
    KeyPair keyPair = keyPairGenerator.genKeyPair();
    Key privateKey = keyPair.getPrivate();
    Key publicKey = keyPair.getPublic();

    // Anahtarlarımızı RSA için uygun formata çevirelim.
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPrivateKeySpec privateKeySpec = keyFactory.getKeySpec(privateKey, RSAPrivateKeySpec.class);
    RSAPublicKeySpec publicKeySpec = keyFactory.getKeySpec(publicKey, RSAPublicKeySpec.class);

    // Anahtarlarımızı saklamak için Base64 olarak encode edelim.
    String base64PrivateModulus = Base64.encodeBase64String(privateKeySpec.getModulus().toByteArray());
    String base64PrivateExponent = Base64.encodeBase64String(privateKeySpec.getPrivateExponent().toByteArray());

    String base64PublicModulus = Base64.encodeBase64String(publicKeySpec.getModulus().toByteArray());
    String base64PublicExponent = Base64.encodeBase64String(publicKeySpec.getPublicExponent().toByteArray());

    // Son olarak anahtarlarımızı ekrana yazdıralım.
    System.out.println("RSA Keys");

    System.out.print("Private modulus: ");
    System.out.println(base64PrivateModulus);
    System.out.print("Private exponent: ");
    System.out.println(base64PrivateExponent);

    System.out.print("Public modulus: ");
    System.out.println(base64PublicModulus);
    System.out.print("Public exponent: ");
    System.out.println(base64PublicExponent);
  }
}

Bu programı çalıştırdığımızda bize şifreleme için gerekli olan anahtarları üretecek ve Base64 olarak bize verecek. Benim örneğimde aldığım sonuç aşağıdaki gibiydi.

RSA Keys
Private modulus: AJmvQm09j0UQEvHgZVt6KFjF8SI6Tj1M4xCpU1/Tof14UrUQycR238bFbbIVYuoyXGCsKi/kEqCJyZ0GrDeShXLaVoD5ErPZ7Yw6KMXsoprYlRo77h7zqb6Bep+UUhRtPR/PIhUoaLzDX3UaqKuEiaLlQcILqhqePIFtfrRZafT/zLIDGtyMOGK9E0API7ADddLPBd3jVqDUBA4mSXFqBOVIi+nHxvvEDi5IEdisEVYvKYv7xeAklsPRKmeQ0PsbO16z2fq4iXhus6Wn9Kcf/I4sz/AsF0puTlDczVScPdzRtVRM9lPg68MWFM10WaFmmJ4alNGmn0pDlWD9jsXLk2k=
Private exponent: AmWHRajWGR+dDASR0BFhm7DKh9wc6DvQtqvNTws/1XIQ6B3w541rA/CEO2i1+Cz8380Pg1utJq+/YyF9gghY6GebPbuknQVi/PLTO/LqvjtuZ9BTcEwgc4YVYXOwq/zgHSTfxTCyIW9yh6L4ymPwuYeVtO71oiChlOseNLXIPzfPyw51pbn4TBlAEkDY+ppNy2F+x6YBEe37V315BrZ3u6Xq0co/Ut9ldZyuIPnsGk80WbCrDqtz2Klx1NgRcLCe+sRYR/5naRNNI+Ut+ilDR4RlGYlGkPluP/o6QSD2EtatJCmpddXt9I2tmneEauRo+AF/SYHjoPUJQm1IKFz24Q==
Public modulus: AJmvQm09j0UQEvHgZVt6KFjF8SI6Tj1M4xCpU1/Tof14UrUQycR238bFbbIVYuoyXGCsKi/kEqCJyZ0GrDeShXLaVoD5ErPZ7Yw6KMXsoprYlRo77h7zqb6Bep+UUhRtPR/PIhUoaLzDX3UaqKuEiaLlQcILqhqePIFtfrRZafT/zLIDGtyMOGK9E0API7ADddLPBd3jVqDUBA4mSXFqBOVIi+nHxvvEDi5IEdisEVYvKYv7xeAklsPRKmeQ0PsbO16z2fq4iXhus6Wn9Kcf/I4sz/AsF0puTlDczVScPdzRtVRM9lPg68MWFM10WaFmmJ4alNGmn0pDlWD9jsXLk2k=
Public exponent: AQAB

Ürettiğimiz anahtarlar 2048 bit uzunluğunda olduğundan dolayı tabi haliyle biraz yer kaplıyor :) Sonrasında bu ürettiğimiz anahtarları kullanarak RSA şifreleme yapacağız.

Bir sonraki yazımda görüşmek üzere.