我有以下用 Java 编写的代码
Mac mac = Mac.getInstance("HmacSHA1");
String secretKey ="sKey";
String content ="Hello";
byte[] secretKeyBArr = secretKey.getBytes();
byte[] contentBArr = content.getBytes();
SecretKeySpec secret_key = new SecretKeySpec(secretKeyBArr,"HmacSHA1");
byte[] secretKeySpecArr = secret_key.getEncoded();
mac.init(secret_key);
byte[] final = mac.doFinal(contentBArr);
我想用 C# 做同样的例子。所以,我写了下面的代码
HMACSHA1 hmacsha1 = new HMACSHA1();
string secretKey = "sKey";
string content = "Hello";
byte[] secretKeyBArr = Encoding.UTF8.GetBytes(secretKey);
byte[] contentBArr = Encoding.UTF8.GetBytes(content);
hmacsha1.Key = secretKeyBArr;
byte[] final = hmacsha1.ComputeHash(contentBArr);
最终结果并不相等。 secretKeyBArr 和 contentBArr 是字节数组,它们的值在两个示例中都相同。未知的是传递给 mac.init() 的 SecretKeySpec。那么,C# 中的同一个类是什么?
最佳答案
结果相同,但 Java 默认使用有符号字节,而 C# 默认使用无符号字节。
此外,SecretKeySpec
本身通常不会更改基础数据。你需要例如将 DES key 规范放入 SecretKeyFactory
中,以确保奇偶校验位设置正确(在生成的 SecretKey
中)。因此不需要等效项,因为类本身除了包装数据外几乎没有做任何事情。
关于java - Java SecretKeySpec 的 C# 等价物是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13829332/