为什么我';我在C#和Python中得到了不同的结果
我正在努力用一个特定的键将一个字符串编码为SHA-256。 有一个python代码用作参考。 问题是我无法在C#中获得相同的结果 C# 有什么不对劲吗为什么我';我在C#和Python中得到了不同的结果,python,c#,cryptography,Python,C#,Cryptography,我正在努力用一个特定的键将一个字符串编码为SHA-256。 有一个python代码用作参考。 问题是我无法在C#中获得相同的结果 C# 有什么不对劲吗 谢谢当你说“不能得到同样的结果”时,到底有什么不同?您是否尝试过跟踪每个程序以查看结果的分歧?你知道哪一个是正确的吗?@KarlKnechtel pyton是正确的,pyton输出76687ffe5c516c793faa46fafba094e7ca7a6d735966e0e0c0b65eaa43bdca0,而C#4417784269b2d590b
谢谢当你说“不能得到同样的结果”时,到底有什么不同?您是否尝试过跟踪每个程序以查看结果的分歧?你知道哪一个是正确的吗?@KarlKnechtel pyton是正确的,pyton输出76687ffe5c516c793faa46fafba094e7ca7a6d735966e0e0c0b65eaa43bdca0,而C#4417784269b2d590b509d47829e8e8f70a05ee4e0d8ce3949286a6886b289b1fokay,所以下一件事是检查是否解码,
keyBytes
等。获取Python程序对应的正确值。在HmacSha256Digest()
中,替换行var keyBytes=Encoding.UTF8.GetBytes(secret)代码>带有var keyBytes=Convert.FromBase64String(secret)
调用HmacSha256Digest()
时,只需将Base64编码键(JcyV…uoc=
)作为第二个参数传递(调用var decodedKey=Base64Decode(key);
和方法Base64Decode(key)
不需要)。@Topaco谢谢!成功了!我怎样才能把你的回答标记为答案?
import base64
import hmac
import hashlib
# Base64 encoded key (get it with /hook/{hookId}/key request)
webhook_key_base64 = 'JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc='
# notification parameters
data = '643|1|IN|+79165238345|13353941550'
webhook_key = base64.b64decode(s))
print(hmac.new(webhook_key, data.encode('utf-8'), hashlib.sha256).hexdigest())
public class Program
{
public static void Main()
{
var key = "JcyVhjHCvHQwufz+IHXolyqHgEc5MoayBfParl6Guoc=";
var message = "643|1|IN|+79165238345|13353941550";
var decodedKey = Base64Decode(key);
var result = HmacSha256Digest(message, decodedKey);
Console.WriteLine(result);
Console.ReadLine();
}
private static string HmacSha256Digest(string message, string secret)
{
var keyBytes = Encoding.UTF8.GetBytes(secret);
var messageBytes = Encoding.UTF8.GetBytes(message);
var cryptographer = new HMACSHA256(keyBytes);
var bytes = cryptographer.ComputeHash(messageBytes);
return BitConverter.ToString(bytes).Replace("-", "").ToLower();
}
private static string Base64Decode(string base64EncodedData)
{
var base64EncodedBytes = Convert.FromBase64String(base64EncodedData);
return Encoding.UTF8.GetString(base64EncodedBytes);
}
}