什么是Java的SecretKeySpec类的.NET等价物?

时间:2014-05-20 15:44:44

标签: c# java hmacsha1 one-time-password

我在Java中提供了以下代码示例,但我无法将其转换为C#。我将如何转换它以便它在.NET 4.5中工作?

public static String constructOTP(final Long counter, final String key) 
    throws NoSuchAlgorithmException, DecoderException, InvalidKeyException 
{ 
    // setup the HMAC algorithm, setting the key to use         
    final Mac mac = Mac.getInstance("HmacSHA512");                  

    // convert the key from a hex string to a byte array         
    final byte[] binaryKey = Hex.decodeHex(key.toCharArray());                  

    // initialize the HMAC with a key spec created from the key         
    mac.init(new SecretKeySpec(binaryKey, "HmacSHA512"));  

    // compute the OTP using the bytes of the counter         
    byte[] computedOtp = mac.doFinal(                 
    ByteBuffer.allocate(8).putLong(counter).array());  

    //         
    // increment the counter and store the new value         
    //                  

    // return the value as a hex encoded string         
    return new String(Hex.encodeHex(computedOtp));     
} 

由于Duncan指出了HMACSHA512课程,我提出了C#代码,但是如果不安装java,我无法验证结果是否匹配,我无法做到在这台机器上。此代码是否与上述Java匹配?

    public string ConstructOTP(long counter, string key)
    {
        var mac = new HMACSHA512(ConvertHexStringToByteArray(key));
        var buffer = BitConverter.GetBytes(counter);

        Array.Resize(ref buffer, 8);

        var computedOtp = mac.ComputeHash(buffer);

        var hex = new StringBuilder(computedOtp.Length * 2);

        foreach (var b in computedOtp)
            hex.AppendFormat("{0:x2", b);

        return hex.ToString();
    }

1 个答案:

答案 0 :(得分:2)

SecretKeySpec用于将二进制输入转换为Java安全提供程序识别为密钥的内容。它只是用一个小便条贴上“ Pssst,它是一个HmacSHA512键...... ”来装饰字节。

你基本上可以忽略它作为Java主义。对于.NET代码,您只需要找到一种声明HMAC密钥的方法。看看HMACSHA512课程,这看起来很简单。有一个构造函数,它接受一个包含键值的字节数组。