SHA1 Python到C#的转换
我有下面一段python代码,我正试图将其转换为C。C#实现的结果不同于python。有人能解释一下这个代码在做什么吗? 关于转换成C#有什么建议吗 输入为:user@me.com Python代码:SHA1 Python到C#的转换,c#,python,cryptography,sha1,C#,Python,Cryptography,Sha1,我有下面一段python代码,我正试图将其转换为C。C#实现的结果不同于python。有人能解释一下这个代码在做什么吗? 关于转换成C#有什么建议吗 输入为:user@me.com Python代码: def encode_username(u): d = hashlib.sha1(u).digest() return base64.b32encode(d).lower() 结果:'2hg7ic5ttw4cgfo5kfnjhtqwbq73l6rl' 我的C#代码: 结果:“D1
def encode_username(u):
d = hashlib.sha1(u).digest()
return base64.b32encode(d).lower()
结果:'2hg7ic5ttw4cgfo5kfnjhtqwbq73l6rl'
我的C#代码:
结果:“D1CDF40BB39DB82315DD515A93CE160C3FB5FA2B”
Base32参考:避免使用
编码。默认值
(你能告诉它是什么吗?)并使用你知道另一部分(Python)正在使用的编码,例如编码。UTF8
否则,我们可能需要查看您的
Base32.tobase32字符串的代码,以查看输入或输出是否不同。避免使用编码。默认值(您能告诉它是什么吗?)并使用您知道另一部分(Python)正在使用的代码,例如编码.UTF8
否则,我们可能需要查看Base32.ToBase32String的代码,以查看输入或输出是否不同。C#
python
C#
python
您链接到atrevido.net的代码无法生成您描述的输出(D1CD…
),因为该代码根本不使用字符1
(请参见它的ValidChars
常量,该常量使用非常非标准的base32字符映射,除此之外还缺少1
和0
)
事实上,您为C#提供的输出字符串只包含字符0-9A-F
,这使我认为它是十六进制的。接着,hashlib.sha1的python输出user@me.com“).hexdigest().upper()
实际上是您从C#收到的字符串<代码>D1CDF40BB39DB82315DD515A93CE160C3FB5FA2B
因此,问题在于,您在.Net下使用的任何代码都不会进行任何类型的base32编码,而是base16/hexidecimal。您需要在python下使用十六进制,或者在.Net下使用真正的base32实现
(另外,正如其他人所建议的,您应该使用Encoding.UTF8.GetBytes
,否则您将在不同的计算机上获得不一致的行为)。链接到atrevido.net的代码无法生成您描述的输出(D1CD…
),因为该代码根本不使用字符1
)(请参见它的ValidChars
常量,它使用非常非标准的base32字符映射,并且除其他外,它缺少1
和0
)
事实上,您为C#提供的输出字符串只包含字符0-9A-F
,这使我认为它是十六进制的user@me.com“).hexdigest().upper()
实际上是您从C#…D1CDF40BB39DB82315DD515A93CE160C3FB5FA2B
收到的字符串
因此,问题在于,您在.Net下使用的任何代码都不是在进行任何类型的base32编码,而是base16/hexidecimal。您需要在python下使用hex,或者在.Net下使用真正的base32实现
(另外,正如其他人所建议的,您应该使用编码.UTF8.GetBytes
,否则您将在不同的计算机上获得不一致的行为)。Base32.ToBase32String
不是标准的,您能告诉我们该实现吗?它可能取决于两种语言之间获取字节的方式(即编码),或者字符串是如何构造的,当然还有其他一些。可能字符串编码中存在编码问题。默认值。GetBytes(用户名)返回电脑当前的ANSI编码,它可能返回的字节数与python编码的字节数不同。@失望先生从.NET库上的链接文章中更新了我的问题:“请注意,这不符合Base32标准编码,但使用它自己的一组字符…”Base32。ToBase32String
不是标准的,您能告诉我们该实现吗?它可能取决于两种语言之间获取字节的方式(即编码),或者字符串是如何构造的,当然还有其他一些。可能字符串编码中存在编码问题。默认情况下。GetBytes(用户名)返回电脑当前的ANSI编码,它可能返回的字节与python编码的字节不同。@Dression先生从.NET库的链接文章中更新了我的问题:请注意,这不符合Base32标准编码,但使用它自己的一组字符。。。"这是我得到的:C#结果:D1CDF40BB39DB82315DD515A93CE160C3FB5FA2B Python结果:2hg7ic5ttw4cgfo5kfnjhtqwbq73l6rl文本是:user@me.com@Prashant-您是否尝试了编码:encoding.utf8这是我得到的结果:C#结果:D1CDF40BB39DB82315DD515A93CE160C3FB5FA2B Python结果:2hg7ic5ttw4cgfo5kfnjhtqwbq73l6rl文本是:user@me.com@Prashant-您是否尝试过编码:encoding.UTF8
string EncodeUsername(string username)
{
var sh = SHA1.Create();
var bytes = sh.ComputeHash(Encoding.Default.GetBytes(username));
return Base32.ToBase32String(bytes);
}
private static SHA1CryptoServiceProvider SHA = new SHA1CryptoServiceProvider();
private static string CalculateSHA1(string text, Encoding enc)
{
byte[] buffer = enc.GetBytes(text);
return BitConverter.ToString(SHA.ComputeHash(buffer)).Replace("-", "");
}
def encode_username(u):
return hashlib.sha1(u.encode('utf-8'));