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)