在C#中验证在Java(RSA)中签名的内容时出现问题

在C#中验证在Java(RSA)中签名的内容时出现问题,c#,java,rsa,digital-signature,C#,Java,Rsa,Digital Signature,我希望我能在这里得到一些帮助,以便最终解决这个令人沮丧的问题 在java方面,他们使用以下代码签名: public static void main(String[] args) throws Exception { if (args.length < 2) printInfoAndExit(); String cmd = args[0]; Security.addProvider(new BouncyCastleProvider()); S

我希望我能在这里得到一些帮助,以便最终解决这个令人沮丧的问题

在java方面,他们使用以下代码签名:

public static void main(String[] args) throws Exception {
    if (args.length < 2)
        printInfoAndExit();
    String cmd = args[0];
    Security.addProvider(new BouncyCastleProvider());
    Signature signature = Signature.getInstance("SHA1withRSA", "BC");
    if ("sign".equalsIgnoreCase(cmd)) {
        String pemFileName = args[1];
        String dataFileName = args[2];

        byte[] data = readFile(dataFileName);

        FileReader fr = new FileReader(new File(pemFileName));
        PEMReader pemReader = new PEMReader(fr);
        KeyPair keyPair = (KeyPair) pemReader.readObject();
        fr.close();

        signature.initSign(keyPair.getPrivate());
        signature.update(data);
        byte[] signatureBytes = signature.sign();

        writeFile(signatureBytes, dataFileName + ".signed");
        String encoded = Base64.encode(signatureBytes);
        writeFile(encoded.getBytes(), dataFileName + ".signed.base64");
    } else {
        printInfoAndExit();
    }
}
这不管用!!但是,我可以使用openssl验证数据: openssl dgst-sha1-验证公钥.pem-签名数据.txt.签名数据.txt

问题是,我缺少什么才能让这一切顺利进行

注意:我对密钥没有问题,密钥工作正常,但java和.net在RSA上的工作方式有所不同

**编辑1:*在这个特定场景中,我所要做的就是将GetSigner更改为

ISigner signer = SignerUtilities.GetSigner("RSA");

有人能告诉我SHA1withRSA和RSA的区别吗?

您的邮件数据可能存在编码问题。您已将原始文件数据转换为unicode字符串,并试图将其转换回原始字节。根据文件的编码,甚至是文本,您的msgBytes可能与实际文件内容不同


从文件中读取原始字节,而不是字符串。您没有显示实际读取文件数据的代码,但我假设您是以文本形式读取的。

问题实际上是在Java端解决的。他们有一些问题。

谢谢,我注意到默认编码中java和.net之间存在不匹配。然而,我没有阅读任何文件。这是一个字符串交换,我有他们的公钥,他们有我们的。我会确保双方都在使用UTF-8。他们做了什么来解决这个问题?这将有助于将来遇到Java/C兼容性问题的读者。
ISigner signer = SignerUtilities.GetSigner("RSA");