Trying to perform AES encryption with a 256 bit key triggers an error. A portable solution is to use BouncyCastle's library instead:
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
public class AESBouncyCastle {
private final BlockCipher AESCipher = new AESEngine();
private PaddedBufferedBlockCipher pbbc;
private KeyParameter key;
public void setPadding(BlockCipherPadding bcp) {
this.pbbc = new PaddedBufferedBlockCipher(AESCipher, bcp);
}
public void setKey(byte[] key) {
this.key = new KeyParameter(key);
}
public byte[] encrypt(byte[] input)
throws DataLengthException, InvalidCipherTextException {
return processing(input, true);
}
public byte[] decrypt(byte[] input)
throws DataLengthException, InvalidCipherTextException {
return processing(input, false);
}
private byte[] processing(byte[] input, boolean encrypt)
throws DataLengthException, InvalidCipherTextException {
pbbc.init(encrypt, key);
byte[] output = new byte[pbbc.getOutputSize(input.length)];
int bytesWrittenOut = pbbc.processBytes(
input, 0, input.length, output, 0);
pbbc.doFinal(output, bytesWrittenOut);
return output;
}
}
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256);
SecretKey sk = kg.generateKey();
AESBouncyCastle abc = new AESBouncyCastle();
abc.setPadding(new PKCS7Padding());
abc.setKey(sk.getEncoded());
String secret = "This is a secret message!";
System.out.println(secret);
byte[] ba = secret.getBytes("UTF-8");
byte[] encr = abc.encrypt(ba);
System.out.println("Encrypted : "
+ Hex.encodeHexString(encr));
byte[] retr = abc.decrypt(encr);
if ( retr.length == ba.length ) {
ba = retr;
} else {
System.arraycopy(retr, 0, ba, 0, ba.length);
}
String decrypted = new String(ba, "UTF-8");
System.out.println(decrypted);
After retrieving the decrypted byte array, we check for its length, because AES operates with blocks of bytes. The original message length may not be a multiple of these block length.
The generated output is:
This is a secret message! Encrypted : 6d204e3e52daee09800ba6fd9080653dad04a3d4725f3502b78a89b2150e1f63 This is a secret message!
Hi,
ReplyDeleteIs there any sample Java code that does AES encryption/decryption exactly like this website?
http://www.everpassword.com/aes-encryptor
Thanks.
Well, this example does... you just need to feed your own key instead of generating a key!
Delete