1
我在Java中被提供了下面的代碼示例,我很難將它轉換爲C#。我怎麼去轉換這個,所以它可以在.NET 4.5中工作?什麼是Java的SecretKeySpec類的.NET等價物?
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));
}
下面是C#代碼,我已經拿出感謝鄧肯指出的HMACSHA512類,但我無法驗證結果比賽沒有安裝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();
}
澄清你遇到的具體問題。 .NET有一個[SHA512類。](http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha512.aspx) –
在C#中,沒有稱爲SecretKeySpec或Mac的類。我想我不理解C#等同於那些。這不是我的專業領域。 –
SecretKeySpec [此處記錄](http://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/SecretKeySpec.html)。它似乎使用您指定的指定算法生成「密鑰」。我真的不知道它是如何工作的,但你可以嘗試從它獲得一些值,並將它們與.NET SHA512類的輸出進行比較,看看它們是否同意。 –