在PHP的mcrypt_decrypt()函数中要添加哪些参数

本文关键字:添加 参数 函数 PHP mcrypt decrypt | 更新日期: 2023-09-27 18:19:36

我有下面的C#代码,但我很难添加PHP的参数mcrypt_decrypt()。

  private string Decrypt(string strText, string sDecrKey)
    {
        string message;
        byte[] rgbKey = new byte[0];
        byte[] rgbIV = new byte[] { 0x12, 0x34, 0x56, 120, 0x90, 0xab, 0xcd, 0xef };
        byte[] buffer = new byte[strText.Length + 1];
        try
        {
            rgbKey = Encoding.UTF8.GetBytes(Strings.Left(sDecrKey, 8));
            DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
            buffer = Convert.FromBase64String(strText);
            MemoryStream stream2 = new MemoryStream();
            CryptoStream stream = new CryptoStream(stream2, provider.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
            stream.Write(buffer, 0, buffer.Length);
            stream.FlushFinalBlock();
            message = Encoding.UTF8.GetString(stream2.ToArray());
        }
        catch (Exception exception1)
        {
            ProjectData.SetProjectError(exception1);
            Exception exception = exception1;
            message = exception.Message;
            ProjectData.ClearProjectError();
            return message;
            ProjectData.ClearProjectError();
        }
        return message;
    }

字符串mcrypt_decrypt(字符串$cipher,字符串$key,字符串$data,string$mode[,string$iv])

我的数据是:"iHcKDE0aeDZU3q31ULZcvQ=="

密钥-:"&%#@?,:*"

我想使用PHP mcrypt_decrypt()函数来解密这些数据。我对C#的了解很少,但PHP很好。请帮我解决

<?php
$key = pack("nvc*",0x12, 0x34, 0x56, 120, 0x90, 0xab, 0xcd, 0xef);
$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB)
$ciphertext_dec = base64_decode("iHcKDE0aeDZU3q31ULZcvQ==");
$iv_dec = substr($ciphertext_dec, 0, $iv_size);
$retval = mcrypt_decrypt(MCRYPT_3DES, $key, $ciphertext_dec, MCRYPT_MODE_CFB, $iv_dec);
echo $retval;
?>

在PHP的mcrypt_decrypt()函数中要添加哪些参数

从外观上看,您需要创建一个iv,而不是在$key上运行substr。您使用mcrypt_get_key_size(cipher, mode) substr密钥,这似乎是在使用iv

$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

并且iv应该来自随机源,而不是$key。不过,iv是可选的。这是我唯一能看到的问题。

这是旧的,但当我写的时候,它对我来说很好。Cipher.php

<?php
function encrypt($data, $key = null, $iv = null) {
    $key = (strlen($key) == 0) ? $key = null : $key;
    $key_size = mcrypt_get_key_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
    $key = hash("sha256", $key, true); 
    $key = substr($this->key, 0, $key_size);
    if ($iv == null) {
        $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    }
    $out = mcrypt_encrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CFB, $iv); 
    return base64_encode($out);
}
function decrypt($data, $key = null, $iv = null) {
    $key = (strlen($key) == 0) ? $key = null : $key;
    $key_size = mcrypt_get_key_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
    $key = hash("sha256", $key, true); 
    $key = substr($this->key, 0, $key_size);
    if ($iv == null) {
        $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB); 
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    }
    $data = base64_decode($data); 
    $out = mcrypt_decrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_CFB, $iv);
}
$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$encrypted = encrypt('my data.', 'my secret key', $iv);
$decrypted = decrypt($encrypted, 'my secret key', $iv);
# $decrypted = 'my data.'
?>

更新

我已经更新了Cipher.php以便于交互。您不再需要专门化ivCipher::encrypt设置它并将其附加到加密数据。CCD_ 12然后在对加密数据进行解密之前对其进行提取。

IV只是为了给加密例程提供一个替代种子。这个IV根本不需要是秘密,尽管它可能是可取的。您甚至可以将其与密文一起发送,而不会失去安全性。