无法匹配PHP和JAVA中加密的有效负载字符串repsonse

无法匹配PHP和JAVA中加密的有效负载字符串repsonse,java,php,encryption,initialization-vector,Java,Php,Encryption,Initialization Vector,我试图在PHP和JAVA中加密json数据。但无法匹配两者的响应 我们可以根据特定参数生成IV(初始化向量)值吗? 在PHP中,我们有函数要做。我尝试使用下面的函数加密数据,并将$iv作为参数之一传递 $secretKey= 'BDGAJDL7AGSNPBST'; PHP: $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($iv_size, MCRYPT_RA

我试图在
PHP
JAVA
中加密json数据。但无法匹配两者的响应

我们可以根据特定参数生成IV(初始化向量)值吗? 在PHP中,我们有函数要做。我尝试使用下面的函数加密数据,并将
$iv
作为参数之一传递

$secretKey= 'BDGAJDL7AGSNPBST';
PHP:

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
                         (or)
$iv = bin2hex(openssl_random_pseudo_bytes(static::INIT_VECTOR_LENGTH / 2));

// Encrypt input text
$encryptedPayload = openssl_encrypt($plainText,static::CIPHER,$secretKey,OPENSSL_RAW_DATA,$iv);
                         (or)
$encryptedPayload = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secretKey, $plainText, MCRYPT_MODE_CBC, $iv);
上面的PHP函数总是返回不同的值。IV意味着每次都提供独特的价值

我试图匹配下面JAVA代码的返回值。它总是返回相同的加密字符串

JAVA

try{    
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
     SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes(UTF_8), "AES");   
     cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(encryptionKey.getBytes(UTF_8)));
     response = cipher.doFinal(convertPOJOtoJSON(user).getBytes(UTF_8));
}catch (Exception e) {
    //
}
return response;

您真的不必“匹配”IV。IV和HMAC应该附加到密文中。只要PHP和JS以同样的方式从密文字符串解析IV和HMAC,您就可以了

IV实际上只是一个特定长度的随机字符串,用于对加密进行种子/加密,不依赖于密钥

HMAC是密文的散列(取决于密钥),用于在解密之前验证密文。此HMAC与IV一起附加到密文中。在解密之前,您将对密文进行散列,并将其与附加到密文中的散列进行比较。如果它们匹配,则没有任何内容被篡改。如果它们不匹配,你应该考虑数据会被破坏。

我建议您根据加密需要使用libnaudio库。它现在是PHP最新版本的本机版本,您也可以在JS中找到它

这是一个好医生,让你开始


请注意,Java代码从
encryptionKey
获取IV。。。在php中不能这样做。。。。根本不应该这么做。从加密密钥导出IV不是一件非常明智的事情。@ElliottFrisch你能建议我如何在PHP中实现这一点吗?@LukeJoshuaPark我觉得这可能是因为IV生成的随机字节。谢谢@Joseph_J,我称之为内置java服务,这需要相同的加密字符串,因为它们使用加密字符串生成Hmac,并从末端匹配Hmac。当我解密我的加密字符串时,我可以看到纯文本。它不是JS,而是Java.Oops,很抱歉JS/Java混淆了,你也可以找到Java版的libnaid。我很抱歉。我不完全理解你的问题。在您的代码中,我看不到您在加密过程中将IV或HMAC追加到密码文本的位置。我看不出你在哪里解析IV,或者HMAC解密。请研究我答案中的最后一个链接。它向您展示了正确的处理,您只需采用您选择使用的加密类的逻辑。。。过程是一样的。也许可以更新你的问题,对你的问题进行更明确的描述。