错误:javax.crypto.BadPaddingException:解密时填充块损坏
我已经用错误:javax.crypto.BadPaddingException:解密时填充块损坏,java,android,encryption,base64,aes,Java,Android,Encryption,Base64,Aes,我已经用 public static String encrypt(String plainText) { try { byte[] keyData = secret_key.getBytes(); SecretKeySpec secretKey = new SecretKeySpec(keyData, "AES/ECB/PKCS7Padding"); Cipher cipher = Cipher.getInstance("AES/ECB/
public static String encrypt(String plainText) {
try {
byte[] keyData = secret_key.getBytes();
SecretKeySpec secretKey = new SecretKeySpec(keyData, "AES/ECB/PKCS7Padding");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] cipherText = cipher.doFinal(plainText.getBytes("UTF-8"));
String encryptedString = Base64.encodeToString(cipherText, Base64.NO_WRAP);
return encryptedString;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
它工作得很好
但是解密的一部分给出了如下错误:
W/System.err: javax.crypto.BadPaddingException: pad block corrupted
W/System.err: at com.android.org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(JCEBlockCipher.java:701)
W/System.err: at javax.crypto.Cipher.doFinal(Cipher.java:1111)
解密
类似于
public static String decrypt(String encryptedText) {
try {
byte[] keyData = secret_key.getBytes();
SecretKeySpec secretKey = new SecretKeySpec(keyData, "AES/ECB/PKCS7Padding");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] cipherText = Base64.decode(encryptedText,Base64.NO_WRAP);
String decryptedString = new String(cipher.doFinal(cipherText),"UTF-8");
return decryptedString;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
这里有什么问题?如何解决此问题?您的密钥
值可能包含在您正在使用的不明确编码中没有很好表示的字节。当您在不指定编码的情况下调用String#getBytes()
时,将获得系统默认值,该值可能会有所不同
只要将密钥表示为字符串
,就应该使用十六进制编码。这将在每个平台上的序列化/反序列化过程中保持一致。此编码/解码过程有许多标准实现(即org.bouncycastle.util.encoders.Hex.decode(“0123456789ABCDEFFEDCBA9876543210”);
或org.apache.commons.codec.binary.Hex.decodehx(“0123456789ABCDEFFEDCBA9876543210.toCharArray());
都返回原始字节[]
)
一些旁注:
您使用的是ECB
,它极易受密码分析频率分析的影响,除了玩具密码演示外,它实际上已被弃用。我建议您使用CBC
、CTR
或GCM
您不提供初始化向量(IV),因此使用相同密钥加密的相同消息将始终生成相同的密码文本。通过从SecureRandom
生成16个字节并将其填充到IvParameterSpec
中,为每个加密操作使用唯一且不可预测的IV。您可以将IV字节预先添加到密文中,并将其传输/存储在明文中李>
您的密码文本未经身份验证,允许恶意用户通过填充oracle/CCA攻击操作加密数据并尝试解密。在GCM
等相关数据上使用经过身份验证的加密(AEAD)模式,或在密码文本上使用HMAC/SHA-256
消息身份验证码(MAC),并在尝试任何解密之前使用恒定时间等于方法进行验证李>
实例化密钥时,不需要提供操作模式或填充方案<代码>加密密钥=新加密密钥规范(密钥数据,“AES”)代码>已足够李>