* BAEL 4486

Adding 2 files for BAEL 4486

* JAVA-4486, unit tests

Added Unit Test
Corrected the formatting using formatter.xml in eclipse

* BAEL - 4486

Renamed CrytoDriverIVTest.java to CryptoDriverIVTest.java
added core-security-3 module to pom.xml

* Update CryptoDriverIVUnitTest.java

Resubmitting CryptoDriverIVUnitTest

* BAEL - 4486

Removed Blank lines from CryptoDriver.java
This commit is contained in:
Trying something new 2021-11-09 07:04:49 +05:30 committed by GitHub
parent 3ab032d095
commit 4786fb5cf6
4 changed files with 226 additions and 0 deletions

View File

@ -0,0 +1,86 @@
package com.baeldung.crypto;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.GeneralSecurityException;
import com.baeldung.crypto.utils.CryptoUtils;
public class CryptoDriver {
public byte[] ecbEncrypt(SecretKey key, byte[] data) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(data);
}
public byte[] ecbDecrypt(SecretKey key, byte[] cipherText) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(cipherText);
}
public byte[] cbcEncrypt(SecretKey key, IvParameterSpec iv, byte[] data) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
return cipher.doFinal(data);
}
public byte[] cbcDecrypt(SecretKey key, IvParameterSpec iv, byte[] cipherText) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, iv);
return cipher.doFinal(cipherText);
}
public byte[] cfbEncrypt(SecretKey key, IvParameterSpec iv, byte[] data) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
return cipher.doFinal(data);
}
public byte[] cfbDecrypt(SecretKey key, IvParameterSpec iv, byte[] cipherText) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, iv);
return cipher.doFinal(cipherText);
}
public byte[] ofbEncrypt(SecretKey key, IvParameterSpec iv, byte[] data) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/OFB32/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
return cipher.doFinal(data);
}
public byte[] ofbDecrypt(SecretKey key, IvParameterSpec iv, byte[] cipherText) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/OFB32/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key, iv);
return cipher.doFinal(cipherText);
}
public byte[][] ctrEncrypt(SecretKey key, IvParameterSpec iv, byte[] data) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
return new byte[][] { cipher.getIV(), cipher.doFinal(data) };
}
public byte[] ctrDecrypt(SecretKey key, byte[] iv, byte[] cipherText) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
return cipher.doFinal(cipherText);
}
public byte[][] gcmEncrypt(SecretKey key, byte[] iv, byte[] data) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(128, iv));
byte[] ciphertext = cipher.doFinal(data);
return new byte[][] { iv, ciphertext };
}
public byte[] gcmDecrypt(SecretKey key, byte[] iv, byte[] ciphertext) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv));
byte[] plaintext = cipher.doFinal(ciphertext);
return plaintext;
}
}

View File

@ -0,0 +1,53 @@
package com.baeldung.crypto.utils;
import java.security.AlgorithmParameters;
import java.security.GeneralSecurityException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidParameterSpecException;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
public class CryptoUtils {
public static SecretKey generateKey() throws GeneralSecurityException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
return keyGenerator.generateKey();
}
public static IvParameterSpec getIV() {
SecureRandom secureRandom = new SecureRandom();
byte[] iv = new byte[128 / 8];
byte[] nonce = new byte[96 / 8];
secureRandom.nextBytes(nonce);
System.arraycopy(nonce, 0, iv, 0, nonce.length);
return new IvParameterSpec(nonce);
}
public static IvParameterSpec getIVSecureRandom(String algorithm) throws NoSuchAlgorithmException, NoSuchPaddingException {
SecureRandom random = SecureRandom.getInstanceStrong();
byte[] iv = new byte[Cipher.getInstance(algorithm)
.getBlockSize()];
random.nextBytes(iv);
return new IvParameterSpec(iv);
}
public static IvParameterSpec getIVInternal(Cipher cipher) throws InvalidParameterSpecException {
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class)
.getIV();
return new IvParameterSpec(iv);
}
public static byte[] getRandomIVWithSize(int size) {
byte[] nonce = new byte[size];
new SecureRandom().nextBytes(nonce);
return nonce;
}
}

View File

@ -0,0 +1,86 @@
package com.baeldung.crypto;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.GeneralSecurityException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import com.baeldung.crypto.utils.CryptoUtils;
public class CryptoDriverIVUnitTest{
private CryptoDriver driver = new CryptoDriver();
private String TEST_DATA = "Encrypt this for testing";
@Test
public void givenString_whenAesEcb_thenSuccess() throws GeneralSecurityException {
SecretKey key = CryptoUtils.generateKey();
byte[] plaintext = TEST_DATA.getBytes();
byte[] ciphertext = driver.ecbEncrypt(key, plaintext);
byte[] decryptedtext = driver.ecbDecrypt(key, ciphertext);
Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
}
@Test
public void givenString_whenAesCbc_thenSuccess() throws GeneralSecurityException {
SecretKey key = CryptoUtils.generateKey();
IvParameterSpec iv = CryptoUtils.getIVSecureRandom("AES");
byte[] plaintext = TEST_DATA.getBytes();
byte[] ciphertext = driver.cbcEncrypt(key, iv, plaintext);
byte[] decryptedtext = driver.cbcDecrypt(key, iv, ciphertext);
Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
}
@Test
public void givenString_whenAesCfb_thenSuccess() throws GeneralSecurityException {
SecretKey key = CryptoUtils.generateKey();
IvParameterSpec iv = CryptoUtils.getIVSecureRandom("AES/CFB/NoPadding");
byte[] plaintext = TEST_DATA.getBytes();
byte[] ciphertext = driver.cfbEncrypt(key, iv, plaintext);
byte[] decryptedtext = driver.cfbDecrypt(key, iv, ciphertext);
Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
}
@Test
public void givenString_whenAesOfb_thenSuccess() throws GeneralSecurityException {
SecretKey key = CryptoUtils.generateKey();
IvParameterSpec iv = CryptoUtils.getIVSecureRandom("AES/OFB32/PKCS5Padding");
byte[] plaintext = TEST_DATA.getBytes();
byte[] ciphertext = driver.ofbEncrypt(key, iv, plaintext);
byte[] decryptedtext = driver.ofbDecrypt(key, iv, ciphertext);
Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
}
@Test
public void givenString_whenAesCtr_thenSuccess() throws GeneralSecurityException {
SecretKey key = CryptoUtils.generateKey();
IvParameterSpec iv = CryptoUtils.getIVSecureRandom("AES/CTR/NoPadding");
byte[] plaintext = TEST_DATA.getBytes();
byte[][] ciphertext = driver.ctrEncrypt(key, iv, plaintext);
byte[] decryptedtext = driver.ctrDecrypt(key, ciphertext[0], ciphertext[1]);
Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
}
@Test
void givenString_whenAesGcm_thenSuccess() throws GeneralSecurityException {
SecretKey key = CryptoUtils.generateKey();
byte[] iv = CryptoUtils.getRandomIVWithSize(12);
byte[] plaintext = (TEST_DATA).getBytes();
byte[][] ciphertext = driver.gcmEncrypt(key, iv, plaintext);
byte[] decryptedtext = driver.gcmDecrypt(key, ciphertext[0], ciphertext[1]);
Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
}
}

View File

@ -99,6 +99,7 @@
<module>core-java-reflection-2</module>
<module>core-java-security</module>
<module>core-java-security-2</module>
<module>core-java-security-3</module>
<module>core-java-streams</module>
<module>core-java-streams-2</module>
<module>core-java-streams-3</module>