26 Ocak 2018 Cuma

AES

Kullanım
Her şey Cipher nesnesine dayanır.

1. Cipher.getInstance () ile AES cipher nesnesini yarat

2.Cipher.init() ile cipher nesnesini ilklendir.
2.1 Key
Key bilgisi SecretKeySpec nesnesi ile geçilir. Bazı kodlarda SecretKeySpec nesnesini üretmek için KeyGenerator kullanılıyor. Yani key ürettiriliyor.
KeyGenerator -> SecretKeySpec(SecretKey arayüzünden kalıtır) -> Cipher.init()
Örnek
Elimizde key verisi olsun.
byte[] key = ...;
Şöyle yaparız.
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");

Bazı kodlarda ise
PBEKeySpec -> SecretKeyFactory -> SecretKey -> Cipher.init() şeklinde yapılıyor.
Örnek
Şöyle yaparız. Aslında SecretKey nesnesi direkte Cipher nesnesine geçilebilir.


int PASSWORD_ITERATIONS = 65536; // vs brute force
int KEY_LENGTH          = 256;

char[]     pass                = "password".toCharArray();
byte[]     salt                = "salt".toCharArray (); 


SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
PBEKeySpec spec = new PBEKeySpec(pass, salt, PASSWORD_ITERATIONS, KEY_LENGTH);

SecretKey secretKey = factory.generateSecret(spec);
SecretKeySpec sKeySpec = new SecretKeySpec(secretKey.getEncoded(), "AES");//Gereksiz ?

2.2 IV
Örnek
Şöyle yaparız. Blok büyüklüğü 16 byte yani 128 bit kabul ediliyor.
SecureRandom sr = new SecureRandom();
byte[] byteIV = new byte[16];
sr.nextBytes(byteIV);

IvParameterSpec IV  = new IvParameterSpec(byteIV);
IV'yi kendimiz sağlarsak şöyle yaparız. 
byte[] initVector = ...;
byte[] secretKey = ...;
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE new SecretKeySpec(secretKey, "AES"),
  new IvParameterSpec(initVector));
Eğer IV'yi sağlamazsak bir tane IV üretilir. Açıklaması şöyle
If you don't specify an initialisation vector, and one is required with the block mode you're using, then a random IV will be allocated.
Daha sona cipher.getIV() ile IV alınır ve karşı tarafa şifrelenmiş veriden önce gönderilir. Böylece karşı taraf cipher.init (...) çağrısına bu veriyi geçer ve veriyi açabilir.

İlklendirmede AES 256 bit kullanırsak "InvalidKeyException : Illegal key size" hatası alırsak
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy'i kurmak gerekir.

3. Cipher.doFinal () ile veriyi şifrele.
Bu kısım zaten bilindik :)

AES/ECB
AES/ECB yazısına taşıdım.

AES/CBC
AES/CBC yazısına taşıdım.

AES/CTR
Örnek
Şöyle yaparız.
String CIPHER_ALGORITHM = "AES/CTR/NoPadding";
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
AES/GCM
Şöyle yaparız.
Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5Padding");
Java tag çıktısını şifrelenmiş verinin sonuna ekler.

Hiç yorum yok:

Yorum Gönder