2017-09-22 8 views
2

私は暗号化/復号化ユーティリティクラスを作成しようとしていますが、何をするにしても復号化機能が動作しないようです。復号化中に私はjavax.crypto.BadPaddingException: Given final block not properly padded例外を受けています。javax.crypto.BadPaddingException:最終ブロックが適切に埋められていない - AES/CBC/PKCS5PADDING

私は例や他のスタックオーバーフローの質問の数を見てきましたが、私のミス見つけることができないよう

public class EncryptionUtil { 

    private static final Log LOGGER = LogFactory.getLog(EncryptionUtil.class); 
    private static final String CIPHER_MODE = "AES/CBC/PKCS5PADDING"; 
    private static final String CRYPTO_PROPERTIES_PATH = "/crypto.properties"; 
    private static final SecretKeySpec sKey = keySpecFromProperties(); 

    private EncryptionUtil() {} 

    public static byte[] encrypt(byte[] aBytes) { 
     try { 
      SecureRandom lSecureRandom = new SecureRandom(); 
      byte[] ivBytes = new byte[16]; 
      lSecureRandom.nextBytes(ivBytes); 
      IvParameterSpec lSpec = new IvParameterSpec(ivBytes); 
      Cipher cipher = Cipher.getInstance(CIPHER_MODE); 
      cipher.init(Cipher.ENCRYPT_MODE, sKey, lSpec); 
      byte[] encryptedBytes = cipher.doFinal(aBytes); 
      byte[] outBytes = new byte[encryptedBytes.length + 16]; 
      System.arraycopy(ivBytes, 0, outBytes, 0, 16); 
      System.arraycopy(encryptedBytes, 0, outBytes, 16, encryptedBytes.length); 

      return outBytes; 
     } catch (Exception aEx) { 
      LOGGER.error("Failed to encrypt bytes"); 
      throw new RuntimeException(aEx); 
     } 
    } 

    public static byte[] decrypt(byte[] aBytes) { 
     try { 
      byte[] lIvBytes = Arrays.copyOfRange(aBytes, aBytes.length - 16, aBytes.length); 
      byte[] lEncryptedBytes = Arrays.copyOfRange(aBytes, 0, aBytes.length - 16); 
      IvParameterSpec lIvSpec = new IvParameterSpec(lIvBytes); 
      Cipher cipher = Cipher.getInstance(CIPHER_MODE); 
      cipher.init(Cipher.DECRYPT_MODE, sKey, lIvSpec); 
      return cipher.doFinal(lEncryptedBytes); 
     }catch (Exception aEx){ 
      LOGGER.error("Failed to decrypt bytes. Returning input bytes", aEx); 
      return aBytes; 
     } 
    } 

    private static SecretKeySpec keySpecFromProperties(){ 
     try(InputStream lPropStream = EncryptionUtil.class.getResourceAsStream(CRYPTO_PROPERTIES_PATH)){ 
      Properties cryptoProps = new Properties(); 
      cryptoProps.load(lPropStream); 
      String lSecret = cryptoProps.getProperty("secret"); 
      MessageDigest digest = MessageDigest.getInstance("SHA-256"); 
      digest.update(lSecret.getBytes("UTF-8")); 
      byte[] keyBytes = new byte[16]; 
      System.arraycopy(digest.digest(),0, keyBytes, 0, keyBytes.length); 
      return new SecretKeySpec(keyBytes, "AES"); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
+0

プロパティファイルにキーを格納することはできません。バイナリで、テキストではありません。 – EJP

+0

私はここの答えと同じ解決策を使用して文字列をバイトに変換します。https://stackoverflow.com/questions/3451670/java-aes-and-using-my-own-key – rykeeboy

答えて

2

あなたに先頭に追加暗号化の暗号文へのごIVが、上復号化する場合は、最後に 16バイトをIVとしてコピーします。

暗号化に関係なく、復号化を元に戻す必要があります。

+0

ありがとう、私はそれを逆にしました何か他のことを試して、それを切り替えるのを忘れたとき – rykeeboy

関連する問題