gpt4 book ai didi

c# - C# 和 PHP 中的 TripleDES 加密结果不一样(PKCS7、ECB)?

转载 作者:可可西里 更新时间:2023-11-01 00:07:09 24 4
gpt4 key购买 nike

我已经花了几个小时试图解决这个问题,但就是无法让它发挥作用。我有一个需要在 php 中匹配的 C# 加密例程。我无法更改 C# 版本,这不是一个选项(第 3 方对此很坚定)。

这是 C# 代码:

//In C#
// Console.WriteLine(ApiEncode("testing", "56dsfkj3kj23asdf83kseegflkj43458afdl"));
// Results in:
// XvHbR/CsLTo=
public static string ApiEncode(string data, string secret)
{
byte[] clear;

var encoding = new UTF8Encoding();
var md5 = new MD5CryptoServiceProvider();

byte[] key = md5.ComputeHash(encoding.GetBytes(secret));

TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = key;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;

byte[] input = encoding.GetBytes(data);
try { clear = des.CreateEncryptor().TransformFinalBlock(input, 0, input.Length); }
finally
{
des.Clear();
md5.Clear();
}

return Convert.ToBase64String(clear);
}

这是我在 PHP 中得到的最好的东西:

//In PHP
// echo apiEncode("testing", "56dsfkj3kj23asdf83kseegflkj43458afdl");
// Results in:
// 5aqvY6q1T54=
function apiEncode($data, $secret)
{
//Generate a key from a hash
$key = md5(utf8_encode($secret), true);
//Create init vector
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_ecb), MCRYPT_RAND);

//Pad for PKCS7
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);

//Encrypt data
$encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); //, $iv);
return base64_encode($encData);
}

据我所知,我正在 PHP 端正确处理 PKCS7 填充。我不确定还能尝试什么。

需要注意的一件事是,C# 发生在 Windows 上,而 PHP 发生在 Linux 上,不确定这是否会有所不同。

最佳答案

您的 PHP 版本中的填充长度基于密码的长度。这是不正确的。它应该基于您的消息的长度。

尝试替换 strlen($password)strlen($data) .


第二个问题是 mcrypt库需要 24 字节的 key 。 Triple DES 应用常规DES 三次,所以可以将每轮DES 中使用的8 字节 key 称为K 1、K 2 和K 3 。有不同的方法来选择这些键。最安全的方法是选择三个不同的 key 。另一种方法是设置 K 3 等于 K 1。最不安全的方法(相当于 DES)是使 K 1 = K 2 = K 3。

大多数库都足够“聪明”,可以将 16 字节的 3DES key 解释为上面的第二个选项:K 3 = K 1。 .NET 实现正在为您执行此操作,但是 mcrypt图书馆不是;相反,它设置 K 3 = 0。你需要自己解决这个问题,并传递 mcrypt一个 24 字节的 key 。

计算完 MD5 哈希后,取 $key 的前 8 个字节, 并将它们附加到 $key 的末尾, 这样您就有一个 24 字节的值传递给 mcrypt_encrypt() .

关于c# - C# 和 PHP 中的 TripleDES 加密结果不一样(PKCS7、ECB)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4695414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com