Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误:javax.crypto.BadPaddingException:解密时填充块损坏_Java_Android_Encryption_Base64_Aes - Fatal编程技术网

错误: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”)已足够