【发布时间】:2013-01-27 19:33:04
【问题描述】:
我正在做一个项目,我有一个 C# 应用程序,它有一个加密类,可以执行字符串值的加密和解密。我现在想使用 PHP 制作一个 Web 界面来与我的 C# 应用程序一起工作。
我正在尝试执行与我的 C# 项目在我的 PHP 网站中执行的相同类型的加密,但我无法弄清楚我需要做什么。
以下是我的 C# 应用程序的代码。
public static string encrypt(string encryptionString)
{
byte[] clearTextBytes = Encoding.UTF8.GetBytes(encryptionString);
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
MemoryStream ms = new MemoryStream();
byte[] rgbIV = Encoding.ASCII.GetBytes("PRIVATE");
byte[] key = Encoding.ASCII.GetBytes("PRIVATE");
CryptoStream cs = new CryptoStream(ms, rijn.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write);
cs.Write(clearTextBytes, 0, clearTextBytes.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
我正在我的 PHP Web 界面中尝试以下代码
define("CIPHERKEY", "PRIVATE");
function encrypt($data)
{
//$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_ECB, '');
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
//$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($cipher), MCRYPT_RAND);
$iv = 'PRIVATE';
//$key = substr(CIPHERKEY, 0, mcrypt_enc_get_key_size($cipher));
$key =CIPHERKEY;
if (mcrypt_generic_init($cipher, $key, $iv) != 1)
{
$cipherData = mcrypt_generic($cipher, $data);
mcrypt_generic_deinit($cipher);
mcrypt_module_close($cipher);
$sanitizedCipherData = trim(base64_encode($cipherData));
return $sanitizedCipherData;
}
}
我尝试了各种变体,但找不到正确的方法。
iv 变量使用与 C# 应用程序中的 rgbIV 变量相同的密钥,PHP Web 界面中的 CIPHERKEY 使用与我的 c# 应用程序中的密钥变量相同的密钥。
感谢您提供的任何帮助
更新
目前,我不断得到不同的结果。我通过传入字符串password 对其进行测试。
在上面的 PHP 代码中,我得到 NHHloywxlybbANIH5dS7SQ== 作为加密字符串。
但是,使用相同的字符串,我得到n86Mwc5MRXzhT3v3A/uxEA== 的结果
【问题讨论】:
-
有什么问题 - 你得到一个错误或不同的结果?您能否提供一些示例来展示您所看到的差异?
-
@PinnyM 我在问题中添加了更多信息,在回答您的问题时,我在 PHP 和 C# 之间得到了不同的结果
-
你真的需要复制这个 C# 代码吗?它有相当多的缺陷。例如,它不使用 IV。 IV 不是一种钥匙。对于每个加密,它应该是不同的值,对于 CBC,它应该是不可预测的随机值。
-
.NET 默认为 CBC 块模式,您的 PHP 指定 ECB。
-
切向相关:您的 C# 代码正在使用 4 个实现
IDisposable的类(我可以看到)。这些最好包含在using语句中。
标签: c# php encryption aes