【问题标题】:Bad padding exception in AESAES 中的错误填充异常
【发布时间】:2012-07-21 08:40:24
【问题描述】:

我正在处理一个需要向用户发送验证链接的项目。因此使用 AES 加密对他的用户名进行了加密。我的代码工作正常,即加密和解密工作正常,但仅在我测试时在程序中工作。我加密了一个字符串,然后解密它。它在“本地”运行良好。

问题是,当我发送带有激活链接的电子邮件并单击它时,它给了我错误:

javax.crypto.BadPaddingException: Given final block not properly padded

我的代码如下图:

public class AES {

private static final String algo="AES";
private static final byte[] keyValue= 
        new byte[]{somekey};

private static Key generateKey() throws Exception{

    Key key= new SecretKeySpec(keyValue, algo);

    return key;
}

public static String encrypt(String  email) throws Exception{

    Key key=generateKey();
    Cipher c=Cipher.getInstance(algo);
    c.init(Cipher.ENCRYPT_MODE, key);
    byte[] encVal=c.doFinal(email.getBytes());
    String encryptedEmail= new BASE64Encoder().encode(encVal);

    return encryptedEmail;
}

public static String decrypt(String encryptedEmail) throws Exception{

    Key key=generateKey();
    Cipher c=Cipher.getInstance(algo);
    c.init(Cipher.DECRYPT_MODE, key);

    byte[] decodeEmail= new BASE64Decoder().decodeBuffer(encryptedEmail);
    byte[] decodedEmail=c.doFinal(decodeEmail);

    String decryptedEmail= new String(decodedEmail);

    return decryptedEmail;
    }

}

【问题讨论】:

  • 有人可以帮助我吗?求求你了,很紧急!
  • BadPaddingException 被抛出每当算法的输入有任何问题(在你的情况下是密钥或密文)。您是否比较了 base 64 编码/解码的输出?您不应该使用内部 Sun 类,而是尝试使用 Bouncy Castle 或 Apache 库。
  • 您解决了这个问题吗?如果是这样,您能否指出做了什么并接受或发布答案?

标签: java encryption aes


【解决方案1】:

我使用 Bouncy Castle 库的 Base64 编码器/解码器运行它,完全没有问题。检查您的输入/输出并使用有效的 base 64 编码器/解码器,而不是带有未指定输入/输出的 Sun 内部编码器/解码器。

警告:当您使用未指定的字符编码时,它将使用特定于平台的编码,因此您的输入/输出在不同的系统上可能会有所不同。尝试使用 Charset.forName("UTF8") 进行最兼容的字符编码(在 String 构造函数和 toBytes 方法中)。

【讨论】:

  • 我敢打赌字符编码是个问题。
  • @GregS 也许,可能是base64字符串没有正确传输,否则转换可能会静默失败,但那将是解密之后
【解决方案2】:

您的代码似乎没有在加密或解密上设置填充。在两端显式设置填充要好得多。您似乎也没有设置模式,这需要明确地完成。

我建议“AES/CBC/PKCS5Padding”作为一个明显的选择。

【讨论】:

  • 都非常正确,但由于默认使用 AES/ECB/PKCS5Padding,因此不构成答案。
  • ECB 模式不安全,避免使用。 CBC 或 CTR 是安全的。如果您还想进行身份验证,请使用 GCM。最好不要依赖默认值,它会导致错误。接收端默认是什么?
  • 我认为接收端包含在代码中(加密和解密都指定);问题是代码实际上工作正常。注意:我不是问题的作者。
  • 是的,代码工作正常。我的意思是,当我执行 main() 时它工作正常。我传递一个字符串,加密后显示,解密后再次显示。直到这一切都很好。但是,当我发送一封包含带有加密字符串作为参数的链接的电子邮件时,访问该链接时会出现异常。
  • 您是在同一台机器上还是在不同的机器上解密电子邮件?您是否检查过收到的加密电子邮件是否与您发送的电子邮件一字不差?
猜你喜欢
  • 2017-05-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 2012-09-14
  • 2014-07-13
  • 2013-11-14
  • 2017-12-10
  • 1970-01-01
相关资源
最近更新 更多