我在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密钥获得相同的证书。
答案 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)不确定,因为它包含一些随机填充数据。