代码之家  ›  专栏  ›  技术社区  ›  mhenrixon

C语言中Java(RSA)签名中的问题验证

  •  2
  • mhenrixon  · 技术社区  · 14 年前

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

    在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-验证public_key.pem-signature data.txt.signed data.txt

    问题是,我错过了什么让这个工作?

    注: 我没有问题的关键,这是正确的工作,但在某种程度上有区别之间的Java和.NET如何工作与RSA?

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

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

    有人能告诉我sha1withrsa和rsa之间的区别吗?

    2 回复  |  直到 12 年前
        1
  •  1
  •   mhenrixon    14 年前

    这个问题实际上是在Java方面解决的。他们对自己的事情有一些问题。

        2
  •  0
  •   Bob    14 年前

    您的邮件数据可能有编码问题。您已经将原始文件数据转换为Unicode字符串,并尝试将其转换回原始字节。取决于文件的编码,如果它甚至是文本,那么您的msgBytes可能与实际的文件内容不同。

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