gpt4 book ai didi

java - AES BadPaddingException

转载 作者:行者123 更新时间:2023-12-02 10:59:19 25 4
gpt4 key购买 nike

如果我使用错误的 key 或错误的盐进行解密,则会抛出 BadPaddingException。我希望返回一个不正确的字符串。doFinal() 导致解密方法出现异常

消息:这只是一个示例

Unfug:'ΩÙΩ„SåF?V®ßs.k°·ºç€èÀHfif∫ÙÉÕ

Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
at casino.AES.decryptString(AES.java:130)
at casino.AES.main(AES.java:172)
<小时/>
     public static void main(String[] args) throws Exception {
//Encryption
AES encr = new AES();
encr.setKey("KEY");
encr.setSalt("SALT");
encr.setup();
String message = "This is just an example";
System.out.println("Message : " + message);



byte[] code = encr.encrypt(message);
System.out.println("Encrypted Strinng : "+ new String(code, "UTF-8"));

//Decryption
AES dec = new AES();
dec.setKey("INCORRECT"); //<--- incorrect
dec.setSalt("SALT");
dec.setup();

System.out.println(dec.decryptString(code));
}




public synchronized void setKey(String key) throws UnsupportedEncodingException {
this.key = key.getBytes("UTF-8");
isPasswordAlreadySet = true;
}


public synchronized void setSalt(String salt) throws UnsupportedEncodingException {
this.salt = salt.getBytes("UTF-8");
}

public synchronized void setup() throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(key);
digest.update(salt);
byte[] raw = digest.digest();

skeySpec = new SecretKeySpec(raw, "AES");
cipher = Cipher.getInstance("AES");
}

public synchronized byte[] encrypt(byte[] klartext) throws Exception {
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] encrypted = cipher.doFinal(klartext);

return encrypted;
}

public synchronized byte[] encrypt(String klartext) throws Exception{
return encrypt(klartext.getBytes("UTF-8"));
}






public synchronized byte[] decrypt(byte[] code) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original = cipher.doFinal(code);
return original;
}

public synchronized double decryptDouble(byte[] code) throws Exception {
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] original = cipher.doFinal(code);
return doubleFromBytes( original);
}

谢谢!弗雷德里克

最佳答案

填充是一个很好的健全性检查。假设错误解密的数据均匀分布,则每 255 个错误密码,它只会出现大约 1 次正确的 PKCS5/PKCS7 填充。 (1/256 + 1/256^2 + 1/256^3 ...)

所以它很有帮助,但它不是您应该依赖的东西 --- 实际上几乎 8 位消息摘要并不能充分测试数据完整性。

还有一件事:如果攻击者可以反复更改密文并让您解密它(例如存储在 cookie 中的加密数据),并且当解密的数据抛出异常时,他们是否可以区分您的行为糟糕的填充,当它只是垃圾时,他们可以通过“填充预言攻击”来确定明文。

顺便说一句,如果您确实想要您期望的行为,您可以使用“AES/CTR/NoPadding”,它不需要确切的 block 大小,并且始终返回解密的字节[ ],无论键是否匹配。

关于java - AES BadPaddingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5596994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com