2011-04-12 83 views
2

我正在使用下面的方法,如果我输入正确的关键所有工作正常。 但是,如果我输入一个错误的键我收到BadPaddingException:垫块损坏... 我做错了什么?Android aes加密垫块损坏

public void initKey(String passwd, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException{ 

    byte[] localsalt = salt; 
    PBEKeySpec password = new PBEKeySpec(passwd.toCharArray(),localsalt, 1024,128);//, localsalt, 1000, 128); //128bit enc aes 
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithMD5And128BitAES-CBC-OpenSSL","BC"); 
    PBEKey key = (PBEKey) factory.generateSecret(password); 
    encKey = new SecretKeySpec(key.getEncoded(), "AES"); 
} 


public String txt2enc(String etxt) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { 

     final Cipher cipher = Cipher.getInstance("AES");//AES  
     cipher.init(Cipher.ENCRYPT_MODE, encKey);  

     byte[] encrypted = cipher.doFinal((etxt).getBytes("UTF-8")); 
     return Base64.encodeToString(encrypted, 0); 
} 

//decryption 
public String txt2dec(String dtxt) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException{ 

    final Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, encKey); 
    byte[] decrypt = cipher.doFinal(Base64.decode(dtxt, 0)); 
    return new String(decrypt);//return Base64.encodeToString(decrypt, 0); 
} 

回答

4

你没有做错什么。它是预期的。这在技术上是Java Encryption issue的重复(这似乎不容易找到)。看到这个answer有一个很好的解释。您可以考虑添加一个MAC(消息认证码)以安全地完成更像校验和的事情。

0

除了提供了错误的关键,我不这么认为:)

栈跟踪会有所帮助,所以我们可以看到,其功能是抛出BadPaddingException。

这可能是因为'坏'键与'好'键长度不同 - '坏'键是从initKey()还是别的地方出来?

最良好的祝愿,

菲尔Lello

+0

当我尝试解密以Base64格式存储的passwd时,出现BadPaddingException .. passwd是用户(现在我插入它)插入的passwd。所以您认为没关系当我输入错误的密钥?(当我说错了我的意思是我试图解密一个不同于加密密钥的字符串) – Stelios 2011-04-12 14:24:20

+0

如果它来自Base64.decode,则dtxt不是有效的Base64编码的字符串。由于无效的字符串不是有效的密码,我只是赶上例外并视为失败。如果dtxt是在应用程序内部生成的,我会研究为什么它有一个无效的编码。 – 2011-04-12 15:13:24