【发布时间】: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