• Bağış
  • Java Crypto ve Security Kütüphaneleri ile Kriptografi

    Yazan : Şefik İlkin Serengil

    Temel Kriptografi işlemleri, Java Development Kit ile standart olarak gelen Crypto ve Security kütüphaneleri ile çok basite indirgenmiştir. Bu kütüphaneler, Özetleme fonksiyonlarından, blok şifrelere, açık anahtarlama altyapısından dijital imza’ya kadar birçok kriptografi tekniğinin kullanılmasına olanak sağlamaktadır.

    Açık Anahtarlama ile Şifreleme

    import java.security.*;

    import javax.crypto.*;

    public class AcikAnahtarlaSifreleme

    {

    public static void main(String args[]) throws
    Exception

    {

    String plaintext = “ankara”;

    String algoritma= “RSA”;

    /*

    KeyPairGenerator generate = KeyPairGenerator.getInstance(“RSA”);

    generate.initialize(512);

    // Üreticisi RSA için standart olarak 1024 bitlik anahtar

    // üretmektedir. Farklı büyüklükte anahtar üretilmesi için initialize()

    // komutuna ihtiyaç duyulur.

    // NOT: RSA açık anahtar kripto sisteminde kullanılan anahtarlar en az

    // 512 bit uzunluğunda olmalıdır.

    KeyPair anahtar = generate.genKeyPair();

    */

    KeyPair anahtar = KeyPairGenerator.getInstance(algoritma).generateKeyPair();

    PrivateKey hususiAnahtar = anahtar.getPrivate();

    PublicKey umumiAnahtar = anahtar.getPublic();

    System.out.println(“Anahtar Bilgileri:\n” + hususiAnahtar + “\n\n” );

    System.out.println(“Orjinal metin : ” + ByteToString(plaintext.getBytes()));

    Cipher cipher = Cipher.getInstance(algoritma);

    cipher.init(Cipher.ENCRYPT_MODE, hususiAnahtar);

    byte[] sifreliMetin = cipher.doFinal(plaintext.getBytes());

    System.out.println(“Sifrelenmis metin : ” + ByteToString(sifreliMetin));

    cipher.init(Cipher.DECRYPT_MODE, umumiAnahtar);

    byte[] desifreliMetin = cipher.doFinal(sifreliMetin);

    System.out.println(“Desifrelenmis metin : ” + ByteToString(desifreliMetin));

    }

    private static
    String ByteToString(byte[] buffer)

    {

    StringBuilder s = new StringBuilder();

    for (byte b: buffer)

    {

    String temp = Integer.toHexString(0x00FF & b);

    if( temp.length() == 1)

    {

    s.append(“0″+temp);

    }

    else

    {

    s.append(temp);

    }

    }

    return s.toString();

    }

    }

    Şekil 1.1 RSA Açık Anahtar Kripto Sisteminde Anahtar Üretilmesi İşlemi ve “ankara” Mesajının Kriptolanması İşlemi

    Özetleme Fonksiyonları

    java.security kütüphanesinin altında MD5, SHA-1 ve SHA-2 ailesi özetleme fonksiyonlarını bulunmaktadır.

    Tablo 1.1 Security Kütüphanesi Altındaki Özetleme Fonksiyonlarının Özet Değerleri

    Özetleme Fonksiyonu

    Ürettiği Özet Değeri (bit)

    MD5

    128

    SHA-1

    160

    SHA-2

    SHA-256

    256

    SHA-384

    384

    SHA-512

    512

    import java.security.*;

    public class MesajOzetleme

    {

    public static void main(String[] args) throws NoSuchAlgorithmException

    {

    MessageDigest md;

    String mesaj = “ankara”;

    try

    {

    //md= MessageDigest.getInstance(“MD5″);

    md= MessageDigest.getInstance(“SHA”);

    //md= MessageDigest.getInstance(“SHA-1″);

    //md= MessageDigest.getInstance(“SHA-256″);

    //md= MessageDigest.getInstance(“SHA-384″);

    //md= MessageDigest.getInstance(“SHA-512″);


    md.update(mesaj.getBytes());

    byte[] ozet= md.digest();

    for (int i = 0; i < ozet.length; i++)

    {

    byte temp = ozet[i];

    String s=Integer.toHexString(new
    Byte(temp));

    while(s.length()<2)

    {

    s=“0″+s;

    }

    s=s.substring(s.length()-2);

    System.out.print(s);

    }

    }

    catch (NoSuchAlgorithmException e)

    {

    System.out.println(“Hata: “+e.getMessage());

    }

    }

    }

    Kodtanda anlaşılacağı üzere MessageDigest.getInstance() komutu ile mesajın hangi fonksiyon ile özetinin üretilmek istenmesine karar verilmekte, kodun bu satır haricindeki bölümü mesajın hangi özetleme fonksiyonu ile özeti çıkarılmak istenilse istensin değişmeden kalmaktadır.

    Şekil 1.2 “ankara” Mesajının SHA-1 Özetleme Fonksiyonu ile Özetinin Çıkarılması İşlemi

    Dijital İmza

    RSA açık anahtar kripto sistemi ve SHA-1 özetleme fonksiyonunu kullanılarak, dijital imza oluşturulması ve onaylanması sağlanabilir.

    import java.security.*;

    import java.security.spec. *;

    import javax.crypto. *;

    import java.math. *;

    public class Dijitalimza

    {

    public static void main(String args[]) throws Exception

    {

    String algoritma= “RSA” ;

    String imzaalgoritmasi= “SHA1withRSA” ;


    String plaintext = “ankara” ;


    String publickey= “65537″ ;

    String privatekey = “8270941537318972516558094674351249805161048184003746167787633976800334137009760851928970570911480130217198257581290689913302735257745737192767557667604657″ ;

    String modulus = “9131154010600432960222156068139377364365675839075746047172450313116983614999582711942096502166684086822200398801112922933261246608534398560862152545415337″ ;

    PublicKey umumiAnahtar = KeyFactory.getInstance(algoritma).generatePublic( new RSAPublicKeySpec(new
    BigInteger(modulus),new BigInteger(publickey)));

    PrivateKey hususiAnahtar = KeyFactory.getInstance(algoritma).generatePrivate(new RSAPrivateKeySpec(new BigInteger(modulus),new
    BigInteger(privatekey)));

    System.out.println(“Hususi Anahtar: “+hususiAnahtar+“\nUmumi Anahtar: “+umumiAnahtar+“\n\n”);

    System.out.println(“Mesaj : ” + plaintext);

    // imza oluşturma

    Signature s = Signature.getInstance(imzaalgoritmasi);

    s.initSign(hususiAnahtar);

    s.update((plaintext).getBytes());

    byte[] imza = s.sign();

    System.out.println(“imza : ” + ByteToString(imza));


    // onay

    Signature v = Signature.getInstance(imzaalgoritmasi);

    v.initVerify(umumiAnahtar);

    v.update(plaintext.getBytes());

    boolean onay = v.verify(imza);

    if(onay==true)

    {

    System.out.println(“imza, doğrulamadan geçti”);

    }

    else if(onay==false)

    {

    System.out.println(“hata! mesaj üzerinde değişiklik yapılmış”);

    }

    }

    private static
    String ByteToString(byte[] buffer)

    {

    StringBuilder s = new StringBuilder();

    for (byte b: buffer)

    {

    String temp = Integer.toHexString(0x00FF & b);

    if(temp.length()==1)

    {

    s.append( “0″ +temp);

    }

    else

    {

    s.append(temp);

    }

    }

    return s.toString();

    }

    }

    Şekil 1.3 “ankara” Mesajının İmza’sının Üretilmesi ve Alıcı Tarafında Mesajın İmza’la Onaylanması İşlemi

    Blok Şifreleme Algoritmaları

    javax.crypto kütüphanesi altında AES, DES, Blowfish gibi ileri seviye blok şifreleme algoritmaları bulunmaktadır.

    import javax.crypto.*;

    public class Kripto

    {


    public static void main(String args[]) throws
    Exception

    {

    String plaintext = “ankara”;

    String algoritma = “AES”;

    //String algoritma = “DES”;

    //String algoritma = “Blowfish”;

    SecretKey key = KeyGenerator.getInstance(algoritma).generateKey();

    Cipher sifreleme = Cipher.getInstance(algoritma);

    Cipher desifreleme = Cipher.getInstance(algoritma);

    sifreleme.init(Cipher.ENCRYPT_MODE, key);

    desifreleme.init(Cipher.DECRYPT_MODE, key);


    byte[] orjinalMetin = plaintext.getBytes();


    byte[] sifreliMetin = sifreleme.doFinal(orjinalMetin);


    byte[] desifreliMetin = desifreleme.doFinal(sifreliMetin);

    System.out.println(new
    String(orjinalMetin));


    System.out.println(new
    String(sifreliMetin));


    System.out.println(new
    String(desifreliMetin));

    }

    }


    Şekil 1.4 “ankara” Mesajının AES ile Kriptolanması İşlemi

    Referanslar

    [1] Jonathan Knudsen, 1998. Java Cryptography, Boston.

    Benzer Yazılar:

    Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Java Crypto ve Security Kütüphaneleri ile Kriptografi' isimli yazı 02 Nov 2009 tarihinde, saat: 14:25 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 946 defa okunmuştur.

    Benzer yazıları JAVA, Veri Güvenliği(Cryptography) kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.


    Category: JAVA, Veri Güvenliği(Cryptography)

    Leave a Reply