我在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();
}
答案 0 :(得分:2)
SecretKeySpec
用于将二进制输入转换为Java安全提供程序识别为密钥的内容。它只是用一个小便条贴上“ Pssst,它是一个HmacSHA512键...... ”来装饰字节。
你基本上可以忽略它作为Java主义。对于.NET代码,您只需要找到一种声明HMAC密钥的方法。看看HMACSHA512
课程,这看起来很简单。有一个构造函数,它接受一个包含键值的字节数组。