PHP 中的 C# TripleDES ECB 加密
C# TripleDES ECB Encryption in PHP
我主要使用 PHP,但我正在将数据发送到使用 C# 进行加密的 api,因此我尝试在 PHP 中加密密码,使用以下 C# 代码中使用的相同方法:
System.Security.Cryptography.TripleDESCryptoServiceProvider DES = new System.Security.Cryptography.TripleDESCryptoServiceProvider();
System.Security.Cryptography.MD5CryptoServiceProvider hashMD5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Key));
DES.Mode = System.Security.Cryptography.CipherMode.ECB;
System.Security.Cryptography.ICryptoTransform DESEncrypt = DES.CreateEncryptor();
Buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(Plaintext);
string TripleDES = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
return TripleDES;
这是我目前在 PHP:
function encryptData($key, $plainText)
{
$byte = mb_convert_encoding($key, 'ASCII');
$desKey = md5(utf8_encode($byte), true);
$data = mb_convert_encoding($plainText, 'ASCII');
// add PKCS#7 padding
$blocksize = mcrypt_get_block_size('tripledes', 'ecb');
$paddingSize = $blocksize - (strlen($data) % $blocksize);
$data .= str_repeat(chr($paddingSize), $paddingSize);
// encrypt password
$encData = mcrypt_encrypt('tripledes', $desKey, $data, 'ecb');
echo base64_encode($encData);
}
我知道我需要为 md5 函数添加 true 参数,我知道我需要添加 PKCS7 填充。
我还没有机会根据 C# 代码检查它,因为我仍在我的计算机上安装 visual studio。有什么我想念的吗?我需要添加 IV 吗?
编辑:我测试了 C# 代码,发现它没有给出相同的结果。我修复了一些问题,现在 PHP 中有来自 C# 的 DES.Key 和 Buffer 变量,给出了正确的结果。
再次编辑:已修复。我所要做的就是将前 8 个字符附加到散列键的末尾。
$desKey .= substr($desKey,0,8);
这是我最终想到的。到目前为止,它在我尝试过的几个例子中对我有用。
function encryptData($key, $plainText)
{
$byte = mb_convert_encoding($key, 'ASCII');
$desKey = md5(utf8_encode($byte), true);
$desKey .= substr($desKey,0,8);
$data = mb_convert_encoding($plainText, 'ASCII');
// add PKCS#7 padding
$blocksize = mcrypt_get_block_size('tripledes', 'ecb');
$paddingSize = $blocksize - (strlen($data) % $blocksize);
$data .= str_repeat(chr($paddingSize), $paddingSize);
// encrypt password
$encData = mcrypt_encrypt('tripledes', $desKey, $data, 'ecb');
echo base64_encode($encData);
}
encryptData('key', 'pass');
我主要使用 PHP,但我正在将数据发送到使用 C# 进行加密的 api,因此我尝试在 PHP 中加密密码,使用以下 C# 代码中使用的相同方法:
System.Security.Cryptography.TripleDESCryptoServiceProvider DES = new System.Security.Cryptography.TripleDESCryptoServiceProvider();
System.Security.Cryptography.MD5CryptoServiceProvider hashMD5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(Key));
DES.Mode = System.Security.Cryptography.CipherMode.ECB;
System.Security.Cryptography.ICryptoTransform DESEncrypt = DES.CreateEncryptor();
Buffer = System.Text.ASCIIEncoding.ASCII.GetBytes(Plaintext);
string TripleDES = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
return TripleDES;
这是我目前在 PHP:
function encryptData($key, $plainText)
{
$byte = mb_convert_encoding($key, 'ASCII');
$desKey = md5(utf8_encode($byte), true);
$data = mb_convert_encoding($plainText, 'ASCII');
// add PKCS#7 padding
$blocksize = mcrypt_get_block_size('tripledes', 'ecb');
$paddingSize = $blocksize - (strlen($data) % $blocksize);
$data .= str_repeat(chr($paddingSize), $paddingSize);
// encrypt password
$encData = mcrypt_encrypt('tripledes', $desKey, $data, 'ecb');
echo base64_encode($encData);
}
我知道我需要为 md5 函数添加 true 参数,我知道我需要添加 PKCS7 填充。
我还没有机会根据 C# 代码检查它,因为我仍在我的计算机上安装 visual studio。有什么我想念的吗?我需要添加 IV 吗?
编辑:我测试了 C# 代码,发现它没有给出相同的结果。我修复了一些问题,现在 PHP 中有来自 C# 的 DES.Key 和 Buffer 变量,给出了正确的结果。
再次编辑:已修复。我所要做的就是将前 8 个字符附加到散列键的末尾。
$desKey .= substr($desKey,0,8);
这是我最终想到的。到目前为止,它在我尝试过的几个例子中对我有用。
function encryptData($key, $plainText)
{
$byte = mb_convert_encoding($key, 'ASCII');
$desKey = md5(utf8_encode($byte), true);
$desKey .= substr($desKey,0,8);
$data = mb_convert_encoding($plainText, 'ASCII');
// add PKCS#7 padding
$blocksize = mcrypt_get_block_size('tripledes', 'ecb');
$paddingSize = $blocksize - (strlen($data) % $blocksize);
$data .= str_repeat(chr($paddingSize), $paddingSize);
// encrypt password
$encData = mcrypt_encrypt('tripledes', $desKey, $data, 'ecb');
echo base64_encode($encData);
}
encryptData('key', 'pass');