复制Java';s AES/CBC/PKCS5P在PHP中添加加密
已包含以下java和php代码和输出。目标是在php中获取java校验和值。可以看出,我在php中的输入与在java中的输入相同,尽管我在php的openssl_encrypt函数中尝试了许多不同的参数,但无法获得所需的输出。请帮助解决此问题,我们将不胜感激!请注意,java代码是权威的,所需的任何更改将仅在php中进行 Java代码:复制Java';s AES/CBC/PKCS5P在PHP中添加加密,java,php,encryption,aes,Java,Php,Encryption,Aes,已包含以下java和php代码和输出。目标是在php中获取java校验和值。可以看出,我在php中的输入与在java中的输入相同,尽管我在php的openssl_encrypt函数中尝试了许多不同的参数,但无法获得所需的输出。请帮助解决此问题,我们将不胜感激!请注意,java代码是权威的,所需的任何更改将仅在php中进行 Java代码: import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import jav
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import java.io.ByteArrayOutputStream;
public class ChecksumGen {
public static void main(final String[] args) {
String data = "INPUTDATA";
String secretKey = "0000000000000000000000000000000000000000000000000000000000000000";
byte[] iv = new byte[16];
try {
byte[] hashedData = getDigest(data);
byte[] key = hexStringToByteArray(secretKey);
byte[] checksum = encrypt(key, hashedData, iv);
showB64("key ", key);
showB64("iv ", iv);
showB64("hashedData ", hashedData);
showB64("checksum ", checksum);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
public static byte[] getDigest(String checkSumInput) {
try {
MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-256");
byte[] checkSumInputBytes = checkSumInput.getBytes("UTF-8");
localMessageDigest.update(checkSumInputBytes);
byte[] digest = localMessageDigest.digest();
return digest;
} catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
throw new RuntimeException(ex);
}
}
public static byte[] hexStringToByteArray(String s) {
byte[] b = new byte[s.length() / 2];
for (int i = 0; i < b.length; i++) {
int index = i * 2;
int v = Integer.parseInt(s.substring(index, index + 2), 16);
b[i] = (byte) v;
}
return b;
}
public static byte[] encrypt(byte[] key,byte[] data, byte[] iv)throws Exception{
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher acipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
acipher.init(Cipher.ENCRYPT_MODE, secretKeySpec,ivSpec);
byte[] arrayOfByte1 = acipher.doFinal(data);
return arrayOfByte1;
}
public static void showB64(String label, byte[] rawData) {
System.out.println(label + ":" + Base64.getEncoder().encodeToString(rawData));
}
}
PHP输出:
key :AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
iv :AAAAAAAAAAAAAAAAAAAAAA==
hashedData :ZAgNCUfIbdT9EjdkCb3XDNpMFGV34rXNjcTOQ9cdZ3w=
inputData :ZAgNCUfIbdT9EjdkCb3XDNpMFGV34rXNjcTOQ9cdZ3wQEBAQEBAQEBAQEBAQEBAQ
checksum :LtdJzSl9UgEpZrpdg7X5g5CYqE3eXQvijazrvkw0XFNY2bxn8zGp1ea8DrUmw/uu
最后根据以下链接找到解决方案:
MCRYPT_RIJNDAEL_128
与AES-128-CBC
不同
在MYCRYT\u RIJNDAEL\u 128
中,128实际上指的是块大小而不是密钥大小,在AES-128-CBC
中,128指的是密钥大小,即当与有效的256位密钥一起使用时,它们都是AES-256
在PHP代码中,将函数encrypt()中的$cipher从'AES-128-CBC'更改为'AES-256-CBC',有助于我们使用openssl_encrypt获得所需的输出。结果表明,这与java的输出相同:mcrypt_encrypt(mcrypt_RIJNDAEL_128,$key,$data,mcrypt_MODE_CBC,$iv);考虑到此函数被设置为不推荐,如何在openssl_encrypt中实现此功能?能否与decrypt函数共享最终代码?:)嗨@Littleiger,我得查一下我的笔记,因为已经一年多了。我不认为我实现了一个解密方法,因为它不在我的范围内(这是一个支付网关,所以他们在最后进行解密)。我已经创建了一个公共要点,并添加了一些与PKCS5/PKCS7填充相关的研究注释。我还添加了我编写的等效java代码,以便您可以直接比较结果。
key :AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
iv :AAAAAAAAAAAAAAAAAAAAAA==
hashedData :ZAgNCUfIbdT9EjdkCb3XDNpMFGV34rXNjcTOQ9cdZ3w=
checksum :9NS/ZKMscpa4V7i2YQQPoycxCwbL1BlK3h9O/1ujoD1iYgjE8tZx+JRGflw5WikH
key :AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
iv :AAAAAAAAAAAAAAAAAAAAAA==
hashedData :ZAgNCUfIbdT9EjdkCb3XDNpMFGV34rXNjcTOQ9cdZ3w=
inputData :ZAgNCUfIbdT9EjdkCb3XDNpMFGV34rXNjcTOQ9cdZ3wQEBAQEBAQEBAQEBAQEBAQ
checksum :LtdJzSl9UgEpZrpdg7X5g5CYqE3eXQvijazrvkw0XFNY2bxn8zGp1ea8DrUmw/uu