Adición de datos autenticados adicionales a AES-GCM en Android
Estoy intentando agregar los datos autenticados adicionales (AAD) a AES-GCM en Android. Veo la versión Java 7 de las notas de Cipher sobre el uso de GCMParameterSpec
y el updateAAD(...)
, pero dado que Android está basado en Java 6, estoy completamente sin ideas. Estoy usando Spongycastle como la biblioteca criptográfica
GCMParameterSpec s = new GCMParameterSpec(...); cipher.init(..., s); cipher.updateAAD(...); // AAD
- Exportar clave pública RSA a PEM String utilizando java
- Diferentes claves públicas RSA generadas en Android
- Jsch con spongycastle en lugar de bouncycastle en Android
- Fuerza ilimitada Jce y Android
- Equivalente de la encriptación spongycastle para ios
- Tratamiento de entradas duplicadas en AndroidStudio: java.util.zip.ZipException
- ¿Cómo incluir el JAR Spongy Castle en Android?
- Generación de PublicKey a partir de los valores x e y del punto de la curva elíptica
- Uso de Spongycastle con Proguard
gracias @andrey – encontré una muestra más completa también forman la lista de correo de BC
public void testGCM() { try { byte iv[] = "123456789012".getBytes(); byte inMsg[] = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111" .getBytes(); byte aad[] = "123456789012123456789012123456789012345678901234567890123456" .getBytes(); byte key[] = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb".getBytes(); System.out.println("inMsgLen===" + inMsg.length); // encrypt AEADParameters parameters = new AEADParameters( new KeyParameter(key), 128, iv, aad); GCMBlockCipher gcmEngine = new GCMBlockCipher(new AESFastEngine()); gcmEngine.init(true, parameters); byte[] encMsg = new byte[gcmEngine.getOutputSize(inMsg.length)]; int encLen = gcmEngine.processBytes(inMsg, 0, inMsg.length, encMsg, 0); encLen += gcmEngine.doFinal(encMsg, encLen); System.out.println("encLen===" + encLen); // decrypt gcmEngine.init(false, parameters); byte[] decMsg = new byte[gcmEngine.getOutputSize(encMsg.length)]; int decLen = gcmEngine.processBytes(encMsg, 0, encMsg.length, decMsg, 0); decLen += gcmEngine.doFinal(decMsg, decLen); System.out.println("decLen===" + decLen); System.out.println("MSG===" + new String(decMsg)); } catch (Exception e) { e.printStackTrace(); } }
De la lista de correo de BC:
Parece un descuido de nuestra parte significa que el proveedor de JCE no expone actualmente un mecanismo para establecer el AAD (también se aplica a otras cifras AEAD: CCM, EAX).
En la API ligera, el AAD se pasa al cifrado (
.init
) a través de una instancia deAEADParameters
(el campo 'associatedText').
Con la API liviana también puede proporcionar datos AAD a través del método processAADBytes()
expuesto por la interfaz AEADBlockCipher .