【问题标题】:Deriving from HashAlgorithm in .NET Core从 .NET Core 中的 HashAlgorithm 派生
【发布时间】:2017-09-07 20:15:25
【问题描述】:

在 .NET Framework 中,如果我们需要创建自己的加密算法,我们可以创建自己的类,例如:

public class MyAlgorithm: System.Security.Cryptography.HashAlgorithm
{
}

但在 .NET Core 中它似乎非常有限,因为

public abstract class HashAlgorithm : IDisposable
    {     

    protected HashAlgorithm();    
    public virtual int HashSize { get; }    
    public byte[] ComputeHash(byte[] buffer);
    public byte[] ComputeHash(byte[] buffer, int offset, int count);
    public byte[] ComputeHash(Stream inputStream);
    public void Dispose();
    public abstract void Initialize();
    protected virtual void Dispose(bool disposing);
    protected abstract void HashCore(byte[] array, int ibStart, int cbSize);
    protected abstract byte[] HashFinal();
}

它没有HashSizeValueState 之类的东西。

我们还应该使用HashAlgorithm 作为 .NET Core 中自己算法的基类吗?

【问题讨论】:

  • 我们自己的加密算法您正在创建一个哈希算法。这是不同的。
  • 如果您是从头开始构建哈希算法,那么HashSizeValue 有什么用处(这是一个未公开的属性)? 通过HashSize属性声明你的算法的哈希大小。对于State...如果你需要State保持状态。
  • @xanatos 我实际上在做什么我正在将代码从 .NET Framework 移植到 .NET Core。那里的加密算法使用 HashAlgorithm 作为基类。这就是我问的原因
  • .NET Core 中的正确方法是什么?使用某些基类或没有类?
  • 正确的方法是从HashAlgorithm派生。请注意,他们 (Microsoft) 在 11 月 (github.com/dotnet/corefx/commit/…) 和以前的版本中读取了这两个字段。如果您需要它们,则必须阅读它们。 StateTransformBlock/TransformFinalBlock 使用,.NET Core 1.1 HashAlgorithm 没有实现。

标签: c# .net cryptography .net-core hashalgorithm


【解决方案1】:

在你的类中,实现一个

public override int HashSize => 256;

(或你拥有的价值)。

如果您使用的是HashSizeValue,请将其更改为HashSize

如果您使用的是State,请将其读作protected int State。在“完整”HashAlgorithm 中,它被两种公共方法(TransformBlockTransformFinalBlock)使用。如果您需要它(并且您正在使用 TransformBlockTransformFinalBlock),请从较新版本的 .NET Core HashAlgorithm 复制它(您可以在 github 上找到它)。如果你只是检查它,那么你不需要它,你可以评论它(因为只有两个缺失的方法会写它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2018-07-05
    • 2018-08-20
    • 2021-12-08
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多