Java验证签名C#等价

Java验证签名C#等价,c#,rsa,C#,Rsa,我试图找到与此Java代码等效的代码: public String signData(String data, String privateKey) { try { byte[] bytes = data.getBytes("UTF8"); PKCS8EncodedKeySpec prKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey)); PrivateKey

我试图找到与此Java代码等效的代码:

public String signData(String data, String privateKey) {
    try {
        byte[] bytes = data.getBytes("UTF8");
        PKCS8EncodedKeySpec prKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
        PrivateKey prKey = KeyFactory.getInstance("RSA").generatePrivate(prKeySpec);

        Signature sig = Signature.getInstance("SHA512withRSA");
        sig.initSign(prKey);
        sig.update(bytes);
        byte[] signatureBytes = sig.sign();
        return new String(Base64.encodeBase64(signatureBytes));
    } catch (Exception ex) {
    }
    return null;
}

这个代码似乎不起作用。 也许我错过了什么。 我找到了几个类似的帖子,但还没有找到答案

    public String signData(String data, String privateKey)
    {
        byte[] bytes = Encoding.UTF8.GetBytes(data);
        var rsa = RSA.Create();
        rsa.ImportPkcs8PrivateKey(Convert.FromBase64String(privateKey), out _);
        byte[] signedData = rsa.SignData(bytes, HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);

        return Convert.ToBase64String(signedData);
    }

    public bool validateSignature(String data, String publicKey, String signature)
    {
        var bytes = Convert.FromBase64String(publicKey);
        var rsa = RSA.Create();
        rsa.ImportSubjectPublicKeyInfo(bytes, out _);
        var rsaParams = rsa.ExportParameters(false);

        return rsa.VerifyHash(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(signature), HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
    }
这让我震惊)我希望有人能回答)
谢谢

问题出在validateSignature方法中,您在该方法中调用
VerifyHash()
来验证签名。第一个参数的名称是
rgbHash
,它的名称是:

参数 rgbHash字节[] 签名数据的哈希值

此方法用于验证已计算哈希的签名,但您正试图通过提供数据本身来验证签名,因此将VerifyHash()调用更改为VerifyData()应该可以实现以下目的:

public static bool validateSignature(String data, String publicKey, String signature)
{
    var bytes = Convert.FromBase64String(publicKey);
    var rsa = RSA.Create();
    rsa.ImportSubjectPublicKeyInfo(bytes, out _);

    // Not used in the provided code.
    // var rsaParams = rsa.ExportParameters(false);

    return rsa.VerifyData(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(signature), HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
}
…此代码似乎不起作用。。。请提供更多细节。“它不起作用”是没有帮助的。
public static bool validateSignature(String data, String publicKey, String signature)
{
    var bytes = Convert.FromBase64String(publicKey);
    var rsa = RSA.Create();
    rsa.ImportSubjectPublicKeyInfo(bytes, out _);

    // Not used in the provided code.
    // var rsaParams = rsa.ExportParameters(false);

    return rsa.VerifyData(Encoding.UTF8.GetBytes(data), Convert.FromBase64String(signature), HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
}