有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有BigInteger的Java hmacSHA256与C不同#

昨天我在使用Java和C进行散列时遇到了麻烦#

我有C语言的代码#

byte[] message = Encoding.UTF8.GetBytes("nick");
byte[] key = Encoding.UTF8.GetBytes("key");

HMACSHA256 hmac = new HMACSHA256(key);
byte[] HmacBytes = hmac.ComputeHash(message);

var result = BitConverter.toString(HmacBytes);

_logger.LogInformation($">>> HMAC: " + result);

这段代码是用Java编写的

byte[] message = "nick".getBytes("UTF-8");
byte[] key = "key".getBytes("UTF-8");

Mac sha256HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(key, sha256HMAC.getAlgorithm());
sha256HMAC.init(secretKey);

byte[] hmacBytes = sha256HMAC.doFinal(message);
            
System.out.println(">>> HMAC: " + Utils.bytesToHex(hmacBytes));

这两种代码的结果相同: D56F32BEB288697DBC666CFCE330750240EE7252A8EACB90F30AE5EC2B6544FE

但是,如果我使用消息和带有BigInteger变量的键,结果最终是不同的

具体

关键的BigInteger变量: 89846755145779207896151571317970843398423995352339053147606272151939451164346932712779779593562801986871149751592444563734853909794103626366575265329402498505873220784518950449894168432504409626921891704398413417881679930643396500380895818666783852587744861261584959964779866038266086235614583684537765854767

消息BigInteger变量: 105278801605955351183032861925660079240049371193037037019863031780531990060755731057393990664319512505978954889835933668032824049054190807125138251307247771506918060803959346902566451812689470408398611041302277800747341495594297701677567604614145074223483256879948522462707345079591319551080307454838134385381

我用C换#

HMACSHA256 hmac = new HMACSHA256(key.toByteArray());
byte[] HmacBytes = hmac.ComputeHash(message.toByteArray());

var result = BitConverter.toString(HmacBytes);

_logger.LogInformation($">>> HMAC: " + result);

Java也是如此

Mac sha256HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(key.toByteArray(), sha256HMAC.getAlgorithm());
sha256HMAC.init(secretKey);

byte[] hmacBytes = sha256HMAC.doFinal(message.toByteArray());
            
System.out.println(">>> HMAC: " + Utils.bytesToHex(hmacBytes));

那么在C#中的结果就大不相同了: ED12EC5908E91F9F9CCE0AB8D703DC31A7DE70B20A39FC5C9A35C9193019C6D2

和Java: 827EE601E601B44BF09D34947A7255EE484596B8C7DBEF283A64EE5C9BDA0CD1

请提示我如何在Java中修复以匹配C#结果。 提前谢谢


共 (0) 个答案