我需要此错误的帮助:给定最终块未正确填充。从标题中可以看出,我正在与AES合作。AES错误:鉴于最终块未正确填充
这里是行的代码,其中的错误:
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 + "\n");
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....\n");
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);
}
}
我会建议你使用Apache Commons编解码器[十六进制](http://commons.apache.org/proper/commons- codec/apidocs/org/apache/commons/codec/binary/Hex.html)而不是滚动自己的十六进制编码器和解码器 – 2013-03-25 21:25:42
我在互联网上看过很多例子,其中人们使用BASE64Decoder和BASE64Encoder?但似乎我不能使用它。 – Zookey 2013-03-25 21:51:07
因为它们位于sun名称空间中,所以使用它们并不是一个最佳实践,并且可能不一定在JDK的所有实现中都有。如果你想在没有库的情况下进行Base64编码和解码,并且你正在支持Java 6+,请使用[本答案](http://stackoverflow.com/a/2054226/1904979)中概述的JAXB – 2013-03-25 21:54:00