簡體   English   中英

嘗試將公鑰加載到 RSACryptoServiceProvider 時出現 CryptographicException Bad Key

[英]CryptographicException Bad Key when trying to load public key into RSACryptoServiceProvider

我不確定這個問題是如何發生的,我試圖傳遞給 CSP 的密鑰最初是一個 Base64Encoded 字符串,我也嘗試使用 ImportSubjectInfoKey() 傳遞它。 每次調試時,我都導出了參數,並且我能夠將我的公鑰作為 Base64 字符串取回,據我所知這是一個有效的密鑰。 但是,一旦它遇到了 VerifyData 方法,它就會因 Bad Key 異常而中斷。 在調試時,我確實注意到 rsa1.CspKeyContainerInfo 提到了一個錯誤“可導出:{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;

錯誤:

Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Bad Key.
at Internal.NativeCrypto.CapiHelper.CreateHashHandle(SafeProvHandle hProv, Byte[] hash, Int32 
calgHash)
at Internal.NativeCrypto.CapiHelper.VerifySign(SafeProvHandle hProv, SafeKeyHandle hKey, Int32 
calgKey, Int32 calgHash, Byte[] hash, Byte[] signature)
at System.Security.Cryptography.RSACryptoServiceProvider.VerifyHash(Byte[] hash, Byte[] signature, 
HashAlgorithmName hashAlgorithm, RSASignaturePadding padding)
at System.Security.Cryptography.RSAPKCS1SignatureDeformatter.VerifySignature(Byte[] rgbHash, Byte[] 
rgbSignature)
at Go.Server.Controllers.CitizenWebhook.VerifyData(String paymentToken, String signature) in 
C:\Users\Dylan\source\repos\GO5050PLATFORM\Go\Server\Controllers\Webhooks\CitizenWebhook.cs:line 108 

發布的代碼失敗,因為VerifySignature()不期望原始數據而是散列數據,另請參見文檔中的此示例

進行以下更改:

var paymentTokenAsBytes = SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(paymentToken));

驗證成功。


如果密鑰以 X.509/SPKI 格式(DER 編碼)可用,則也可以使用ImportSubjectPublicKeyInfo()導入。 對於驗證,可以交替使用方法VerifyData() (隱式散列數據)和VerifyHash() (預期已經散列的數據)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM