我正在对文件的二进制内容进行哈希处理,然后将哈希值与该文件的内容一起发送到第三方Web服务。他们将验证哈希与文件是否匹配。
我正在使用WinRTCrypto.HashAlgorithmProvider和SHA-256算法
var cryptoProvider = WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Sha256);
var hash_VA = this.cryptoProvider.HashData(this.DocumentBytes);
hash_VA
导致一个32字节的字节数组。如果我将其转换为基数64
var hashBase64_VA = Convert.ToBase64String(hash_VA);
我得到的字符串长度为 44 个字符。麻烦的是,第3个Web服务正在获取 88 个字符的基数64哈希。
如果我将字节转换为十六进制,则会得到 64 个字符
BitConverter.ToString(this.cryptoProvider.HashData(bytesFromHex)).Replace("-", String.Empty)
64但是不是88,但是如果我使用该十六进制字符串,例如
DBA70AB40B20A4F09C15A5908D31360F39CFBF20A0458F49641B0D9670689985
并将其放入https://www.base64encode.org/中,它确实将其编码为88个字符。
如何在C#中生成基于88个字符的64个字符串?我显然在这里缺少一些基本知识
答案 0 :(得分:0)
您可以将哈希转换为十六进制,然后对它进行base64编码:
using PCLCrypto;
using System;
using System.Text;
namespace SOcrypto
{
class Program
{
static string Hex(byte[] bb)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bb.Length; i++)
{
sb.Append(bb[i].ToString("X2"));
}
return sb.ToString();
}
static void Main(string[] args)
{
var testData = Encoding.Unicode.GetBytes("Hello, World!");
var cryptoProvider = WinRTCrypto.HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Sha256);
var hash_VA = cryptoProvider.HashData(testData);
Console.WriteLine("hash_VA.Length = " + hash_VA.Length);
var asHex = Hex(hash_VA);
var asB64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(asHex));
Console.WriteLine("asB64.Length = " + asB64.Length);
Console.ReadLine();
}
}
}
输出:
hash_VA.Length = 32
asB64.Length = 88