在C#中验证Java(RSA)中签名的问题。

问题描述 投票:2回答:3

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

在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();
    }
}

当我收到数据时,我有他们的公钥,并尝试用下面的C#代码来验证。

public static bool Verify(String msg, String signature, String publicKey)
{
    RsaKeyParameters remotepubkey = GetRsaPublicKey(publicKey);

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

    signer.Init(false, remotepubkey);
    byte[] sigBytes = Convert.FromBase64String(signature);
    byte[] msgBytes = Encoding.Default.GetBytes(msg);
    signer.BlockUpdate(msgBytes, 0, msgBytes.Length);
    return signer.VerifySignature(sigBytes);
}

这是行不通的!然而我可以用openssl:openssl dgst -sha1 -verify public_key.pem -signature data.txt.signed data.txt来验证数据。

问题是,我缺什么才能做到这一点?

注意:我在密钥方面没有问题,这是正确的,但不知何故,java和.net的RSA工作方式有什么不同? 我在密钥方面没有问题,工作正常,但不知何故,java和.net的RSA工作方式有区别?

**编辑1:**在这个特殊的情况下,我所要做的就是把GetSigner改为

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

谁能告诉我SHA1withRSA和RSA的区别?

c# java rsa digital-signature
3个回答
1
投票

其实这个问题在Java这边已经解决了。他们这边的东西有一些问题。


0
投票

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

从文件中读取原始字节而不是字符串。你没有显示实际读取文件数据的代码,但我假设你是把它当作文本来读。

© www.soinside.com 2019 - 2024. All rights reserved.