C# 解密用私钥签名的字节[]

C# 解密用私钥签名的字节[],c#,C#,我有两个XML文件,其中包含由RSACryptoServiceProvider类生成的私钥和公钥。我将一个随机字符串转换成字节数组,并使用私钥对其进行加密。但是如何使用公钥再次解密字节[]?以下是我目前掌握的情况: class Program { static void Main(string[] args) { RSACryptoServiceProvider encryptor = new RSACryptoServic

我有两个XML文件,其中包含由RSACryptoServiceProvider类生成的私钥和公钥。我将一个随机字符串转换成字节数组,并使用私钥对其进行加密。但是如何使用公钥再次解密字节[]?以下是我目前掌握的情况:

    class Program
    {
        static void Main(string[] args)
        {
            RSACryptoServiceProvider encryptor = new RSACryptoServiceProvider();
            encryptor.FromXmlString(GetPrivateKey());


            string unencryptedString = "This string could only have been send by me.";

            byte[] unencryptedByteArray = Encoding.Unicode.GetBytes(unencryptedString);

            byte[] encryptedByteArray = encryptor.SignData(unencryptedByteArray, new SHA1CryptoServiceProvider());

            byte[] decryptedByteArray; //how do I decrypt the array again?

            string decryptedString = System.Text.Encoding.Unicode.GetString(decryptedByteArray);

            Console.WriteLine(decryptedString);

            Console.ReadKey();
        }

        private static string GetPrivateKey()
        {
            using (TextReader reader = new StreamReader(@"path to private key file generated by the ToXmlString method"))
            {
                string privateKey = reader.ReadToEnd();
                reader.Close();
                return privateKey;
            }
        }

        private static string GetPublicKey()
        {
            using (TextReader reader = new StreamReader(@"path to public key file generated by the ToXmlString method"))
            {
                string privateKey = reader.ReadToEnd();
                reader.Close();
                return privateKey;
            }
        }
    }

无法解密回
未加密字符串的值。根据文档,方法
rsacyptoserviceprovider.SignData
计算指定数据的哈希值并对其签名。由于散列在设计上是不可逆的,因此无法解密回原始值

但是,您可以使用
rsacyptoserviceprovider
对数据进行加密和解密。下面我已经包括了一个示例应用程序,它来自于


无法解密回
未加密字符串的值。根据文档,方法
rsacyptoserviceprovider.SignData
计算指定数据的哈希值并对其签名。由于散列在设计上是不可逆的,因此无法解密回原始值

但是,您可以使用
rsacyptoserviceprovider
对数据进行加密和解密。下面我已经包括了一个示例应用程序,它来自于


如果对称密码(如RSA)有公钥和私钥,则加密过程与解密过程相同。如果使用公钥加密数据(使用私钥加密),则会获得原始数据(反之亦然)。签名!=加密。签名的反向过程是验证,为了执行该步骤,您仍然需要访问原始数据。如果您拥有对称密码(如RSA)的公钥和私钥,则加密过程与解密过程相同。如果使用公钥加密数据(使用私钥加密),则会获得原始数据(反之亦然)。签名!=加密。与签名相反的过程是验证,为了执行该步骤,您仍然需要访问原始数据。
using System;
using System.Security.Cryptography;
using System.Text;

class RSACSPSample
{

    static void Main()
    {
        try
        {
            //Create a UnicodeEncoder to convert between byte array and string.
            UnicodeEncoding ByteConverter = new UnicodeEncoding();

            //Create byte arrays to hold original, encrypted, and decrypted data.
            byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt");
            byte[] encryptedData;
            byte[] decryptedData;

            //Create a new instance of RSACryptoServiceProvider to generate
            //public and private key data.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {

                //Pass the data to ENCRYPT, the public key information 
                //(using RSACryptoServiceProvider.ExportParameters(false),
                //and a boolean flag specifying no OAEP padding.
                encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false);

                //Pass the data to DECRYPT, the private key information 
                //(using RSACryptoServiceProvider.ExportParameters(true),
                //and a boolean flag specifying no OAEP padding.
                decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false);

                //Display the decrypted plaintext to the console. 
                Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData));
            }
        }
        catch (ArgumentNullException)
        {
            //Catch this exception in case the encryption did
            //not succeed.
            Console.WriteLine("Encryption failed.");

        }
    }

    static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
    {
        try
        {
            byte[] encryptedData;
            //Create a new instance of RSACryptoServiceProvider.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {

                //Import the RSA Key information. This only needs
                //toinclude the public key information.
                RSA.ImportParameters(RSAKeyInfo);

                //Encrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  
                encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
            }
            return encryptedData;
        }
        //Catch and display a CryptographicException  
        //to the console.
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);

            return null;
        }

    }

    static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
    {
        try
        {
            byte[] decryptedData;
            //Create a new instance of RSACryptoServiceProvider.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
            {
                //Import the RSA Key information. This needs
                //to include the private key information.
                RSA.ImportParameters(RSAKeyInfo);

                //Decrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  
                decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
            }
            return decryptedData;
        }
        //Catch and display a CryptographicException  
        //to the console.
        catch (CryptographicException e)
        {
            Console.WriteLine(e.ToString());

            return null;
        }

    }
}