HMAC使用自定义HashAlgorithm

时间:2017-08-18 11:33:13

标签: c# hash cryptography hmac

内置HMAC(HMACSHA1 - HMACSHA512 ......)。 但是可以使用自定义HashAlgorithm类创建HMAC吗?

我尝试了HMAC.Create("location"),但只是扔了NullReferenceException

可能有像new HMAC(HashAlgorithm)这样的构造函数吗?

这是HashAlgorithm的代码(Fnv1 Hash):

public class Fnv1_32 : HashAlgorithm
{
    private const uint prime = 0x01000193;
    private const uint offsetbasis = 0x811C9DC5;
    private uint _Hash;

    public Fnv1_32()
    {
        this.Initialize();
        this.HashSizeValue = 32;
    }

    public override void Initialize()
    {
        this._Hash = offsetbasis;
    }

    protected override void HashCore(byte[] array, int ibStart, int cbSize)
    {
        for (var i = ibStart; i < cbSize; i++)
        {
            this._Hash *= prime;
            this._Hash ^= array[i];
        }
    }

    protected override byte[] HashFinal()
    {
        return BitConverter.GetBytes(this._Hash);
    }
}

1 个答案:

答案 0 :(得分:0)

在.NET Framework中,您可以通过类似

的方式完成此操作
public class HMACFnv1_32 : HMAC
{
    private const string Fnv1CryptoConfigId = "Fnv1_32";

    static HMACFnv1_32()
    {
        CryptoConfig.AddAlgorithm(typeof(Fnv1_32), Fnv1CryptoConfigId);
    }

    public HMACFnv1_32(byte[] key)
    {
        HashName = Fnv1CryptoConfigId;
        HashSizeValue = 32;
        Key = key;
    }
}

在.NET Core上,HMAC实现已被删除,所有内置HMAC类都调用系统加密库来执行HMAC计算。因此,您需要自己编写HMAC以使用.NET Core的自定义摘要。