有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

.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) 个答案

  1. # 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)不确定的,因为它包含一些随机填充数据