2014-05-20 140 views
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(); 
    } 
+2

澄清你遇到的具體問題。 .NET有一個[SHA512類。](http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha512.aspx) –

+0

在C#中,沒有稱爲SecretKeySpec或Mac的類。我想我不理解C#等同於那些。這不是我的專業領域。 –

+0

SecretKeySpec [此處記錄](http://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/SecretKeySpec.html)。它似乎使用您指定的指定算法生成「密鑰」。我真的不知道它是如何工作的,但你可以嘗試從它獲得一些值,並將它們與.NET SHA512類的輸出進行比較,看看它們是否同意。 –

回答

2

一個SecretKeySpec用於二進制輸入轉換成由Java安全供應商公認的關鍵的東西。它只是用一個小小的便箋註釋說「Pssst,它是一個HmacSHA512密鑰...」來裝飾字節。

你基本上可以忽略它作爲Java-ISM。對於你的.NET代碼,你只需要找到一種方法來聲明HMAC密鑰是什麼。看看HMACSHA512課程,這看起來很直截了當。有一個構造函數需要一個包含您的鍵值的字節數組。

相關問題