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.