Initialization vector の扱いについて
ivなどの部分をどうすればよいのかわかりませんでした。
Oracle の DBMS_CRYPTO.ENCRYPT
関数についてのドキュメント を参照する限り、 iv 引数が省略された場合、 Initialization vector としては NULL
が使用される と記載があります。 Null IV はゼロフィルされたバイト列を IV として使用することを意味します (IV を使わないと言っているようなものです) 。
AES はブロック長が 16 bytes (128 bits) ですから、 NULL バイトを 16 個並べたものに等しく、要するに iv => HEXTORAW('00000000000000000000000000000000')
という引数を与えるのと等価 です。
Java の javax.crypto.Cipher
を使ってこれを復号化するのであれば、 (Java の byte
は特に指定しなければ 0 で初期化されている為) 次のようにして 空の byte
配列を引数に IvParameterSpec
のインスタンスを作成 すればよいのではないでしょうか。
java
1IvParameterSpec iv = new IvParameterSpec(new byte[16]);
※ IV の長さについては、 Cipher
のインスタンスを作成してから Cipher.getBlockSize()
を呼んでやっても良いと思います
キー長のパディングについて
RPAD(P_PASSWORD, 32, CHR(0))の部分はJavaではどういうことになるのでしょうか?
CHR(0)
は ドキュメント を読むと、コードポイント 0 の文字を、つまり NULL バイトを返します 。 RPAD
も ドキュメント を読めば単純なもので、結局のところ、 P_PASSWORD
が 32 bytes になるよう、必要に応じて右側 (文字列終端側) に NULL バイトを詰め込んで、桁そろえをしている だけです。
つまりパスワード (キー) を AES-256 のキー長である 32 bytes (256 bits) に揃えている処理ですね。残念ながら Java に同等の機能を提供するクラスは無かったように思いますが、別段難しい処理ではないので、例えば次のようにして適当に実装してしまえばよいかと思います。
java
1String password = "My-password";
2
3SecretKeySpec key = new SecretKeySpec(
4 (password + new String(new byte[32])).substring(0, 32).getBytes(),
5 "AES"
6);
おまけ
尚、御呈示の PL/SQL コードでは暗号文を Base64 でエンコードして返しているので、当然ながら Java 側でも Base64 でデコードしてから複合処理を行う必要があります。お忘れなく。