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 + “nn” );

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+“nn”);

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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir