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