2014-03-02 35 views
1

我想创建一个类,将允许我使用AES算法加密和解密字符串。我正在使用来自http://aesencryption.net/#Java-aes-encryption-example的例外,但修改了代码以适应我的需要。AES加密鉴于最终块没有正确填充

这是我的Main.java:

public class Main { 

    public static void main(String[] args) { 

     AES256 aes = new AES256(); 

     aes.setKey("Secret Key"); 

     String enc = ""; 
     enc = aes.encrypt("qwertyuiopasdfgh"); 

     System.out.println(enc); 
     System.out.println(aes.decrypt(enc)); 


    } 

} 

这是我AES256.java:

import java.io.UnsupportedEncodingException; 
import java.security.InvalidKeyException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 
import java.util.Base64; 

import javax.crypto.BadPaddingException; 
import javax.crypto.Cipher; 
import javax.crypto.IllegalBlockSizeException; 
import javax.crypto.NoSuchPaddingException; 
import javax.crypto.spec.SecretKeySpec; 

public class AES256 { 

    private SecretKeySpec secretKey; 
    private byte[] key; 

    public void setKey(String key) {  
     MessageDigest sha = null; 
     try { 
      this.key = key.getBytes("UTF-8"); 
      sha = MessageDigest.getInstance("SHA-1"); 
      this.key = sha.digest(this.key); 
      this.key = Arrays.copyOf(this.key, 16); 
      secretKey = new SecretKeySpec(this.key, "AES"); 
     } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } 
    } 

    public String getSecretKey() { 
     return secretKey.toString(); 
    } 

    public String getKey() { 
     return new String(key); 
    } 

    public String encrypt(String string) { 
     try { 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); 
      cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
      return Base64.getMimeEncoder().encodeToString(string.getBytes()); 
     } catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public String decrypt(String string) { 
     try { 
      Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); 
      cipher.init(Cipher.DECRYPT_MODE, secretKey); 
      return new String(cipher.doFinal(Base64.getMimeDecoder().decode(string.getBytes()))); 
     } catch (InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 

这是一个被抛出的错误:

javax.crypto.BadPaddingException: Given final block not properly padded 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966) 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2121) 
    at AES256.decrypt(AES256.java:55) 
    at Main.main(Main.java:13) 

不任何人都知道是什么导致了这个错误?

+0

请注意,您正在使用AES-128,而不是AES-256。 – ntoskrnl

+0

只是注意到了。如何编码AES-256算法? –

+0

在Java中,您只需指定一个256位密钥。但是你为什么要使用AES-256?它没有提供实际的安全利益;更不用说基于密码的密钥。 – ntoskrnl

回答

3

你在它的base64编码形式返回原始字符串:

return Base64.getMimeEncoder().encodeToString(string.getBytes()); 

您想使用的密码在那里还有:

return Base64.getMimeEncoder().encodeToString(cipher.doFinal(string.getBytes())); 

独立的是,在解密自己的密码时,请注意密码模式,填充等的影响。例如,您正在使用的ECB模式将会从相同的明文产生相同的密文,例如密文可能导致暗示有关原始文本,作为著名的加密晚礼服形象:

enter image description here

图片版权:都允许所有使用该拉里·尤因,原始图像的所有者,谁要求你提到他,他的电子邮件地址是[email protected]和The GIMP,根据http://www.isc.tamu.edu/~lewing/linux/

欲了解更多详情,请参阅Wikipedia's article about block cipher modes

相关问题