2012-07-01 14 views
5

estoy usando lo siguiente en una aplicación para Android y una aplicación Java independiente:Especifica los argumentos de Cipher.getInstance()?

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { 
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
    byte[] encrypted = cipher.doFinal(clear); 
    ... 

puedo obtener diferentes cadenas cifradas en Android vs mi aplicación Java independiente (ambos utilizan el mismo código y clave). Me da la misma excepción (javax.crypto.BadPaddingException: BlockType desajuste: 0) como en esta pregunta:

RSA Encryption: Difference between Java and Android

Y la solución sugerida es para especificar la estrategia de relleno como:

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

pero estoy usando "AES", no "RSA", y no estoy seguro de cómo especificar el relleno en combinación con AES. ¿Cómo construiría la cadena pasada a Cipher.getInstance() en ese caso? Probé esto:

Cipher cipher = Cipher.getInstance("AES/PKCS1Padding"); 

pero recibe una excepción sobre que no es válido.

Gracias

+1

probar este sistema de cifrado de cifrado = Cipher.getInstance ("AES/CBC/ISO10126Padding", "JsafeJCE"); –

+0

Explosión no funcionó: java.security.NoSuchProviderException: No hay tal proveedor: JsafeJCE – user291701

+3

Parece que está intentando escribir código criptográfico arrojando fragmentos aleatorios de código en la pared y esperando que algo se pegue. Al usar las API de bajo nivel, se supone que comprende cosas como la diferencia entre la criptografía simétrica y la asimétrica, las diferencias entre los modos de cifrado de bloques y los esquemas de relleno, IV, etc. Parece que no entiendes ninguno de esos. Quizás es allí donde deberías comenzar. –

Respuesta

4

Respuesta corta:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

Long Answer

+0

En mi caso, estaba llamando a un cifrado.Update cuando debería haber sido cipher.doFinal. – user1811107

5

Otro 'respuesta corta', pero creo AES-GCM es más seguro que el modo CBC y ha existido durante un par de años Sin embargo, si desea utilizar Android, deberá incluir spongycastle

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); 
0

Esto es cómo lo hice:

keyGenerator.init(new 
       KeyGenParameterSpec.Builder(KEY_NAME, 
       KeyProperties.PURPOSE_ENCRYPT | 
         KeyProperties.PURPOSE_DECRYPT) 
       .setBlockModes(KeyProperties.BLOCK_MODE_CBC) 
       .setUserAuthenticationRequired(true) 
       .setEncryptionPaddings(
         KeyProperties.ENCRYPTION_PADDING_PKCS7) 
       .build()); 

cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" + KeyProperties.BLOCK_MODE_CBC + "/" + KeyProperties.ENCRYPTION_PADDING_PKCS7); 
Cuestiones relacionadas