【问题标题】:.NET and Java producing different signature.NET 和 Java 产生不同的签名
【发布时间】:2011-08-10 05:59:40
【问题描述】:

我在 java 中有一个示例代码,我正在尝试将其转换为 .NET c# 平台。此代码加密字符串并为其添加签名。使用 BouncyCastle 提供程序的 Java 代码和添加签名的代码如下。

 InputStream in = new FileInputStream(derkeyfilename);
 byte[] privKeyBytes = new byte[in.available()]; 
 in.read(privKeyBytes);
 KeyFactory rsaKeyFac = KeyFactory.getInstance("RSA");
 PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(privKeyBytes);
 private RSAPrivateKey myPrivateKey = (RSAPrivateKey) rsaKeyFac.generatePrivate(encodedKeySpec);

 MessageDigest md = MessageDigest.getInstance("MD5", "BC");
 byte[] digest = md.digest(msg);
 Signature sig = Signature.getInstance("MD5withRSA", "BC");
 sig.initSign(myPrivateKey);
 sig.update(digest);
 byte[] signature = sig.sign();
 byte[] base64 = Base64.encodeBase64(signature);
 String signature = new String(base64);

谁能帮我把它转换成c#。我尝试了几个示例(C# 的 BouncyCastle、openssl 等)并且都返回了与 java 生成的不同的相同签名。我发现的另一件事是 java 使用了 C# 中不支持的 .der 私钥(据我所知)。我正在为同一个证书使用 .pem 密钥。

【问题讨论】:

  • 您从InputStream 阅读的方式一开始就被破坏了。就我个人而言,我从不信任available(),您永远不应该从流中读取并忽略来自read 的返回值。您是否验证过摘要本身是否相同?你如何从字符串中获取字节开始?一个简短但完整 的示例确实会有所帮助 - 包括您在 C# 中尝试过的内容。如果多个 .NET 方法给出相同的签名,那可能是正确的...
  • 此外,您Signature 提供MD5 摘要...您不应该向它提供输入数据(msg)吗?
  • @Jon 摘要始终是签名的,而不是完整的数据。
  • @Eugene:Righto,所以实际上最初计算 MD5 和的业务是无关紧要的,只要它们给出相同的结果。因此问题可以分为两部分:MD5 和是否计算正确(在这种情况下签名无关紧要)以及某个任意(但相等)MD5 大小的二进制文件的签名是否相同。跨度>
  • 您有两个不同的变量signature,一个是byte[],一个是String

标签: java .net cryptography bouncycastle signature


【解决方案1】:

由于你没有展示你的 C# 点,我只能猜测你的问题是什么:

在 Java 中,您正在执行双重 MD5 哈希。一次在您的代码中显式,一次在您的Signature 对象中隐式(如您所见,定义为MD5WithRSA)。这样你就有了

signatureJava = RSA(MD5(MD5(msg)))

如果您没有在 C# 端明确地执行此第一个 MD5,那么您有:

signatureC# = RSA(MD5(msg))

显然这些是不一样的,除非您的消息已达到 MD5 的固定点(非常不可能)。

除此之外,您确定 C# 签名始终相同吗?据我了解,RSA 签名 (in the modes normally used) 不确定,因为它包含一些随机填充数据。

【讨论】:

  • +1 不幸的是,PSS 不是 Java 中的普通模式,它仍然是带有 PKCS#1.5 填充的 RSA。
猜你喜欢
  • 2018-06-14
  • 2012-01-20
  • 1970-01-01
  • 2015-07-24
  • 2019-04-17
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多