Java javax.crypto和PHP openssl_解密不相同

Java javax.crypto和PHP openssl_解密不相同,java,php,encryption,cryptography,Java,Php,Encryption,Cryptography,我正在将java解密程序代码移植到PHP。 我有3个文件: encrypted.data-它是使用AES/CBC/NoPadding(128)加密的数据 阿尔戈 aes.key-这是一个秘密密钥 initialization.vector-它是初始化向量 见此处 我在Javajavax.crypto包中使用AES/CBC/NoPadding(128)算法来解密数据。在PHP中,我使用openssl扩展 PHP版本7.1.0 PHP信息(openssl): OpenSSL库版本LibreSS

我正在将java解密程序代码移植到PHP。 我有3个文件:

  • encrypted.data-它是使用AES/CBC/NoPadding(128)加密的数据 阿尔戈
  • aes.key-这是一个秘密密钥
  • initialization.vector-它是初始化向量
见此处

我在Javajavax.crypto包中使用AES/CBC/NoPadding(128)算法来解密数据。在PHP中,我使用openssl扩展

PHP版本7.1.0 PHP信息(openssl):

  • OpenSSL库版本LibreSSL 2.4.4
  • OpenSSL头文件版本LibreSSL 2.4.4
我的代码示例:

我的Java代码:

导入javax.crypto.Cipher;
导入javax.crypto.spec.IvParameterSpec;
导入javax.crypto.spec.SecretKeySpec;
导入java.io.*;
导入java.nio.file.Files;
导入javax.crypto.BadPaddingException;
导入javax.crypto.IllegalBlockSizeException;
导入javax.crypto.NoSuchPaddingException;
导入java.security.invalidalgorithParameterException;
导入java.security.InvalidKeyException;
导入java.security.NoSuchAlgorithmException;
公共班机{
public static void main(字符串[]args)抛出IOException、InvalidGorthmParameterException、InvalidKeyException、NoSuchPaddingException、NoSuchAlgorithmException、BadPaddingException、IllegalBlockSizeException{
文件AesKeyFile=新文件(“./cipher2hp/aes.key”);
File InitializationVectorFile=新文件(“./cipher2ppp/initialization.vector”);
File EncryptedDataFile=新文件(“./cipher2hp/encrypted.data”);
byte[]AesKeyData=Files.readAllBytes(AesKeyFile.toPath());
byte[]InitializationVectorData=Files.readAllBytes(InitializationVectorFile.toPath());
byte[]EncryptedData=Files.readAllBytes(EncryptedDataFile.toPath());
Cipher Cipher=Cipher.getInstance(“AES/CBC/NoPadding”);
SecretKeySpec keySpec=新的SecretKeySpec(AESKYDATA,“AES”);
cipher.init(cipher.DECRYPT_模式,密钥规范,新的IvParameterSpec(InitializationVectorData));
字节[]结果=cipher.doFinal(EncryptedData);
已解密字符串=新字符串(结果);
System.out.printf(“您的数据:%s\n”,已解密);
}
}
我的可移植PHP代码


在Java中,要使用的AES版本(128、192或256位)由您提供的密钥的长度决定,该长度必须正好是这些长度中的一个

在PHP中,您明确指定要在方法参数中使用的AES版本,以
openssl\u decrypt
openssl\u encrypt
,例如“AES-128-cbc”。然后,PHP将截断或扩展您提供的密钥,使其达到所需的长度

您使用的是32字节(256位)密钥,因此您的Java代码使用的是AES-256。但是,您的PHP代码指定了“AES-128-CBC”,因此您使用的是不同的版本

要使PHP版本的行为类似于Java版本,请将调用中的方法字符串更改为
openssl\u decrypt
'aes-256-cbc'


要使Java版本的行为与PHP版本类似(我认为您不想这样做,但为了完整起见,我将其包括在内),请复制密钥的前16个字节,并仅在创建
SecretKeySpec
对象时使用它们。

您能同时提供这两个字节的输出吗?您的IV/Key是什么格式的?尝试在这两种语言中都将结果打印为base64,而不是在Java中转换为字符串。二进制数据和字符串并不是一个快乐的密码学家。是的,哪一个提供了您期望的输出?输入(密钥、iv、密码/密文)也会有帮助。否则,我们将不得不关闭这个主题,因为我们无法识别正确的代码。PHP代码在不匹配的情况下工作。我打印这两个问题的输出。如果在php中使用mcrypt库-
$decryptedWithMcryptLibrary=mcrypt_decrypt(mcrypt_RIJNDAEL_128、$AESKYDATA、$EncryptedData、mcrypt_MODE_CBC、$InitializationVectorData)然后一切正常。字符串已正确解密。但在PHP7.x中不推荐使用mcrypt库。。。我想在PHP.Thanx中使用openssl库!是的,我的钥匙是256字节!java使用AES 256 CBC算法,我很笨…非常感谢你的帮助,我真的很感激!我在代码中尝试了很多可能性,但是没有成功。但是使用这个解决方案代码非常有效。非常感谢@matt。
Your data: My very secure data. Very secure
Process finished with exit code 0
Your data: �j��2��䈤�n�h�/sEH�,/-��-�^[
Process finished with exit code 0
Base64 AES Key:                 "Kl/LF5HSL7YCRbPYNp7QssJzcVY/vx88nt9rEYJaXQo="
Base64 InitializationVector:    "QXF/8HO4te38LhhuFP9+hA=="
Base64 EncryptedData:           "eA1w+ysqsHIdaXsQRSgt9nLPDj7ILcqyZdCW3wDBcy0="
Decrypted Result:               "xmqJ0TKgx+SIpP1u/hNoyS9zRUjEAAEsLy251S2hXls="
Base64 AES Key:                 "Kl/LF5HSL7YCRbPYNp7QssJzcVY/vx88nt9rEYJaXQo="
Base64 InitializationVector:    "QXF/8HO4te38LhhuFP9+hA=="
Base64 EncryptedData:           "eA1w+ysqsHIdaXsQRSgt9nLPDj7ILcqyZdCW3wDBcy0="
Decrypted Result:               "TXkgdmVyeSBzZWN1cmUgZGF0YS4gVmVyeSBzZWN1cmU="
./Cipher2PHP mac$ file -I *
aes.key:               application/octet-stream; charset=binary
initialization.vector: application/octet-stream; charset=binary
encrypted.data:        application/octet-stream; charset=binary
./Cipher2PHP mac$ xxd  aes.key 
0000000: 2a5f cb17 91d2 2fb6 0245 b3d8 369e d0b2  *_..../..E..6...
0000010: c273 7156 3fbf 1f3c 9edf 6b11 825a 5d0a  .sqV?..<..k..Z].
./Cipher2PHP mac$ xxd  initialization.vector 
0000000: 4171 7ff0 73b8 b5ed fc2e 186e 14ff 7e84  Aq..s......n..~.
./Cipher2PHP mac$ xxd  encrypted.data 
0000000: 780d 70fb 2b2a b072 1d69 7b10 4528 2df6  x.p.+*.r.i{.E(-.
0000010: 72cf 0e3e c82d cab2 65d0 96df 00c1 732d  r..>.-..e.....s-
./Cipher2PHP mac$ xxd -b aes.key 
0000000: 00101010 01011111 11001011 00010111 10010001 11010010  *_....
0000006: 00101111 10110110 00000010 01000101 10110011 11011000  /..E..
000000c: 00110110 10011110 11010000 10110010 11000010 01110011  6....s
0000012: 01110001 01010110 00111111 10111111 00011111 00111100  qV?..<
0000018: 10011110 11011111 01101011 00010001 10000010 01011010  ..k..Z
000001e: 01011101 00001010                                      ].
./Cipher2PHP mac$ xxd -b initialization.vector 
0000000: 01000001 01110001 01111111 11110000 01110011 10111000  Aq..s.
0000006: 10110101 11101101 11111100 00101110 00011000 01101110  .....n
000000c: 00010100 11111111 01111110 10000100                    ..~.
./Cipher2PHP mac$ xxd -b encrypted.data 
0000000: 01111000 00001101 01110000 11111011 00101011 00101010  x.p.+*
0000006: 10110000 01110010 00011101 01101001 01111011 00010000  .r.i{.
000000c: 01000101 00101000 00101101 11110110 01110010 11001111  E(-.r.
0000012: 00001110 00111110 11001000 00101101 11001010 10110010  .>.-..
0000018: 01100101 11010000 10010110 11011111 00000000 11000001  e.....
000001e: 01110011 00101101