【发布时间】:2025-12-03 08:10:02
【问题描述】:
我有一个简单的问题。 我需要将 sha256 校验和方法从 java 重写为 C#
所以我可以使用这个 Java 代码:
Canonicalizer c14Canonicalizer = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_EXCL_WITH_COMMENTS);
byte[] byteArray = c14Canonicalizer.canonicalizeSubtree(doc);
// At this point, the byteArray in Java and the data in C# matches up.
// That is, after the java bytes are converted to unsigned bytes using
// java.lang.Byte.toUnsignedInt()
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(byteArray);
byte byteData[] = md.digest();
(你猜对了,byteArray 是一个字节数组:D)
据我所知,update() 和 digest() 方法基本上应该替代各自 HashAlgorithm 派生类(在本例中为 SHA256)中的 TransformBlock() 和 TransformFinalBlock() 方法。
所以我在 C# 中尝试过类似的东西:
var data = Encoding.UTF8.GetBytes(xmlString);
// At this point, the byteArray in Java and the data in C# matches up.
// That is, after the java bytes are converted to unsigned bytes using
// java.lang.Byte.toUnsignedInt()
using (var sha256 = SHA256.Create())
{
byte[] shaBytes = new byte[data.Length];
data.CopyTo(shaBytes, 0);
sha256.TransformBlock(shaBytes, 0, shaBytes.Length, shaBytes, 0);
sha256.TransformFinalBlock(shaBytes, 0, shaBytes.Length);
return sha256.Hash;
}
(同样,数据是一个字节数组)
但是,字节不匹配。我在这里遗漏了什么吗?
(我当然是,否则它会起作用的,对吧?:S)
更新
为了给您提供更多信息,在运行您在上面看到的代码之前,我已经匹配了 Java 和 C# 代码之间的字节。然后他们确实匹配。但是,C# 代码中的字节来自 UTF8 编码的字符串,而 Java 字节来自 c14Canonicalizer.canonicalizeSubtree() 方法。
我将更新上面的代码示例以包含它们的起源。
更新
对于它的价值,Java md.digest() 方法返回以下字节:
-86、44、95、84、3、50、7、-119、-36、46、39、32、-120、7、10、-86、-101、110、-93、-72 , -13, -93, -42, 111, 0, 59, -85, -63, -15, -98, -17, -52
当转换为
170,44,95,84,3,50,7,137,220,46,39,32,136,7,10,170,155,110,163,184,243,163,214,111,0,59,171,193,241,158,239,204
当 C# 代码返回时
72,108,14,47,15,200,209,10,68,87,17,220,67,226,162,123,69,186,130,167,239,250,180,178,75,101,39,195,32,171,156,178
当使用sha256.ComputeHash()时
【问题讨论】:
-
请不要回答这个问题:*.com/questions/1521249/…
-
像
sha256sum这样的独立工具(阅读:保证工作)打印什么? -
@RustyX 我试过onlinemd5.com,结果和Java代码的结果一样。
-
@mkysoft 我已经研究了这个问题,他们的建议就是我在这里所做的。 C# 代码中的 xml 来自对
XmlDsigExcC14NWithCommentsTransform.GetOutput()的调用,该结果中的字节与 javasCanonicalizer.canonicalizeSubtree()中的字节匹配