我目前正在用C#编写程序。当我尝试将字符串从sha256传递到base64时,我意识到它的编码方式不正确。
例如,给定sha256
cd69ef0284bba33bc0b320e6479c2da2d411a5e46af060d8639f0e0bfc24f26d
我的代码产生
Y2Q0Q2OUVGMDI4NEJCQTMzQkMwQjMyMEU2NDc5QzJEQTJENDExQTVFNDZBRjA2MEQ4NjM5RjBFMEJGQzI0RjI2RA==
我期望得到的是
zWnvAoS7ozvAsyDmR5wtotQRpeRq8GDYY58OC/wk8m0
为什么编码后的字符串如此不同,我想念什么?
这是我正在使用的代码
string t1 ="cd69ef0284bba33bc0b320e6479c2da2d411a5e46af060d8639f0e0bfc24f26d";
var t2= System.Text.Encoding.GetEncoding(1252).GetBytes(t1);
string t3= System.Convert.ToBase64String(t2);
答案 0 :(得分:4)
SHA-256的输出是一个二进制值,通常表示为字节数组。您已经将其转换为十六进制字符串,然后对该十六进制字符串进行base64编码。
相反,您应该对原始二进制数据进行base64编码,而不必先将其转换为十六进制。
如果必须首先通过十六进制,则应将其解析回原始字节,然后然后 base64对结果进行编码:
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
string text = "cd69ef0284bba33bc0b320e6479c2da2d411a5e46af060d8639f0e0bfc24f26d";
byte[] data = ParseHex(text);
Console.WriteLine(Convert.ToBase64String(data));
}
// Taken from https://stackoverflow.com/questions/795027/code-golf-hex-to-raw-binary-conversion/795036#795036
static byte[] ParseHex(string text)
{
Func<char, int> parseNybble = c => (c >= '0' && c <= '9') ? c-'0' : char.ToLower(c)-'a'+10;
return Enumerable.Range(0, text.Length/2)
.Select(x => (byte) ((parseNybble(text[x*2]) << 4) | parseNybble(text[x*2+1])))
.ToArray();
}
}
...但是最好不要将散列转换为十六进制开头。