.NET和Java生成不同的签名

时间:2011-08-10 05:59:40

标签: java .net cryptography bouncycastle signature

我在java中有一个示例代码,我试图将其转换为.NET c#platform。此代码加密字符串并为其添加签名。使用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#。我尝试了几个样本(BouncyCastle for C#,openssl等),所有都返回相同的签名,这与java生成的签名不同。我发现的另一件事是java使用.de私钥在C#中不受支持(据我所知)。我使用.pem密钥获得相同的证书。

1 个答案:

答案 0 :(得分:2)

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

在Java中,您正在进行双MD5哈希。一旦显式出现在您的代码中,并且隐含在您的Signature对象中(定义为MD5WithRSA,就像您所看到的那样)。所以你在这里

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

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

signatureC# = RSA(MD5(msg))

显然这些不一样,除非你用你的信息点击MD5的固定点(非常不可能)。

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