繁体   English   中英

PHP中的AES-Rijndael 128加密

[英]AES-Rijndael 128 encryption in Java from PHP

我在PHP中有一段代码

    function encrypt($data){
$data = "{\"userId\":11,\"email\":\"ssss.bansa11l1989@gmail.com\",\"firstName\":\"Ankit\",\"lastName\":\"Bansal\",\"displayName\":\"banank1989\",\"visitorId\":\"1222222234455\"}";

            $td = mcrypt_module_open('rijndael-128', '', 'cbc', $this->iv);

            mcrypt_generic_init($td, $this->key, $this->iv);
            $encrypted = mcrypt_generic($td, $data);

            mcrypt_generic_deinit($td);
            mcrypt_module_close($td);

            return bin2hex($encrypted);
        }

现在,当我尝试在java中编写相同的代码时,它给了我不同的输出

public String encrypt(String value) {
        try {

            value="{\"userId\":11,\"email\":\"ssss.bansa11l1989@gmail.com\",\"firstName\":\"Ankit\",\"lastName\":\"Bansal\",\"displayName\":\"banank1989\",\"visitorId\":\"1222222234455\"}";
            String initVector = "fedcba9876111111";
            String key = "012345678911111";
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

            byte[] encrypted = cipher.doFinal(value.getBytes());
            return new String(Base64.encodeBase64(encrypted));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

现在问题是两个代码都给了我相同的提供JSON的不同结果。

我无法更改PHP代码,所以我必须更改JAVA代码。

Java和PHP代码有所不同:

  • 在PHP代码中使用了Zero-Byte-Padding ,因为这是mcrypt的默认填充(参见此处 )。 相反,在Java代码中使用PKCS7-Padding(在Java中也称为PKCS5)。 到Java代码使用零字节填充,首先,通过更换停用PKCS7填充AES/CBC/PKCS5PADDINGAES/CBC/NoPadding 其次,手动实现零字节填充,即将n 0值( 0 <= n < 16 )添加到消息的字节序列,直到长度对应于块大小的整数倍(16字节)。
  • 在PHP代码中,加密数据以十六进制字符串形式返回。 相反,在Java代码中,加密数据返回Base64编码。 要更改后者,您必须将加密数据转换为十六进制字符串,请参阅例如如何将字节数组转换为Java中的十六进制字符串?

通过这些更改,如果使用相同的密钥和相同的IV,Java和PHP代码将产生相同的结果(顺便说一句,Java代码中的密钥长度为15字节,导致InvalidKeyException (Invalid AES key length: 15 bytes) )。

注意不推荐使用mcrypt并且Zero-Byte-Padding不可靠 如果您可以选择更改填充,则最好使用PKCS7。

您可以将代码运行的结果与http://www.maidoupig.cn/encode/aes的结果进行比较

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM