gpt4 book ai didi

c# - 解密一个用私钥签名的 byte[]

转载 作者:太空宇宙 更新时间:2023-11-03 21:15:48 25 4
gpt4 key购买 nike

我有两个 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;
}
}
}

最佳答案

您无法解密回 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;
}

}
}

关于c# - 解密一个用私钥签名的 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34392681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com