Giriş
- SecretKey arayüzünden kalıtan SecretKeySpec yaratılır.
- Cipher nesnesi yaratılır.
NoPadding
Örnek
Şöyle yaparız. Verinin blok büyüklüğünde olması gerekir.
Aşağıdaki kod yanlış çünkü IV random doldurulmuyor.
- SecretKey arayüzünden kalıtan SecretKeySpec yaratılır.
- Cipher nesnesi yaratılır.
NoPadding
Örnek
Şöyle yaparız. Verinin blok büyüklüğünde olması gerekir.
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
Yoksa açma esnasında şu exception fırlatılır
Örnek
Veriyi gerekiyorsa 8 byte blok olacak şekilde padler. PKC7Padding ise parametriktir ve 1- 255 arasında bir blok büyüklüğüne padleyebilir.
AES 16 byte'lık bloklar halinde çalıştığı için aslında bu kullanım biraz hatalı.
Şöyle yaparız.
javax.crypto.BadPaddingException: Given final block not properly padded
PKC5PaddingÖrnek
Veriyi gerekiyorsa 8 byte blok olacak şekilde padler. PKC7Padding ise parametriktir ve 1- 255 arasında bir blok büyüklüğüne padleyebilir.
AES 16 byte'lık bloklar halinde çalıştığı için aslında bu kullanım biraz hatalı.
Şöyle yaparız.
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
Şifreleme için şöyle yaparız. IV için rastgele byte'lar oluşturulur. Key için kullanılan byte'lar kullanılmaz. Şifreleme yapıldıktan sonra IV + salt + şifreli veri gönderilir.SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
// AES-256
KeySpec spec = new PBEKeySpec("password".toCharArray(), salt, 65536, 256);
SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] key = f.generateSecret(spec).getEncoded();
byte[] ivBytes = new byte[16];
random.nextBytes(ivBytes);
IvParameterSpec iv = new IvParameterSpec(ivBytes);
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] encValue = c.doFinal(valueToEnc.getBytes());
byte[] finalCiphertext = new byte[encValue.length+2*16];
System.arraycopy(ivBytes, 0, finalCiphertext, 0, 16);
System.arraycopy(salt, 0, finalCiphertext, 16, 16);
System.arraycopy(encValue, 0, finalCiphertext, 32, encValue.length);
return finalCiphertext;
Örnek
Aşağıdaki kod yanlış çünkü IV random doldurulmuyor.
private String KEY_PRIVATE_HP = "__hpcSecretKey__";
private IvParameterSpec getIvParameterSpec() {
byte[] empty = new byte[16];
return new IvParameterSpec(empty);
}
private String encryptBin(String value) {
SecretKeySpec secretKeySpec = new SecretKeySpec(KEY_PRIVATE_HP.getBytes("UTF-8"),"AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, getIvParameterSpec());
byte[] encrypted = cipher.doFinal(value.getBytes());
return Base64.encodeToString(encrypted, Base64.NO_WRAP);
}
Hiç yorum yok:
Yorum Gönder