2016-08-28 3 views
2

JavaでAESを使用して暗号化しようとしているときにこのエラーが発生しました。私は128ビットのキーを使用しています。私の目標は、後でdbに挿入される特定のデータを暗号化することです。Java AES暗号化:最終ブロックが正しく埋め込まれていない

Im new to encryption。何か助けが役に立つでしょう。

これは、コードがどのように見えるかです:

public class AES2 { 
    private static final String algo = "AES/CBC/PKCS5Padding"; 
    private static final byte[] keyValue = 
     new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't','S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' }; 

    public static String encrypt(String Data) throws Exception { 

     //KeyGenerator KeyGen = KeyGenerator.getInstance("AES"); 
     //KeyGen.init(128); 

     //SecretKey SecKey = KeyGen.generateKey(); 
     Key key=generateKey(); 

     //generar IV 
     byte[] iv = new byte[16]; 
     SecureRandom random = new SecureRandom(); 
     random.nextBytes(iv); 
     IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); 

     //cifrar 
     Cipher c = Cipher.getInstance(algo); 
     c.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec); 

     byte[] encVal = c.doFinal(Data.getBytes()); 
     String encryptedValue = new BASE64Encoder().encode(encVal); 
     return encryptedValue; 
    } 

    public static String decrypt(String encryptedData) throws Exception { 
     Key key = generateKey(); 

     byte[] iv = new byte[16]; 
     SecureRandom random = new SecureRandom(); 
     random.nextBytes(iv); 
     IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); 

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

     byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); 
     byte[] decValue = c.doFinal(decordedValue); 
     String decryptedValue = new String(decValue); 
     return decryptedValue; 
    } 

    private static Key generateKey() throws Exception { 
     Key key = new SecretKeySpec(keyValue, "AES"); 
     return key; 
} 
} 

Main class: 

public class aesMain { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws Exception { 

     String texto = "hola mama"; 
     String encryptedText=AES2.encrypt(texto); 
     String decryptedText=AES2.decrypt(encryptedText); 


     System.out.println("Plain text : " + texto); 
     System.out.println("Encrypted Text : " + encryptedText); 
     System.out.println("Decrypted Text : " + decryptedText); 
    } 

} 
+3

暗号のエキスパートではありませんが、暗号化に使用したものと同じIVを使用して復号化する必要があることは間違いありません。私は秘密ではありません。だから、暗号化されたデータにプリペンドする人もいます(そして解読する前に解読してください)。 – jtahlborn

答えて

1

パディングエラーについての事は、彼らは通常、パディングのエラーが、復号時に間違ったキーまたはIVではないということです。パディングを除去する前の平文はランダムなバイトになり、おそらく不良パディングとして報告されます。

この場合、異なるIVが暗号化と復号に使用されます。ただし、IVは暗号化と復号化の間に同一でなければなりません。一般的な手順は、暗号化中にランダムIVを作成し、それを暗号文に接頭辞付けることです。解読の前に、IVが取り出され、暗号文から取り除かれる。

誤ったIVが復号にどのように影響するかを理解するには、Cipher Block Chainingを参照してください。

+0

今、同じ暗号化と復号化にivを使用しています。 –

+0

私は[AES Calculator](http://extranet.cryptomathic.com/aescalc)を使用していますが、パディングを手動で行う必要があります。 – zaph

関連する問題