2012-07-21 89 views
0

我正在开发一个项目,我需要向用户发送验证链接。所以使用AES加密来加密他的用户名。我的代码工作正常,即加密和解密工作正常,但只在程序中,当我测试它。我加密了一个字符串,然后解密它。它在当地很好地工作。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; 
    } 

}

+1

有没有人会帮助我?请紧急! – kunal18 2012-07-21 09:37:02

+0

无论何时出现任何错误的算法输入(在您的案例中为密钥或密文),都会抛出BadPaddingException。您是否比较了基础64编码/解码的输出?您不应该使用内部Sun类,而应尝试使用Bouncy Castle或Apache库。 – 2012-07-21 10:31:00

+0

你解决了这个问题吗?如果是这样,你能指出做了什么并且接受或发布了答案吗? – 2012-07-30 00:11:15

回答

2

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

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

+0

我会将字符编码作为问题下注。 – 2012-07-21 14:00:00

+0

@GregS也许,它可能是base64字符串没有被正确地转换,否则转换可能会失败,但这将*解密后* – 2012-07-21 17:42:54

0

您的代码在加密或解密时似乎没有设置填充。明确地在两端设置填充比较好。你也似乎没有设置一个模式,也需要明确地完成。

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

+1

所有这一切都是非常正确的,但由于默认情况下使用AES/ECB/PKCS5Padding,因此不构成答案。 – 2012-07-21 10:34:35

+1

ECB模式不安全,避免它。 CBC或CTR是安全的。如果您想要验证,请使用GCM。最好不要依靠违约,它可能会导致错误。接收端的默认值是什么? – rossum 2012-07-21 11:13:28

+0

我认为接收端包含在代码中(指定了加密和解密);问题是代码实际上工作正常。注意:我不是问题的作者。 – 2012-07-21 11:17:57