java - Java SecretKeySpec 的 C# 等价物是什么

标签 java c# cryptography sha1 hmac

我有以下用 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/

相关文章:

c# - Moq.CaSTLeProxyFactory' 无法加载文件或程序集 'CaSTLe.Core

c# - 如何使用 GraphDiff 更新相关实体?

java - 我可以使用 4096 位作为带有 OAEP 填充的 Java RSA 的 key 长度吗?

java - 无法在 Java 中获取 WebSphere 环境变量

c# - NetMQ接收/响应在循环时不起作用

java - 如何修复MainActivity? kotlin.UninitializedPropertyAccessException : lateinit property compositeDiposable has not been initialized

java - 无法在 Android 上验证 rsa 签名

java - 如何使用 RIM 加密 api 进行无填充的 TripleDES 加密

java - 有没有什么方法可以调用清理函数来清理 native 代码,同时在 Android 中保留任何 Activity ?

java - SharedPreferences 类型中的方法 getLong(String, long) 不适用于参数 (String)