我有一个散列算法对象(在本例中是SHA1),它输入数据,以便在调用结果属性时最终获得散列结果。
问题是,一旦调用了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;
}
}发布于 2013-08-26 15:48:01
在获得结果之前,您需要调用HashFinal:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.hashfinal.aspx
基于哈希算法(分组密码)的工作方式,您无法获得准确的中间结果,因为它无法正确计算中间数据块。这是因为它必须填充最终数据块,以确保正确的值,并保持加密“强”。换句话说,由于数据块依赖于以前的块,所以需要所有数据来生成正确的结果。.NET试图通过拒绝对密码结果的访问来帮助您完成这一事实。您输入散列所有数据,然后最后完成,以获得正确的计算结果。
我会问你一个问题:为什么你需要中间的结果?有什么理由你可以从不同的角度去接近或解决呢?告诉我们为什么,也许我们可以帮上别的忙。
您还应该注意在使用后正确关闭/处理您的流。
发布于 2013-08-26 17:29:45
我想你不能用HashAlgorithm来做这件事。因此,如果您想要这样做,您可能必须依赖您可以更改的哈希实现,比如Bouncy城堡库中的哈希实现(非常允许的库,因此您可以从代码中获取状态)。
请注意,对散列扩展的攻击是众所周知的,因此您可能想再看看您的协议。
如果您想使用标准算法实现,我建议您查看散列树实现,这些实现在文件共享协议中很常见。
https://stackoverflow.com/questions/18447870
复制相似问题