Tengo una clase simple para tratar de ajustar el cifrado para usarlo en otro lugar de mi programa.Cómo manejar "último bloque incompleto en descifrado"
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
public final class StupidSimpleEncrypter
{
public static String encrypt(String key, String plaintext)
{
byte[] keyBytes = key.getBytes();
byte[] plaintextBytes = plaintext.getBytes();
byte[] ciphertextBytes = encrypt(keyBytes, plaintextBytes);
return new String(ciphertextBytes);
}
public static byte[] encrypt(byte[] key, byte[] plaintext)
{
try
{
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec spec = new SecretKeySpec(getRawKey(key), "AES");
cipher.init(Cipher.ENCRYPT_MODE, spec);
return cipher.doFinal(plaintext);
}
catch(Exception e)
{
// some sort of problem, return null because we can't encrypt it.
Utility.writeError(e);
return null;
}
}
public static String decrypt(String key, String ciphertext)
{
byte[] keyBytes = key.getBytes();
byte[] ciphertextBytes = ciphertext.getBytes();
byte[] plaintextBytes = decrypt(keyBytes, ciphertextBytes);
return new String(plaintextBytes);
}
public static byte[] decrypt(byte[] key, byte[] ciphertext)
{
try
{
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec spec = new SecretKeySpec(getRawKey(key), "AES");
cipher.init(Cipher.DECRYPT_MODE, spec);
return cipher.doFinal(ciphertext);
}
catch(Exception e)
{
// some sort of problem, return null because we can't encrypt it.
Utility.writeError(e);
return null;
}
}
private static byte[] getRawKey(byte[] key)
{
try
{
KeyGenerator gen = KeyGenerator.getInstance("AES");
SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
rand.setSeed(key);
gen.init(256, rand);
return gen.generateKey().getEncoded();
}
catch(Exception e)
{
return null;
}
}
}
Parece cifrado para manejar correctamente, pero no tanto cuando el descifrado, lo que arroja una javax.crypto.IllegalBlockSizeException "último bloque incompleto en el descifrado" en la línea resaltada. Aquí está el seguimiento de la pila:
Location:com.xxxxxx.android.StupidSimpleEncrypter.decrypt ln:49 last block incomplete in decryption javax.crypto.IllegalBlockSizeException: last block incomplete in decryption at org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:711) at javax.crypto.Cipher.doFinal(Cipher.java:1090) at com.xxxxxx.android.StupidSimpleEncrypter.decrypt(StupidSimpleEncrypter.java:44) at com.xxxxxx.android.StupidSimpleEncrypter.decrypt(StupidSimpleEncrypter.java:34)
que he hecho una buena cantidad de golpearse la cabeza contra mi escritorio para tratar de resolver esto, pero si llego a ningún lado, que termina siendo una excepción diferente. Tampoco puedo encontrar mucho buscando.
¿Qué me estoy perdiendo? Apreciaría cualquier ayuda.
Esta fue la causa de mi problema, pero fue con la carga útil y no la clave que será siempre será una cadena estándar en mi caso.Lo cambié para que en el método de cifrado de cadenas, el texto cifrado que se devuelve esté codificado en Base64 desde la matriz de bytes, y en el método de descifrado, la cadena de texto cifrado se decodifique con Base64 en una matriz de bytes. Esto significa que los datos ya no se pierden y el código ahora funciona. –
Lo mismo para la cadena cifrada en sí. Debe almacenarse como byte []. – user1666456