Revision: 15380
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at July 2, 2009 20:22 by geekiuscaesar
Initial Code
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class Cryptor { private static byte[] r = new byte[] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF }; private static byte[] header = new byte[] { 0x1, 0x2, 0x2 }; private static int headerlen = 3; private static byte[] iv = new byte[] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF }; private static int shalen = 32; private SecretKeySpec secretKeySpec = new SecretKeySpec(r, "AES"); private IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); public byte[] encrypt(String plaintext) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { byte[] text = plaintext.getBytes(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); stream.write(header); // Encrypt text Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding"); cipher.init(Cipher.ENCRYPT_MODE, this.secretKeySpec, this.ivParameterSpec); stream.write(cipher.doFinal(text)); // Hash text MessageDigest digest = MessageDigest.getInstance("SHA-256"); digest.update(text); stream.write(digest.digest()); byte[] bytes = stream.toByteArray(); stream.close(); return bytes; } public String decrypt(byte[] bytes) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, InvalidHashException, InvalidHeaderException { ByteBuffer buf = ByteBuffer.wrap(bytes); byte[] header = new byte[headerlen]; buf.get(header); if (!Arrays.equals(header, Cryptor.header)) throw new InvalidHeaderException( "Header is not valid. Decryption aborted."); int aeslen = bytes.length - shalen - headerlen; byte[] aes = new byte[aeslen]; buf.get(aes); // Decrypt text Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, this.secretKeySpec, this.ivParameterSpec); byte[] text = cipher.doFinal(aes); // Compute hash MessageDigest digest = MessageDigest.getInstance("SHA-256"); digest.update(text); byte[] hash = digest.digest(); byte[] hash2 = new byte[shalen]; buf.get(hash2); if (!Arrays.equals(hash, hash2)) throw new InvalidHashException( "Verification failed. Decryption aborted."); return new String(text); } class InvalidHeaderException extends Exception { private static final long serialVersionUID = 1L; public InvalidHeaderException(String string) { super(string); } } class InvalidHashException extends Exception { private static final long serialVersionUID = 1L; public InvalidHashException(String string) { super(string); } } public static void main(String[] args) throws Exception { Cryptor c = new Cryptor(); System.out .println(c .decrypt(c .encrypt("String encryption/decryption with integrity check. In a real world example, the key should be kept secret and the IV should be unique."))); } }
Initial URL
Initial Description
Initial Title
AES encrypter/decrypter with check in CFB mode in Java using JCE
Initial Tags
Initial Language
Java