Ключ недействителен для использования в указанном состоянии при шифровании RSA - PullRequest
0 голосов
/ 18 марта 2020

вот моя ошибка code.get в методе шифрования encryptedData = RSA.Encrypt (Data, DoOAEPPadding); Метод выдает «Ключ недопустим для использования в указанном состоянии».

    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

    private void button1_Click(object sender, EventArgs e)
    {
        var rsa = new RSACryptoServiceProvider();
        var rsaKeyPair = DotNetUtilities.GetRsaKeyPair(rsa);
        var writer = new StringWriter();
        var writer2 = new StringWriter();
        var pemWriter = new PemWriter(writer);
        var pemWriter2 = new PemWriter(writer2);
        pemWriter.WriteObject(rsaKeyPair.Public);
        pemWriter2.WriteObject(rsaKeyPair.Private);
        string Pub = writer.ToString();
        string Prv = writer2.ToString();
        plaintext = ByteConverter.GetBytes(txtplain.Text);
        encryptedtext = Encryption(plaintext, Pub, false);
    }

получить здесь ошибку при шифровании данных с использованием метода шифрования RSA. Здесь передают DATA в качестве байта, а ключ RSA publi c в качестве string.after который преобразует его в RSAParanetrs "RSA.ImportParameters (GetRSAParameters (RSAKey));" затем зашифруйте данные получите эту ошибку.

    static public byte[] Encryption(byte[] Data, string RSAKey, bool DoOAEPPadding)
    {
        try
        {
            byte[] encryptedData;
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {
                RSA.ImportParameters(GetRSAParameters(RSAKey));
                encryptedData = RSA.Encrypt(Data, DoOAEPPadding); // get error "Key not valid for use in specified state"
            }
            return encryptedData;
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
    }

    private static RSAParameters GetRSAParameters(string pPublicKey)
    {
        byte[] lDer; 
        int lBeginStart = "-----BEGIN PUBLIC KEY-----".Length;
        int lEndLenght = "-----END PUBLIC KEY-------".Length;
        string KeyString = pPublicKey.Substring(lBeginStart, (pPublicKey.Length - lBeginStart - lEndLenght));
        lDer = Convert.FromBase64String(KeyString);
        RSAParameters lRSAKeyInfo = new RSAParameters();
        lRSAKeyInfo.Modulus = GetModulus(lDer);
        lRSAKeyInfo.Exponent = GetExponent(lDer);

        return lRSAKeyInfo;
    }
    private static byte[] GetModulus(byte[] pDer)
    {
        string lModulus = BitConverter.ToString(pDer).Replace("-", "").Substring(58, 256);
        return StringHexToByteArray(lModulus);
    }


    private static byte[] GetExponent(byte[] pDer)
    {
        int lExponentLenght = pDer[pDer.Length - 3];
        string lExponent = BitConverter.ToString(pDer).Replace("-", "").Substring((pDer.Length * 2) - lExponentLenght * 2, lExponentLenght * 2);

        return StringHexToByteArray(lExponent);
    }


    public static byte[] StringHexToByteArray(string hex)
    {
        return Enumerable.Range(0, hex.Length)
                         .Where(x => x % 2 == 0)
                         .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                         .ToArray();
    }
...