【问题标题】:Decrypt a byte[] signed with a private key解密用私钥签名的 byte[]
【发布时间】:2016-03-27 08:24:41
【问题描述】:

我有两个 XML 文件,其中包含由 RSACryptoServiceProvider 类生成的私钥和公钥。我已将随机字符串转换为字节数组,并使用私钥对其进行了加密。但是如何使用公钥再次解密 byte[] 呢?这是我目前所拥有的:

    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;
            }
        }
    }

【问题讨论】:

  • 如果您有对称密码(如 RSA)的公钥和私钥,则加密与解密的过程相同。如果你用公钥加密数据,用私钥加密,你会得到原始数据(反之亦然)。
  • 签名!= 加密。签名的逆过程是验证,为了执行该步骤,您仍然需要访问原始数据。
  • @libik:“如果你用公钥加密数据,用私钥加密,你会得到原始数据” - 你的意思是“如果你用公钥解密数据,用私钥加密,你得到原始数据”??
  • @Zotyi - 已有 6 年的评论,但据我所知,RSA 的加密和解密没有区别。也许说“如果您将公钥应用于应用了私有的数据,您将获得原始数据(反之亦然)”会更有意义

标签: c#


【解决方案1】:

您无法解密回unencryptedString 的值。根据文档,RSACryptoServiceProvider.SignData 方法计算指定数据的哈希值并对其进行签名。由于哈希在设计上是不可逆的,因此您无法解密回原始值。

但是,您可以使用RSACryptoServiceProvider 来加密和解密数据。下面我包含了来自MSDN文档的示例应用程序

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;
        }

    }
}

【讨论】:

    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2022-09-25
    • 2016-09-15
    • 2018-11-26
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多