PHPで暗号化した文字列をJAVAで複合化できない!?
逆もしかりです。
恐らく方法はあるんだと思いますが
公開されているAPIだけでは不可能だと思います。
暗号化には
・アルゴリズム:RIJNDAEL128
・ブロック暗号:CBC
・初期ベクトル:1234567812345678(CBCモードでの暗号化の場合、これが必要。最低16Byte)
を、使用
PHPのソースは省きます・・・w長いんでw
Javaのソースはこんな感じ
/** * 秘密鍵の生成<br> * 鍵は固定でひとつだけ持つ。 * * @return SecretKeySpec skeySpec 秘密鍵 */ public SecretKeySpec secretKey() throws Exception { byte[] key = "1234567812345678".getBytes(); kgen.init(128); SecretKeySpec keyspec = new SecretKeySpec(key, "AES"); return keyspec; } /** * ラインダール複合化 * * @param String str 暗号化した文字列を16進数変換したもの * @param SecretKeySpec skeySpec 秘密鍵 * @return String 複合化した文字列 */ public String decrypt(String str) throws Exception { // 初期ベクトル生成 byte[] ivbb = "1234567812345678".getBytes(); IvParameterSpec ivspec = new IvParameterSpec(ivbb); // 鍵の生成 SecretKeySpec skeySpec = secretKey(); // 暗号化されているデータ(DBとかから取得した値) byte[] skey = byteToHex(str); cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec,ivspec); byte[] original = cipher.doFinal(skey); String originalStr = new String(original); return originalStr; }
と、言う感じ。
かなりざっくりですがw
用はPHPや、他の言語で暗号化してDBに入れたデータを
JAVAで取得して使おうとしたわけですよ。
ところがですねー、コレうまく行きません。
実は最初にわざと書かなかったんですが、”キー”の問題なんですね、これ。
仮に、多言語で”キー”つまり鍵ですが、
1234567812345678
とかを鍵として使うとして、
常に同じ暗号化、複合化の結果を得たいので
取り合えず固定にしたりするわけですよ。
で一つの言語ならそれでもうまく行くんですが
JAVAではですねー
SecretKeySpec
と、言うのが味噌になるわけですよ。
鍵を作る元の値が
1234567812345678
でも、実際にはココから固定の鍵を生成してくれちゃうんですよ。
セキュアーな鍵を。
親切ですねー。
で、その鍵がなんなのかは”わからない”んです!w
だって”SecretKeySpec”ですからね、秘密なわけですよw
と、言う事で鍵をJAVAと多言語で同じ仕様に出来ない限り不可能なわけです・・・
もし、方法があるとしたら”Key”と言うスーパークラスがあるので
コレに準拠して自作でSecretKeySpecクラスを作るしかないでしょうね・・・
あー困った。(T-T)