2014-03-02 71 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

相關問題