JavaにおけるAES復号異常:javax.crypto.BadPaddingException: Given final block not properly padded


  • 問題説明:
  • WindowsオペレーティングシステムAESの復号化は正常で、Linuxシステムの暗号化は正常で、復号化は以下の異常を放出する.
    javax.crypto.BadPaddingException: Given final block not properly padded
    
  • 解決方法:
  •   AES暗号鍵を生成する方式は
    keyGenerator.init(128, new SecureRandom(password.getBytes())); 
    

    に変更
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed(password.getBytes());
    keyGenerator.init(128, secureRandom);
    
  • 原因概要:
  •   java.security.SecureRandomクラスはWindowsシステムで同じパスワードを生成するたびに乱数が生成されますが、Linuxシステムでは不一致が生成されます.
  • 個人拙見:
  •   復号化および暗号化鍵の生成の原理についてはあまり知られていないが、個人的には拙見で、new SecureRandom方式を直接使用することはシステムのデフォルト方式に基づいて鍵を生成することであるが、異なる実行環境によってデフォルト方式の効果が異なり、setSeed方式を使用することは何らかの固定方式を強制的に指定することである.復号化生成鍵が一致しない場合を解決することができる.
    以上は個人的な理解方法であり、不当があれば、ご指摘ください.感謝に堪えません.
    参照リンク:
  • https://stackoverflow.com/questions/12509363/exception-given-final-block-not-properly-padded-in-linux-but-it-works-in-win
  • https://www.cnblogs.com/Darlin356230410/p/8602674.html