.NET和Java生成不同的签名
我有一个用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的使用。der私钥,在C#中不受支持(据我所知)。我正在使用。相同证书的pem密钥
# 1 楼答案
由于你没有表明你的C#点,我只能猜测你的问题是什么:
在Java中,您正在执行双MD5哈希。一次显式地在代码中,一次隐式地在
Signature
对象中(如您所见,该对象定义为MD5WithRSA
)。这里就是这样如果您没有在C端明确地执行第一个MD5,那么您有:
显然,这些都不一样,除非您的消息已经到达MD5的固定点(非常不可能)
除此之外,你确定C#签名总是相同的吗?据我所知,RSA签名是(in the modes normally used)不确定的,因为它包含一些随机填充数据