A criptografia usando uma chave privada tem como objetivo utilizar uma chave que serve tanto para criptografar como para descriptografar. Este tipo de criptografia é utilizado quando ambos origem e destino possuem acesso a mesma chave.
Implementando criptografia com AES
O código de implementação do uso da criptografia simétrica usando AES, apresentado a seguir é uma adaptação do código disponível no livro de DASWANI, N.; KERN, C.; KESAVAN, A. página 211.
Vamos começar declarando os atributos que vamos utilizar na classe e o construtor:
No método main vamos criar uma chave privada e guardar ela dentro de um arquivo chamado MinhaChave. Depois vamos utilizar a criptografia simetrica AES para ler o conteúdo do arquivo TextoOriginal.txt e gravar seu conteúdo criptografado no arquivo Criptografado.txt.
No construtor foi definido this.cifra = Cipher.getInstance("AES/CBC/PKCS5Padding"); que informa o algoritmo de criptografia AES que será utilizado e também recebe a chave que será utilizada pela criptografia.
Essa chave recebida no construtor deve ser criada previamente, o método public static void criarChave(String nomeArquivo) throws Exception implementa uma forma de criar a chave privada usando a criptografia AES. Esse método recebe como parâmetro um caminho para salvar o arquivo contendo a chave privada.
O método public static SecretKeySpec lerChave(String nomeArquivo) throws Exception recebe como parâmetro o caminho do arquivo contendo a chave privada e carrega um objeto SecretKeySpec que representa essa chave.
O método public void criptografar(InputStream in, OutputStream out) throws Exception recebe um arquivo de entrada com o conteúdo original e um arquivo de saída no qual será gravado o conteúdo criptografado do arquivo de entrada usando o AES.
O método public static byte[] createRandBytes(int numBytes) throws NoSuchAlgorithmException cria um array de bytes contendo uma sequência aleatória.
O método public void descriptografar(InputStream in, OutputStream out) throws Exception recebe como entrada no parâmetro in o arquivo que está criptografado e no parâmetro out o caminho do arquivo onde será gravado o arquivo descriptografado.
Referência
[DASWANI, N.; KERN, C.; KESAVAN, A.] Foundations of Security. United States of America: Apress, 2007.