3 Ocak 2019 Perşembe

AES/CBC

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.
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
Yoksa açma esnasında şu exception fırlatılır
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