【问题标题】:PHP Warning: openssl_decrypt(): IV passed is 32 bytes long which is longer than the 16 expected by selected cipherPHP 警告:openssl_decrypt():IV 传递的长度为 32 字节,比所选密码预期的 16 字节长
【发布时间】:2019-01-13 20:53:45
【问题描述】:

我需要在我的应用程序中实现 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;
}

【问题讨论】:

标签: php openssl php-5.6 php-openssl php-7.2


【解决方案1】:

解决方案是使用phpseclib/mcrypt_compat

composer require phpseclib/mcrypt_compat

【讨论】:

    【解决方案2】:

    来自手册:

    $iv 和 $password 一样,是一个字节串。

    您似乎将$iv 编码为十六进制字符串:

    $iv = '################################';
    

    您可能只需将其转换为二进制字节字符串:

    $iv = hex2bin('################################');
    

    $key 同上。

    【讨论】:

    • 我测试了你的建议并提出了这个错误,我正在尝试解决这个问题,但通知我的 maqui 中发生的错误:PHP Warning: hex2bin(): Input string must be hexadecimal string in ./descriptografa-senha.php on line 8\n PHP Stack trace: PHP 1. {main}() ./descriptografa-senha.php:0 PHP 2. hex2bin() ./descriptografa-senha.php:8
    • 好的...那么字符串是什么? Base64?
    • Alex Howansky,大哥我把代码放在C#里看看能不能给你解释一下问题,你帮我做对了
    • Alex Howansky,哥C#代码就在下面,我把你的名字放上就知道是引用你了
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 2011-09-23
    • 2023-03-31
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多