C# CryptographicException尝试将公钥加载到RsaCryptographicServiceProvider时出现坏密钥

C# CryptographicException尝试将公钥加载到RsaCryptographicServiceProvider时出现坏密钥,c#,.net-core,cryptography,rsa,blazor,C#,.net Core,Cryptography,Rsa,Blazor,我不确定这个问题是如何发生的,我试图传递给CSP的密钥最初是一个Base64编码的字符串,我也尝试使用importsObjectInfo()传入该字符串。每次调试时,我都会导出参数,并且我能够以Base64字符串的形式获取公钥,因为据我所知,它是一个有效密钥。然而,一旦它点击VerifyData方法,它就会因一个坏键异常而中断。在调试时,我注意到rsa1.CspKeyContainerInfo提到了一个错误“Exportable:{key不存在}”。这就是我的问题的来源吗?如果有人看到问题,我将

我不确定这个问题是如何发生的,我试图传递给CSP的密钥最初是一个Base64编码的字符串,我也尝试使用importsObjectInfo()传入该字符串。每次调试时,我都会导出参数,并且我能够以Base64字符串的形式获取公钥,因为据我所知,它是一个有效密钥。然而,一旦它点击VerifyData方法,它就会因一个坏键异常而中断。在调试时,我注意到rsa1.CspKeyContainerInfo提到了一个错误“Exportable:{key不存在}”。这就是我的问题的来源吗?如果有人看到问题,我将公钥作为XML字符串包含在下面

    private static bool VerifyData(string paymentToken, string signature)
    {

        var rsa1 = new RSACryptoServiceProvider(2048);
        string publicKey = @"
            <RSAKeyValue><Modulus>zIU140G9rFe6ouNFuhCxIj3Ps3ELUV9w4XTnDsti8kcSTXMf0z6LMNVIqXaZYFbSYXAZRmuM3XNmoSWmMZzPBMl2/C7uC0wyNdrYdPw0uzU2wfr8MQbnvW0yQgQ/cSHNDUZR+n/s2ipXTdNmbRd4z+k+qXxw00xMDmiJu5iMHyYo24x284lTZ3+4dgL4xFlrtjgcb/NGHBpVPQTCbBfEQcmylCwzbTUdBJlAo5ezpziOJ6CNf9FDS1hvRKRvNl7Hx8To6vQZJTwdCT5RWDC2JYL0oSdPV+SZmlfHQQe33p81MiRl4cjp5AwMVKyAosDihGT810WFYhK431EIB/NR/w==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
        
        rsa1.FromXmlString(publicKey);

        // Converts back to my original Base64 encoded public key so it seems valid.
        var x = rsa1.ExportSubjectPublicKeyInfo();
        var a = Convert.ToBase64String(x);

        RSAPKCS1SignatureDeformatter rsaDeformatter = new(rsa1);
        rsaDeformatter.SetHashAlgorithm("SHA256");

        var paymentTokenAsBytes = Encoding.UTF8.GetBytes(paymentToken);
        var signatureAsBytes = Convert.FromBase64String(signature);

        bool verified = false;
        try
        {
            if (rsaDeformatter.VerifySignature(paymentTokenAsBytes, signatureAsBytes))
            {
                Console.WriteLine("The signature is valid.");
                verified = true;
            }
            else
            {
                Console.WriteLine("The signature is not valid.");
                verified = false;
            }
        } catch(CryptographicException ex)
        {
            Debug.WriteLine($"What is going on!! {ex} ");
        }
        return verified;

发布的代码失败,因为不需要原始数据,而是散列数据,另请参见文档

更改如下:

var paymentTokenAsBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(paymentToken));
验证成功



如果密钥以X.509/SPKI格式(DER编码)提供,也可以使用导入。为了验证,可以交替使用方法(隐式散列数据)和(期望已散列的数据)。

非常感谢!我已经为此挣扎了一段时间,现在你真的帮了我的忙!真不敢相信我如此接近,我重写了很多次我的关键部分,因为我认为它是。再次感谢:)
var paymentTokenAsBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(paymentToken));