首页 > 解决方案 > 在 Java 中生成的 C# 中的验证 RSA 签名

问题描述

我有一个签名字符串,Base64 编码,json 中的消息字符串和公钥字符串 - 假设它是用 Java 生成的 base64 编码,我需要在 C# 中验证它。

我也有一个 Java 代码,它应该正确地进行验证,但我无法让它在 C# 中运行。请帮助如何做到这一点?

import java.security.spec.X509EncodedKeySpec;

import org.apache.commons.codec.binary.Base64;

public class WebHookSecurityUtil
{
    private static final String KEYPAIR_ALGORITHM = "RSA";  // No I18N
    private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";  // No I18N
    private static final String CHARSETNAME = "UTF-8";  // No I18N

    public static boolean verifySignature(String text, String public_key_str, String signature_str) throws Exception
    {
        PublicKey public_key = getPublicKey(public_key_str);

        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initVerify(public_key);
        signature.update(text.getBytes(CHARSETNAME));

        byte[] signatureBytes = Base64.decodeBase64(signature_str);

        return signature.verify(signatureBytes);
    }

    public static PublicKey getPublicKey(String public_key) throws Exception
    {
        byte[] bytes = Base64.decodeBase64(public_key);

        X509EncodedKeySpec ks = new X509EncodedKeySpec(bytes);
        KeyFactory kf = KeyFactory.getInstance(KEYPAIR_ALGORITHM);
        return kf.generatePublic(ks);
    }
}

我尝试的是它总是返回false

            RSAParameters pubKey = new RSAParameters();
            // Not sure here...
            pubKey.Modulus =Convert.FromBase64String(publicKey);
            pubKey.Exponent = new byte[] { 1, 0, 1 };

            byte[] buffer = System.Text.UTF8Encoding.UTF8.GetBytes(msg);
            byte[] sig = Convert.FromBase64String(signature);
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.ImportParameters(pubKey);
            bool isValid = provider.VerifyData(buffer, CryptoConfig.MapNameToOID("SHA256"), sig);
            Console.WriteLine("SHA256: " + isValid);

标签: javac#encryptionrsasignature

解决方案


在 base 64 编码之后,您需要从这里开始执行代码DecodeX509PublicKey。Mickeysoft 不支持在 X.509 证书和 PUBLIC KEY PEM 结构中使用的“SubjectPublicKeyInfo”结构,因为它不支持标准,更喜欢它们自己的格式。虽然它开始改变,但非常缓慢。


推荐阅读