Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.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
PHP AES加密JAVA到PHP-openssl_加密_Php_Encryption_Php Openssl - Fatal编程技术网

PHP AES加密JAVA到PHP-openssl_加密

PHP AES加密JAVA到PHP-openssl_加密,php,encryption,php-openssl,Php,Encryption,Php Openssl,我正在使用PHP中可用的openssl_加密函数来获得与下面的java代码生成的结果类似的结果 但情况完全不同。请帮帮我 JAVA代码 package com.atom.echallan.security.util; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.IvParameterSpec; i

我正在使用PHP中可用的openssl_加密函数来获得与下面的java代码生成的结果类似的结果

但情况完全不同。请帮帮我

JAVA代码

package com.atom.echallan.security.util;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

import com.atom.echallan.util.EChallanUtil;


public class AtomAES {

    private String password             = "8E41C78439831010F81F61C344B7BFC7";
    private String salt                 = "200000054575202";
    private static int pswdIterations   = 65536  ;
    private static int keySize          = 256;
    private final byte[] ivBytes        = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

    public AtomAES(){
        super();
    }

    public String encrypt(String plainText, String key, String merchantTxnId) throws Exception
    {
        this.password = key;
        // salt->200000054575202
        this.salt = merchantTxnId;

        return encrypt(plainText);
    }

    private String encrypt(String plainText) throws Exception {

        byte[] saltBytes = salt.getBytes("UTF-8");

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        PBEKeySpec spec = new PBEKeySpec(
                password.toCharArray(),
                saltBytes,
                pswdIterations,
                keySize
                );

        SecretKey secretKey = factory.generateSecret(spec);
        SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), "AES");

        //encrypt the message
        IvParameterSpec localIvParameterSpec = new IvParameterSpec(ivBytes);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); //CBC
        cipher.init(Cipher.ENCRYPT_MODE, secret,localIvParameterSpec);

        byte[] encryptedTextBytes = cipher.doFinal(plainText.getBytes("UTF-8"));

        return  byteToHex(encryptedTextBytes);

    }

    public String decrypt(String encryptedText, String key, String merchantTxnId) throws Exception {
        this.password = key;
        this.salt = merchantTxnId;
        return decrypt(encryptedText);
    }


    private String decrypt(String encryptedText) throws Exception {

        byte[] saltBytes = salt.getBytes("UTF-8");
        byte[] encryptedTextBytes = hex2ByteArray(encryptedText);

        // Derive the key
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        PBEKeySpec spec = new PBEKeySpec(
                password.toCharArray(),
                saltBytes,
                pswdIterations,
                keySize
                );

        SecretKey secretKey = factory.generateSecret(spec);
        SecretKeySpec secret = new SecretKeySpec(secretKey.getEncoded(), "AES");

        // Decrypt the message
        IvParameterSpec localIvParameterSpec = new IvParameterSpec(ivBytes);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//CBC
        cipher.init(Cipher.DECRYPT_MODE, secret,localIvParameterSpec);


        byte[] decryptedTextBytes = null;
        decryptedTextBytes = cipher.doFinal(encryptedTextBytes);

        return new String(decryptedTextBytes);
    }


  //Converts byte array to hexadecimal String
    private String byteToHex(byte byData[])
    {
        StringBuffer sb = new StringBuffer(byData.length * 2);

        for(int i = 0; i < byData.length; i++)
        {
            int v = byData[i] & 0xff;
            if(v < 16)
                sb.append('0');
            sb.append(Integer.toHexString(v));
        }

        return sb.toString().toUpperCase();
    }


    //Converts hexadecimal String to array of byte
    private byte[] hex2ByteArray(String sHexData)
    {
        byte rawData[] = new byte[sHexData.length() / 2];
        for(int i = 0; i < rawData.length; i++)
        {
            int index = i * 2;
            int v = Integer.parseInt(sHexData.substring(index, index + 2), 16);
            rawData[i] = (byte)v;
        }

        return rawData;
    }

    public static void main(String[] args)throws Exception{

        AtomAES aes = new AtomAES();

        String data = "mmp_txn=355106|mer_txn=M123|amt=100.0000|";
        String encData = aes.encrypt(data, EChallanUtil.ATOM_ENCRYPTION_KEY, "178");

        System.out.println("ENC DATA : " + encData);
        System.out.println("DEC DATA : " + aes.decrypt(encData, EChallanUtil.ATOM_ENCRYPTION_KEY, "178"));

    }
}
JAVA结果: ENC数据:
4bbb3755effef677cef1b5d55843e5025f65540df16afb3f2a0b7b91341e54fb0432eee2154a947dad013e8c99822d

PHP结果:
c43ba05ae04f68ae18313bc2042595fc70981e0d9421af9d232a3d17a01b5dd8dd8ce702230f6e49d918c9578f9c6944

我不知道为什么会这样。 字符串的长度相同,但结果不同。
如何获得与java相似的结果?

我已经用下面的代码解决了您的代码,希望这能对您有所帮助

    public function encrypt($data, $key = "4A8A53E16C9C34EA5E77EF9FF7B2FD04", $method = "AES-256-CBC") {


                    $salt="178";

                    //Converting Array to bytes
                    $iv = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
                    $chars = array_map("chr", $iv);
                    $IVbytes = join($chars);


                    $salt1 = mb_convert_encoding($salt, "UTF-8"); //Encoding to UTF-8
                    $key1 = mb_convert_encoding($key, "UTF-8"); //Encoding to UTF-8

                    //SecretKeyFactory Instance of PBKDF2WithHmacSHA1 Java Equivalent
                    $hash = openssl_pbkdf2($key1,$salt1,'256','65536', 'sha1'); 

                    $encrypted = openssl_encrypt($data, $method, $hash, OPENSSL_RAW_DATA, $IVbytes);

                    return bin2hex($encrypted);

}

1.确保生成的密钥等于2。您有不同的结果编码(十六进制与base64)。同样,您正在使用differet IV(在这两种情况下,IV都是以不安全的方式使用的),您能告诉我在php情况下,我应该为IV使用什么代码来匹配结果吗?ThanksIV需要是相同的,它通常是沿着CipherDemie java案例传递的随机数组,它是{1,2,3…}我不知道我应该用PHP写什么。它应该是16个字节,应该是一个字符串,Java它是一个数组。。。如何在PHP中实现同样的功能?您能帮我编写代码吗?感谢您的帮助..请注意解决方案不加密安全。使用static IV并重用相同的密钥(具有静态盐)可能不会产生完全安全的解决方案
    public function encrypt($data, $key = "4A8A53E16C9C34EA5E77EF9FF7B2FD04", $method = "AES-256-CBC") {


                    $salt="178";

                    //Converting Array to bytes
                    $iv = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
                    $chars = array_map("chr", $iv);
                    $IVbytes = join($chars);


                    $salt1 = mb_convert_encoding($salt, "UTF-8"); //Encoding to UTF-8
                    $key1 = mb_convert_encoding($key, "UTF-8"); //Encoding to UTF-8

                    //SecretKeyFactory Instance of PBKDF2WithHmacSHA1 Java Equivalent
                    $hash = openssl_pbkdf2($key1,$salt1,'256','65536', 'sha1'); 

                    $encrypted = openssl_encrypt($data, $method, $hash, OPENSSL_RAW_DATA, $IVbytes);

                    return bin2hex($encrypted);

}