Ich habe eine einfache Klasse zu versuchen und verschlüsseln Verschlüsselung für die Verwendung an anderer Stelle in meinem Programm.Wie behandelt man "letzten Block unvollständig in der Entschlüsselung"
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;
}
}
}
Es scheint, Verschlüsselung richtig zu handhaben, aber nicht so viel, wenn die Entschlüsselung, die auf der markierte Linie einen javax.crypto.IllegalBlockSizeException „letzter Block unvollständig in Entschlüsselung“ wirft. Hier ist der Stack-Trace:
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)
ich eine gute Menge an schlug meinen Kopf gegen meinen Schreibtisch, dies zu versuchen, herauszufinden, getan haben, aber wenn ich irgendwo überhaupt bekommen, es endet eine andere Ausnahme. Ich kann auch nicht viel durch Suchen finden.
Was fehlt mir? Ich würde jede Hilfe schätzen.
Dies ist die Ursache für mein Problem war, aber es war mit der Nutzlast und nicht der Schlüssel, der immer eine Standard-Zeichenfolge in meinem Fall sein.Ich änderte es so in der String-Encrypt-Methode, der Chiffretext, der zurückgegeben wird, wird Base64 aus dem Byte-Array codiert, und in der Entschlüsselungsmethode wird die Chiffretext-String Base64 in ein Byte-Array decodiert. Das bedeutet, dass Daten nicht mehr verloren gehen und der Code jetzt funktioniert. –
Dasselbe gilt für den verschlüsselten String selbst. Es muss als Byte [] gespeichert werden. – user1666456