php - PHP 警告:openssl_decrypt():IV 传递的长度为 32 个字节,比所选密码预期的 16 个字节长
问题描述
我需要在我的应用程序中实现 openSSL,因为我们必须将版本从 5.6 更改为 7.2
我想了解如何解决这个问题。
对我的环境或我如何使用该应用程序产生的任何疑问,只要问我会回复。
<?php
$dados = '#########################################################';
$key = '################################';
$iv = '################################';
/**
* running in version 7.2
*/
$data = openssl_decrypt($dados, 'AES-128-CBC', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
/**
* Erro:
* $ clear && ./php descriptografa-senha.php
*
* PHP Warning: openssl_decrypt(): IV passed is 32 bytes long which is longer than the 16 expected by selected cipher, truncating in ./descriptografa-senha.php on line 12
* PHP Stack trace:
* PHP 1. {main}() ./descriptografa-senha.php:0
* PHP 2. openssl_decrypt() ./descriptografa-senha.php:12
*
* Warning: openssl_decrypt(): IV passed is 32 bytes long which is longer than the 16 expected by selected cipher, truncating in ./descriptografa-senha.php on line 12
*
* Call Stack:
* 0.4121 125736 1. {main}() ./descriptografa-senha.php:0
* 0.4121 126312 2. openssl_decrypt() ./descriptografa-senha.php:12
*/
/**
* running in version 5.6
*/
$mcrypt_cipher = MCRYPT_RIJNDAEL_256;
$mcrypt_mode = MCRYPT_MODE_CBC;
$encrypted = $dados;
$iv_utf = mb_convert_encoding($iv, 'UTF-8');
$decrypted = mcrypt_decrypt($mcrypt_cipher, $key, base64_decode($encrypted), $mcrypt_mode, $iv_utf);
print_r($decrypted);
/**
* performed normally
*/
这是生成加密的代码,看看你是否能理解并帮助我解决问题,用于加密的语言是 C#,解密的语言是 PHP 7.2
public static string Cryptography(string text, string pass = "#############################")
{
if (string.IsNullOrEmpty(pass))
return string.Empty;
var rijndaelmanaged = new RijndaelManaged();
rijndaelmanaged.KeySize = 256;
rijndaelmanaged.BlockSize = 256;
rijndaelmanaged.Padding = PaddingMode.PKCS7;
rijndaelmanaged.Key = Convert.FromBase64String(Base64Encode(pass));
rijndaelmanaged.IV = Convert.FromBase64String(Base64Encode(vetorInicializacao));
var encrypt = rijndaelmanaged.CreateEncryptor(rijndaelmanaged.Key, rijndaelmanaged.IV);
byte[] xBuff = null;
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
{
byte[] xXml = Encoding.UTF8.GetBytes(text);
cs.Write(xXml, 0, xXml.Length);
}
xBuff = ms.ToArray();
}
String out = Convert.ToBase64String(xBuff);
return out;
}
解决方案
从手册:
$iv 与 $password 的情况一样,是一个字节串。
看起来您已$iv
编码为十六进制字符串:
$iv = '################################';
您可能只需要将其转换为二进制字节字符串:
$iv = hex2bin('################################');
同上$key
。
推荐阅读
- html - 并且居中对齐在同一行不起作用
- python - Seaborn Barplot 估计器来计算和绘制类别明智的百分比
- r - 将两组与线性模型进行比较
- azure - Azure Function(C#):如何将大量文件从 blob 容器 A 复制到另一个 blob 容器 B?(函数在 10 分钟内超时)
- python - 使用旋转字母进行加密和解密
- ruby-on-rails - 如何在 Ruby 的课堂上创建一个方法?我想在范围内使用
- python - 当蜘蛛遇到scrapy和Rabbitmq(pika)错误时如何重新排队消息
- c# - 如何通过 api c# 在谷歌云中创建 postgres 数据库
- css - 如何更改 React 图标的填充颜色?
- database - oracle中如何使用通配符?