Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.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和PHP的AES CBC 128位加密_Java_Php_Cryptography_Aes_Php Openssl - Fatal编程技术网

使用Java和PHP的AES CBC 128位加密

使用Java和PHP的AES CBC 128位加密,java,php,cryptography,aes,php-openssl,Java,Php,Cryptography,Aes,Php Openssl,我最近在Java中使用了AES CBC 128算法来加密数据。现在我需要用PHP重建算法,但我不知道如何重建,因为互联网上的PHP算法返回不同的结果。也许你能帮我 这是要加密的Java代码: private SecretKeySpec secretKey; private IvParameterSpec ivSpec; public void setKey(String myKey) { MessageDigest sha = null; try { byte[

我最近在Java中使用了AES CBC 128算法来加密数据。现在我需要用PHP重建算法,但我不知道如何重建,因为互联网上的PHP算法返回不同的结果。也许你能帮我

这是要加密的Java代码:

private SecretKeySpec secretKey;
private IvParameterSpec ivSpec;

public void setKey(String myKey) {
    MessageDigest sha = null;
    try {
        byte[] key = myKey.getBytes("UTF-8");
        sha = MessageDigest.getInstance("SHA-1");
        key = sha.digest(key);
        key = Arrays.copyOf(key, 16);
        secretKey = new SecretKeySpec(key, "AES");

        byte[] iv = new String("1010101010101010").getBytes("UTF-8");
        ivSpec = new IvParameterSpec(iv);

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

public String encrypt(String strToEncrypt) {
    try {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
        return Base64.encode(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public String decrypt(String strToDecrypt) {
    try {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
        return new String(cipher.doFinal(Base64.decode(strToDecrypt)));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public static void main(String[] args) {

    AESText aes = new AESText();
    final String secretKey = "com.secure.test.projectjasdS/FjkGkGhkGjhG786Vjfg=tjGFGH";
    aes.setKey(secretKey);

    String originalString = "test set se ts et set s et se";
    String encryptedString = aes.encrypt(originalString);
    String decryptedString = aes.decrypt(encryptedString);

    System.out.println("origin: " + originalString);
    System.out.println("encrypted: " + encryptedString);
    System.out.println("decrypted: " + decryptedString);
}
这是我的php代码:

    protected $key;
    protected $method = 'AES-128-CBC';
    protected $iv = '1010101010101010';
    protected $option = OPENSSL_CIPHER_AES_128_CBC;

    function __construct($key)
    {
        $this->key = $key;
    }

    public function encrypt($data) {
        if (is_null($data)) {
            return "Error " . INVALID_PARAMS_ENCRYPTIONS . ": Data is null ";
        }
        $enc = openssl_encrypt($data, $this->method, $this->key, $this->option, $this->iv);
        return base64_encode($enc);
    }

    public function decrypt($data) {
        if (is_null($data)) {
            return "Error " . INVALID_PARAMS_ENCRYPTIONS . ": Data is null ";
        }
        $data = base64_decode($data);
        $dec = openssl_decrypt($data, $this->method, $this->key, $this->option, $this->iv);
        return $dec;
    }
当我从java加密加密数据时,这个结果不能在Php解密时解密


你们能帮我构建一个PHP脚本,它返回与java加密相同的结果吗?

乍一看,这里有三个问题:

首先:您使用的模式不同:在java中,您使用的是
AES/ECB/PKCS5Padding
,而php使用的是
AES-128-CBC

Second:您可能在Java和PHP代码中没有使用相同的IV(IV与ECB无关,但一旦您将Java切换到CBC,您将需要它):

php中有
$iv='1010101010101010'
(然后传递到openssl),但java中没有类似的内容

至少,在Java部件中,您可能也需要类似的东西:

cipher.init(Cipher.DECRYPT_MODE/ENCRYPT_MODE, secretKey, new IvParameterSpec(iv))
iv
是包含iv字节的
字节[]

Third:一旦上述问题得到解决,填充可能是下一个突破性的问题:java密码规范提到了
PKCS5Padding
。你需要确保你的两个对手使用相同的

编辑:Fourth:还有一个问题是如何导出要使用的关键位。在java中,获取sha1散列的前16个字节,在php中,只需将
$key
传递给openssl。openssl可能以不同的方式派生加密密钥



当使用块密码构建与密码学相关的工具时,重温维基百科和维基百科上的经典著作总是很好的,以了解引擎盖下正在发生的事情。

谢谢@Shastick。我是加密的初学者。我已经编辑了我的java代码。当我在java中使用
PKCS5Padding
时,它是有效的,但当我使用
NoPadding
时,我得到了错误
javax.crypto.IllegalBlockSizeException:输入长度不是16字节的倍数
。但是,当我添加
IV
并使用
PKCS5Padding
ECB
更改为
CBC
时,java和php之间的加密不匹配。你能帮我编辑我的代码吗?嗯,当输入长度不是16的倍数时,填充是用来填充整个代码的,正如例外情况中提到的:)你可能需要多玩一点,并查找一些教程才能正确地使用它。