Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制Java';s AES/CBC/PKCS5P在PHP中添加加密_Java_Php_Encryption_Aes - Fatal编程技术网

复制Java';s AES/CBC/PKCS5P在PHP中添加加密

复制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

已包含以下java和php代码和输出。目标是在php中获取java校验和值。可以看出,我在php中的输入与在java中的输入相同,尽管我在php的openssl_encrypt函数中尝试了许多不同的参数,但无法获得所需的输出。请帮助解决此问题,我们将不胜感激!请注意,java代码是权威的,所需的任何更改将仅在php中进行

Java代码:

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