decryption - java aes cbc encryption
Detectando una clave incorrecta usando AES/GCM en JAVA (2)
Estoy usando AES
para cifrar / descifrar algunos archivos en modo GCM
usando BouncyCastle.
Si bien estoy demostrando la clave incorrecta para el descifrado, no hay excepción.
¿Cómo debo verificar que la clave sea incorrecta?
mi código es este:
SecretKeySpec incorrectKey = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
byte[] block = new byte[1048576];
int i;
cipher.init(Cipher.DECRYPT_MODE, incorrectKey, ivSpec);
BufferedInputStream fis=new BufferedInputStream(new ProgressMonitorInputStream(null,"Decrypting ...",new FileInputStream("file.enc")));
BufferedOutputStream ro=new BufferedOutputStream(new FileOutputStream("file_org"));
CipherOutputStream dcOut = new CipherOutputStream(ro, cipher);
while ((i = fis.read(block)) != -1) {
dcOut.write(block, 0, i);
}
dcOut.close();
fis.close();
Gracias
No hay un método que pueda detectar la clave incorrecta en modo GCM. Lo que puede verificar es si la etiqueta de autenticación valida, lo que significa que estaba usando la clave correcta. El problema es que si la etiqueta de autenticación es incorrecta, esto podría indicar cada uno de los siguientes (o una combinación de todos, hasta e incluyendo el reemplazo completo del texto cifrado y la etiqueta de autenticación):
- una clave incorrecta está siendo utilizada;
- el modo de contador de datos encriptados fue alterado durante el transporte;
- los datos autenticados adicionales fueron alterados;
- la etiqueta de autenticación en sí misma se modificó durante el transporte.
Lo que podría hacer es enviar datos adicionales para identificar la clave secreta utilizada. Esto podría ser un identificador legible ( "encryption-key-1"
) pero también podría ser un KCV, un valor de verificación de clave. Un KCV normalmente consiste en un bloque cero cifrado con la clave, o un hash criptográficamente seguro sobre la clave (también llamada huella digital). Debido a que el cifrado en un bloque cero filtra información, no debe usar eso para identificar la clave de cifrado.
En realidad, podría usar la característica AAD del modo GCM para calcular la etiqueta de autenticación sobre los datos de identificación de la clave. Tenga en cuenta que no puede distinguir entre el compromiso de la huella digital y el uso de una clave incorrecta. Sin embargo, es menos probable que la huella dactilar se dañe accidentalmente que toda la estructura de IV, AAD, texto cifrado y etiqueta de autenticación.
Usted está usando NoPadding
. Cambie esto a PKCS7Padding
para cifrado y descifrado. Si se utiliza la clave incorrecta, es probable que el relleno no se pueda descifrar como se esperaba y se lanzará InvalidCipherTextException
.