2016-08-03 11 views
1

私はこの暗号化コードを持っていて問題はありません。私は別の言語で暗号化されたテキストを解読することができますが、私は現在javaで解読する必要があります。BadPadding同じ暗号化インスタンスを使用している例外

private static final String AES = "AES"; 
    private static final String CBC_BLOCK = "CBC"; 
    private static final String ECB_BLOCK = "ECB"; 
    private static final String PADDING = "PKCS5Padding"; 
    private static final String AES_CBC_PCKS5_CIPHER_CONFIG = AES + "/" + CBC_BLOCK + "/" + PADDING; 
    private static final String AES_ECB_PCKS5_CIPHER_CONFIG = AES + "/" + ECB_BLOCK + "/" + PADDING; 

public static String encryptInAesEcbPkcs5Padding(String salt, String message) { 
     String encryptedMessage = ""; 
     SecretKeySpec key = null; 
     try { 
      if (message != null && !message.equals("")) { 
       key = new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), AES); 
       Cipher cipher = Cipher.getInstance(AES_ECB_PCKS5_CIPHER_CONFIG); 
       cipher.init(Cipher.ENCRYPT_MODE, key); 
       encryptedMessage = convertMessageToBase64(cipher.doFinal(message.getBytes(StandardCharsets.UTF_8))); 
      } 
     } catch (NoSuchAlgorithmException e) { 
      LOGGER.error(LogPreFix.ERROR + "No such algorithm [" + AES + "]", e); 
     } catch (NoSuchPaddingException e) { 
      LOGGER.error(LogPreFix.ERROR + "No such padding for algorithm [" + AES + "]", e); 
     } catch (IllegalBlockSizeException e) { 
      LOGGER.error(LogPreFix.ERROR + "Invalid block size for [" + AES + "/" + ECB_BLOCK + "]", e); 
     } catch (BadPaddingException e) { 
      LOGGER.error(LogPreFix.ERROR + "Invalid padding [" + PADDING + "]", e); 
     } catch (InvalidKeyException e) { 
      LOGGER.error("Invalid key [" + key + "]", e); 
     } 
     return encryptedMessage; 
    } 

このコードで解読しようとしています。私は、暗号化とまったく同じ塩を使用し、暗号化器は、「メッセージ」

public static String decrypt(String message, String salt) throws InvalidAlgorithmParameterException { 
      SecretKeySpec key = null; 
      String string = null; 
      try { 
       if (message != null && !message.equals("")) { 
    String decoded = convertBase64ToMessage(message.getBytes(StandardCharsets.UTF_8)); 
        key = new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), AES); 
        Cipher cipher = Cipher.getInstance(AES_ECB_PCKS5_CIPHER_CONFIG); 
        cipher.init(Cipher.DECRYPT_MODE, key); 
        byte[] decrypted = cipher.doFinal(decoded.getBytes(StandardCharsets.UTF_8)); 
        string = new String(decrypted); 
       } 
      } catch (NoSuchAlgorithmException e) { 
       LOGGER.error(LogPreFix.ERROR + "No such algorithm [" + AES + "]", e); 
      } catch (NoSuchPaddingException e) { 
       LOGGER.error(LogPreFix.ERROR + "No such padding for algorithm [" + AES + "]", e); 
      } catch (IllegalBlockSizeException e) { 
       LOGGER.error(LogPreFix.ERROR + "Invalid block size for [" + AES + "/" + ECB_BLOCK + "]", e); 
      } catch (BadPaddingException e) { 
       LOGGER.error(LogPreFix.ERROR + "Invalid padding [" + PADDING + "]", e); 
      } catch (InvalidKeyException e) { 
       LOGGER.error("Invalid key [" + key + "]", e); 
      } 
      return string; 
     } 

として作成した文字列を渡す。しかし、それを暗号化するときに私がやったと私は同じCipherインスタンスを使用していますので、私は、このエラーを取得していますなぜ私はメッセージを解読できないのか分かりません。暗号文は、(高い確率で)印刷可能な文字列で表すことができないので

javax.crypto.BadPaddingException: Given final block not properly padded 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811) 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2087) 

答えて

3

convertBase64ToMessageは、Stringを返すのではなく、byte[]べきではありません。

+0

それは、ありがとう! – wondergoat77

+0

あなたはこれを解決したと素晴らしいです! – pratnala

関連する問題