0

ファイルからの入力としてテキストパスワードを取得し、それ以降にAES暗号化を適用して復号化しています。 私が初めてそれをしたとき、5回のうち4回(暗号化解読が成功しました)正しく動作していましたが、1回、BadPaddingExceptionがスローされました。以下は私が書いたものです:無効なキーの例外

//ABCD is class name 
public static void enc(String fileName, String pwd) { 
    try { 
     Properties prop = new Properties(); 
     InputStream input = ABCD.class.getClassLoader().getResourceAsStream(fileName); 
     prop.load(input); 
     input.close(); 
     URL url = ABCD.class.getClassLoader().getResource(fileName); 

     FileOutputStream outputStream = new FileOutputStream(url.getPath()); 
     KeyGenerator key = KeyGenerator.getInstance("AES"); 

     key.init(128); 
     SecretKey aesKey = key.generateKey(); 
     String newkey = new String(Base64.encode(aesKey.getEncoded()).getBytes("UTF-8")); 

     Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

     aesCipher.init(Cipher.ENCRYPT_MODE, aesKey); 
     byte[] clear = pwd.getBytes("UTF-8"); 
     byte[] cipher = aesCipher.doFinal(clear); 
     String encPwd = new String(cipher); 
     prop.setProperty("password", encPwd); 
     prop.setProperty("secKey", newkey); 
     prop.store(outputStream, null); 
     outputStream.close(); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

public static String dec(Properties prop, String fileName) { 

    String decPwd = ABCD.map.get(fileName); 
      try { 
      String newkey = prop.getProperty("secKey"); 
      StringBuilder pwd; 
      byte[] newkeybuff = Base64.decode(newkey.getBytes("UTF-8")); 
      SecretKey key = new SecretKeySpec(newkeyuff, "AES"); 
      Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      aesCipher.init(Cipher.DECRYPT_MODE, key); 
      pwd = new StringBuilder(prop.getProperty("password")); 
      byte[] cipher = aesCipher.doFinal(pwd.toString().getBytes()); 
      decPwd = new String(cipher); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
     ABCD.map.put(fileName, decPwd); 
    return decPwd; 
} 

これを修正する必要がありました。どこかで、BadPaddingExcpetionは、実際にバイトを使用する場所の代わりに、Stringで行われた操作以降に発生します。したがって、コードを次のように変更しました。

public static void enc(String fileName, String pwd) { 
    try { 
     Properties prop = new Properties(); 
     InputStream input = ABCD.class.getClassLoader().getResourceAsStream(fileName); 
     prop.load(input); 
     input.close(); 
     URL url = ABCD.class.getClassLoader().getResource(fileName); 

     FileOutputStream outputStream = new FileOutputStream(url.getPath()); 
     KeyGenerator key = KeyGenerator.getInstance("AES"); 

     key.init(128); 
     SecretKey aesKey = key.generateKey(); 

     byte[] newkey=(Base64.encode(aesKey.getEncoded())).getBytes("UTF-8"); 

     Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 


     aesCipher.init(Cipher.ENCRYPT_MODE, aesKey,new IvParameterSpec(new byte[16])); 
     byte[] clear = pwd.getBytes("UTF-8"); 
     byte[] cipher = aesCipher.doFinal(clear); 

     prop.setProperty("password", Arrays.toString(cipher)); 
     prop.setProperty("secKey", Arrays.toString(newkey)); 

     prop.store(outputStream, null); 
     outputStream.flush(); 
     outputStream.close(); 

    } catch (Exception e) { 
    System.out.println(e); 
} 
} 

public static String dec(Properties prop, String fileName) { 

    String decPwd = ABCD.map.get(fileName); 
      try { 
      byte[] newkey=prop.getProperty("secKey").getBytes("UTF-8"); 
      byte[] pwd; 


      byte[] newkeybuff = Base64.decode(newkey); 
      SecretKeySpec key = new SecretKeySpec(newkeybuff, "AES"); 

      Cipher aesCipher=Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      aesCipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(new byte[16])); 
      pwd = prop.getProperty("password").getBytes(); 

      byte[] cipher = aesCipher.doFinal(pwd); 

      decPwd=new String(cipher); 
      System.out.println("Decrypted pwd " + decPwd); 

     } 
     catch (Exception e) { 
    System.out.println(e); 
} 
     ABCD.map.put(fileName, decPwd); 

    return decPwd; 
} 

今、私はInvalidKeyExceptionを取得しています。今回は、キーのサイズが16バイトであることを確認しました。しかし、私はこれをどのように適用するのか分かりません。このための修正が必要です!

+0

コードを修正するのは難しいです。私はあなたが使用できるいくつかの例を使用することをお勧めしますようにhttp://stackoverflow.com/questions/15554296/simple-java-aes-encrypt-decrypt-example – pedrofb

答えて

0

暗号化と復号化に同じIV(初期化ベクトル)を確認する必要があります。

0

通常、パディングエラーは復号化に失敗したことを意味します。

キーが全長(16,24または32バイト)であること、IVが全長(16バイト)であることを確認します。キーまたはIVが短くなると、それは「何か」で埋められ、その人は一貫していないので、そのようなパディングの基準はありません。

getBytes("UTF-8")は、使用する文字によって異なる長さのバイトを返すことがあります。

new IvParameterSpec(new byte[16])をIVに使用すると、IVはランダムなバイトになります。 IVを処理する通常の方法は、暗号化されたランダムなIVを作成し、それを暗号化されたデータの前に付加することです。秘密にする必要はなく、プリペンドすることで復号化できるようになります。

関連する問題