gpt4 book ai didi

c# - 检索哈希值后使用 c# HashAlgorithm

转载 作者:行者123 更新时间:2023-11-30 14:32:28 46 4
gpt4 key购买 nike

我有一个散列算法对象(在本例中为 SHA1),我向其提供数据,以便在调用 Result 属性时最终获得散列结果。

问题是一旦调用了 m_HashAlgorithm.Hash 属性,该对象就不能再用于喂食。如果我尝试喂它,我会得到:System.Security.Cryptography.CryptographicUnexpectedOperationException:在检索哈希值之前必须完成哈希。

我需要能够获得一个中间散列结果,但继续提供并稍后获得另一个结果。有办法实现吗?

private readonly HashAlgorithm m_HashAlgorithm;

public DigitalSignatureCreator(HashAlgorithm hashAlgorithm)
{
m_HashAlgorithm = hashAlgorithm;

m_MemoryStreamEncrypt = new MemoryStream();
m_CryptoStreamEncrypt = new CryptoStream(m_MemoryStreamEncrypt, m_HashAlgorithm, CryptoStreamMode.Write);
}

public void Feed(byte[] data, int offset, int count)
{
m_CryptoStreamEncrypt.Write(data, offset, count);
}

public byte[] Result
{
get
{
return m_HashAlgorithm.Hash;
}
}

最佳答案

在获取结果之前需要调用HashFinal:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.hashfinal.aspx

根据散列算法的工作方式( block 密码),您无法获得准确的中间结果,因为它不会在数据中间正确计算 block 。这是因为它必须填充最终数据 block 以确保正确的值并保持加密“强”。换句话说,由于数据 block 依赖于先前的 block ,因此您需要所有数据才能生成正确的结果。 .NET 试图通过在最终确定之前拒绝访问密码结果来帮助您解决这个问题。您将所有数据提供给哈希,然后最终确定以获得正确计算的结果。

我会向您提出这个问题:为什么需要中间结果?您是否有可以从不同角度处理或解决的原因?告诉我们原因,我们也许可以提供替代方案。

您还应该注意在使用后正确关闭/处置您的流。

关于c# - 检索哈希值后使用 c# HashAlgorithm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18447870/

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