- Simetrik Şifreleme; şifreleme ve çözme işlemi için aynı anahtarın kullanıldığı algoritmalardır. Şifrelenmiş bilgiyi açmak isteyen kişide şifreleme sırasında kullanılan anahtarın olması gerekir.
- Asimetrik Sifreleme; genellikle paylaşılacak ya da network üzerinde dolaşacak veriyi şifrelemek için kullanılır. Bilgi ulaşacağı kişinin açık veri anahtarına göre şifrelenir. Bilgi şifrelenmiş bir biçimde ulaşacağı kişiye ulaştığında ikinci ve gizli anahtar ile çözülür. Anahtar sadece ulaşacağı kişide bulunduğu için verinin ele geçirilip çözülmesi olanaksızdır.
- Karışık Şifreleme; asimetrik ve simetrik algoritmaları da içerisinde bulundurabilen algortimalardır.
DES (Data Encryption Standard/Veri Şifreleme Standardı), Dünyada en yaygın kullanılan şifreleme algoritmalarından birisidir. IBM tarafından geliştirilmiştir. 1975 yılında “Federal Register” tarafından yayınlanmıştır. DES 64 bitlik veriyi 56 bitlik anahtar kullanarak şifreler. DES’in en büyük dezavantajı anahtar uzunluğunun 56 bit olmasıdır. günümüzde geliştirilen modern bilgisayarlar tarafından yapılan saldırılar karşısında yetersiz kalmaktadır. Daha güvenli şifreleme ihtiyacından dolayı DES, Triple-DES olarak geliştirilmiştir. Triple-DES algoritması geriye uyumluluğu da desteklemek amacıyla 2 adet 56 bitlik anahtar kullanır. Triple-DES algoritması, DES algoritmasının şifreleme, deşifreleme, şifreleme şeklinde uygulanmasıdır.
DES ile şifrelenmiş bilgiye ulaşabilmek için şifreleme sırasında kullanılan anahtara ihtiyaç vardır. Şifrelediğiniz bilgiye daha sonra tekrar ulaşabilmek için anahtarı güvenli bir şekilde saklamanız gerekir.
Aşağıda java ile yazılmış bir örnek bulunmaktadır. Örnek ilk önce bir anahtar üretir, üretilen anahtarla örnek veriyi şifreler, anahtarı bir binary dosyaya kaydeder, sonra dosyadan geri okur ve şifrelenmiş veriyi tekrar eski haline getirir.
Burada örnek olması için çalışma dizininde bir dosyaya kaydedilmiştir fakat anahtarın saklanması konusunda daha yaratıcı ve karmaşık yöntemler bulunabilir.
package destest;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class DESTest {
Cipher eCipher;
Cipher dCipher;
SecretKey generatedKey;
SecretKey readedKey;
public DESTest() {
}
public boolean generateKey() {
try {
generatedKey = KeyGenerator.getInstance("DES").generateKey();
eCipher = Cipher.getInstance("DES");
dCipher = Cipher.getInstance("DES");
eCipher.init(Cipher.ENCRYPT_MODE, generatedKey);
} catch (NoSuchAlgorithmException e) {
System.err.println("NoSuchAlgorithmException: " + e.getMessage());
return false;
} catch (javax.crypto.NoSuchPaddingException e) {
System.err.println("NoSuchPaddingException: " + e.getMessage());
return false;
} catch (java.security.InvalidKeyException e) {
System.err.println("InvalidKeyException: " + e.getMessage());
return false;
}
return true;
}
public boolean saveKey() {
try {
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
Class spec = Class.forName("javax.crypto.spec.DESKeySpec");
DESKeySpec ks = (DESKeySpec)skf.getKeySpec(generatedKey, spec);
ObjectOutputStream oos =
new ObjectOutputStream(new FileOutputStream(".key"));
oos.writeObject(ks.getKey());
oos.close();
} catch (Exception e) {
System.err.println("Save Key: " + e.getMessage());
}
return true;
}
public boolean readKey() {
try {
ObjectInputStream ois =
new ObjectInputStream(new FileInputStream(".key"));
DESKeySpec ks = new DESKeySpec((byte[])ois.readObject());
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
readedKey = skf.generateSecret(ks);
dCipher.init(Cipher.DECRYPT_MODE, readedKey);
} catch (Exception e) {
System.err.println("Read Key: " + e.getMessage());
}
return true;
}
public String encode(String str) {
byte[] utf8;
try {
utf8 = str.getBytes("UTF8");
byte[] enc = eCipher.doFinal(utf8);
return new sun.misc.BASE64Encoder().encode(enc);
} catch (UnsupportedEncodingException e) {
System.err.println("UnsupportedEncodingException: " +
e.getMessage());
} catch (IllegalBlockSizeException e) {
System.err.println("IllegalBlockSizeException: " + e.getMessage());
} catch (BadPaddingException e) {
System.err.println("BadPaddingException: " + e.getMessage());
}
return null;
}
public String decode(String str) {
try {
byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);
byte[] utf8 = dCipher.doFinal(dec);
return new String(utf8, "UTF8");
} catch (javax.crypto.BadPaddingException e) {
System.err.println("BadPaddingException: " + e.getMessage());
} catch (IllegalBlockSizeException e) {
System.err.println("IllegalBlockSizeException: " + e.getMessage());
} catch (UnsupportedEncodingException e) {
System.err.println("UnsupportedEncodingException: " +
e.getMessage());
} catch (java.io.IOException e) {
System.err.println("IOException: " + e.getMessage());
}
return null;
}
public static void main(String[] args) {
String text = "Test text.";
System.out.println("Text : " + text);
DESTest main = new DESTest();
main.generateKey();
String encoded = main.encode(text);
System.out.println("Encoded: " + encoded);
main.saveKey();
main.readKey();
String decoded = main.decode(encoded);
System.out.println("Decoded: " + decoded);
}
}
Bilgi ve kod için teşekkürler. Çalışan güzel bir örnek.
YanıtlaSil