JSONがPHPのopenssl_encrypt
で暗号化されているため、JAVAで解読する必要があります。PHPで暗号化してJavaで解読するAES-256-CBC
この$decrypted
には、正しいデータが復号化されています。私はすでにのように同様の質問を訪問した
Exception in thread "main" java.security.InvalidKeyException: Invalid AES key length: 370 bytes
at com.sun.crypto.provider.AESCrypt.init(AESCrypt.java:87)
at com.sun.crypto.provider.CipherBlockChaining.init(CipherBlockChaining.java:91)
at com.sun.crypto.provider.CipherCore.init(CipherCore.java:591)
at com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:346)
at javax.crypto.Cipher.init(Cipher.java:1394)
at javax.crypto.Cipher.init(Cipher.java:1327)
at com.sample.App.main(App.java:70)
:
さて、問題は、私はJavaで同じことをしようとすると、それは動作しません:(
String path = "/path/to/secret/saved/in/text";
String payload = "...ENCRYPTED DATA...";
StringBuilder output = new StringBuilder();
String iv = payload.substring(0, 16);
byte[] secret = Base64.getDecoder().decode(Files.readAllBytes(Paths.get(path)));
String data = payload.substring(16);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(secret, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(), 0, cipher.getBlockSize());
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); // This line throws exception :
cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
をここではそれがあります
AES-256 CBC encrypt in php and decrypt in Java or vice-versa
openssl_encrypt 256 CBC raw_data in java
Unable to exchange data encrypted with AES-256 between Java and PHP
とリスト続けて....しかし、そこ
運がところで、これは暗号化はPHP
$secretFile = "/path/to/secret/saved/in/text_file";
$secret = base64_decode(file_get_contents($secretFile));
$iv = bin2hex(openssl_random_pseudo_bytes(8));
$enc = openssl_encrypt($plainText, "aes-256-cbc", $secret, false, $iv);
return $iv.$enc;
で行われ、はい、私は私のことを言及するのを忘れている方法ではありませんJREはすでにUnlimitedJCEPolicy
にあり、PHPコードを変更することはできません。
私は完全にこの時点で立ち往生しており、前進することはできません。助けてください。スニペットの上
EDIT#1
byte[] payload = ....;
byte[] iv = ....;
byte[] secret = ....; // Now 370 bits
byte[] data = Base64.getDecoder().decode(payload);
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec secretKeySpec = new SecretKeySpec(Arrays.copyOfRange(secret, 0, 32), "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv, 0, cipher.getBlockSize());
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] output = cipher.doFinal(data);
System.out.println(new String(output).trim());
openssl_encrypt
EDIT#2
で動作しているようだ私はこれが正しいかどうかわからないけど、次は何ですか私はやっていると両側の暗号化 - 復号化は正常に動作しています。私は完全なソリューションを提供することはありませんが、あなたはの世話をする必要がありますいくつかの違いがあるAES/CBC/PKCS5Padding
32バイトのキーである "AES-256" を、正しい長さのキーを使用。 – zaph
なぜ370バイトのAESキーを使用しようとしていますか? –
^キー生成は私の手にはないので。それはPHPの終わりで行われ、完璧に動作します。 – Raja