問題描述
我需要有關(guān)此錯(cuò)誤的幫助:給定最終塊未正確填充.從標(biāo)題可以看出,我正在使用 AES.
I need help with this error: Given final block not properly padded. As you can see from the title, I am working with AES.
這是錯(cuò)誤所在行的代碼:
Here is the code of line where is error:
byte[] decrypted = cipher.doFinal(bytes);
這里是完整的代碼:
public class AESCrypt {
private final Cipher cipher;
private final SecretKeySpec key;
private String encryptedText, decryptedText;
public AESCrypt(String password) throws Exception {
// hash password with SHA-256 and crop the output to 128-bit for key
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(password.getBytes("UTF-8"));
byte[] keyBytes = new byte[16];
System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
key = new SecretKeySpec(keyBytes, "AES");
}
public String encrypt(String plainText) throws Exception {
byte[] iv = new byte[cipher.getBlockSize()];
new SecureRandom().nextBytes(iv);
AlgorithmParameterSpec spec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
encryptedText = asHex(encrypted);
return encryptedText;
}
public String decrypt(String cryptedText) throws Exception {
byte[] iv = new byte[cipher.getBlockSize()];
AlgorithmParameterSpec spec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, spec);
// decrypt the message
byte[] bytes = cryptedText.getBytes("UTF-8");
byte[] decrypted = cipher.doFinal(bytes);
decryptedText = asHex(decrypted);
System.out.println("Desifrovani tekst: " + decryptedText + "
");
return decryptedText;
}
public static String asHex(byte buf[]) {
StringBuilder strbuf = new StringBuilder(buf.length * 2);
int i;
for (i = 0; i < buf.length; i++) {
if (((int) buf[i] & 0xff) < 0x10) {
strbuf.append("0");
}
strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
}
return strbuf.toString();
}
public static void main(String[] args) throws Exception {
System.out.print("....AES....
");
String message = "MESSAGE";
String password = "PASSWORD";
System.out.println("MSG:" + message);
AESCrypt aes = new AESCrypt(password);
String encryptedText = aes.encrypt(message).toString();
System.out.println("SIFROVANA PORUKA: " + encryptedText);
String decryptedText = aes.decrypt(encryptedText).toString();
System.out.print("DESIFROVANA PORUKA: " + decryptedText);
}
}
推薦答案
根據(jù)您的評(píng)論,您已經(jīng)非常接近讓加密貨幣工作了.
Per your comment, you are pretty close to getting the crypto working.
您需要將 IV 生成代碼從您的加密/解密方法移到其他地方,就像這樣
You need to move the IV generation code from your encryption/decryption methods to somewhere else, like so
public AlgorithmParameterSpec getIV() {
AlgorithmParameterSpec ivspec;
byte[] iv = new byte[cipher.getBlockSize()];
new SecureRandom().nextBytes(iv);
ivspec = new IvParameterSpec(iv);
}
然后將該 ivspec 傳遞給加密和解密方法(使它們看起來像 encrypt(String,AlgorithmParameterSpec)
),以便加密和解密具有相同的 iv.
then pass that ivspec into both the encrypt and decrypt methods (making them look like encrypt(String,AlgorithmParameterSpec)
), so that you have the same iv for both encryption and decryption.
另外,不要在decryptedByteArray上調(diào)用printBase64Binary
,而是調(diào)用new String(decryptedByteArray, "UTF-8")
Also, don't call printBase64Binary
on the decryptedByteArray, instead call new String(decryptedByteArray, "UTF-8")
這篇關(guān)于AES 錯(cuò)誤:給定的最終塊未正確填充的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!