首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检索哈希值后使用c# HashAlgorithm

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

Stack Overflow用户
提问于 2013-08-26 15:40:30
回答 2查看 2.1K关注 0票数 4

我有一个散列算法对象(在本例中是SHA1),它输入数据,以便在调用结果属性时最终获得散列结果。

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

我需要能够得到中间的散列结果,但是继续提供,然后再得到另一个结果。是否有办法实现这一目标?

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-26 15:48:01

在获得结果之前,您需要调用HashFinal

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

基于哈希算法(分组密码)的工作方式,您无法获得准确的中间结果,因为它无法正确计算中间数据块。这是因为它必须填充最终数据块,以确保正确的值,并保持加密“强”。换句话说,由于数据块依赖于以前的块,所以需要所有数据来生成正确的结果。.NET试图通过拒绝对密码结果的访问来帮助您完成这一事实。您输入散列所有数据,然后最后完成,以获得正确的计算结果。

我会问你一个问题:为什么你需要中间的结果?有什么理由你可以从不同的角度去接近或解决呢?告诉我们为什么,也许我们可以帮上别的忙。

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

票数 4
EN

Stack Overflow用户

发布于 2013-08-26 17:29:45

我想你不能用HashAlgorithm来做这件事。因此,如果您想要这样做,您可能必须依赖您可以更改的哈希实现,比如Bouncy城堡库中的哈希实现(非常允许的库,因此您可以从代码中获取状态)。

请注意,对散列扩展的攻击是众所周知的,因此您可能想再看看您的协议。

如果您想使用标准算法实现,我建议您查看散列树实现,这些实现在文件共享协议中很常见。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18447870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档