首页 > 解决方案 > 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;
}

标签: phpopensslphp-5.6php-opensslphp-7.2

解决方案


从手册:

$iv 与 $password 的情况一样,是一个字节串。

看起来您已$iv编码为十六进制字符串:

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

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

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

同上$key


推荐阅读