在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;
?>
从外观上看,您需要创建一个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以便于交互。您不再需要专门化iv
,Cipher::encrypt
设置它并将其附加到加密数据。CCD_ 12然后在对加密数据进行解密之前对其进行提取。
IV只是为了给加密例程提供一个替代种子。这个IV根本不需要是秘密,尽管它可能是可取的。您甚至可以将其与密文一起发送,而不会失去安全性。