C#/WPF RSA不';t解密文本
当我试图解密C#中使用RSA生成的字符串时,我遇到了一个问题。它可以很好地加密字符串,但当我尝试使用私钥解密字符串时,它会抛出一个错误:C#/WPF RSA不';t解密文本,c#,wpf,rsa,C#,Wpf,Rsa,当我试图解密C#中使用RSA生成的字符串时,我遇到了一个问题。它可以很好地加密字符串,但当我尝试使用私钥解密字符串时,它会抛出一个错误: Error occurred while decoding OAEP padding. 我尝试将fOAEP参数更改为true和false,将RSACryptServiceProviders更改为2048作为参数,但仍然不起作用 Project是一个WPF应用程序,它生成2个带密钥的文件,密钥由core.cs文件加载。 然后,正在加载密钥 我举的例子只使用公钥
Error occurred while decoding OAEP padding.
我尝试将fOAEP参数更改为true和false,将RSACryptServiceProviders更改为2048作为参数,但仍然不起作用
Project是一个WPF应用程序,它生成2个带密钥的文件,密钥由core.cs文件加载。
然后,正在加载密钥
我举的例子只使用公钥加密字符串,而只使用私钥解密字符串
Core.cs文件
//已生成密钥
public void GeneratePublicKey(字符串publicKeyFile){
使用(var rsa=new RSACryptoServiceProvider(2048)){
rsa.PersistKeyInCsp=false;
if(File.Exists(publicKeyFile))
文件。删除(publicKeyFile);
//还有公钥。。。
var pubKey=rsa.ExportParameters(false);
//将公钥转换为字符串表示形式
字符串pubKeyString{
//我们需要一些缓冲
var sw=new System.IO.StringWriter();
//我们需要一个序列化程序
var xs=new System.Xml.Serialization.XmlSerializer(typeof(rsapameters));
//将密钥序列化到流中
序列化(sw,pubKey);
//从流中获取字符串
pubKeyString=sw.ToString();
}
writealText(publicKeyFile,pubKeyString);
}
}
public void GeneratePrivateKey(字符串privateKeyFile){
使用(var rsa=new RSACryptoServiceProvider(2048)){
rsa.PersistKeyInCsp=false;
if(File.Exists(privateKeyFile))
文件。删除(privateKeyFile);
//如何获取私钥
var privKey=rsa.ExportParameters(true);
//将公钥转换为字符串表示形式
字符串privKeyString;
{
//我们需要一些缓冲
var sw=new System.IO.StringWriter();
//我们需要一个序列化程序
var xs=new System.Xml.Serialization.XmlSerializer(typeof(rsapameters));
//将密钥序列化到流中
序列化(sw,privKey);
//从流中获取字符串
privKeyString=sw.ToString();
}
writealText(privateKeyFile,privKeyString);
}
}
//没有一般性的存在,只有一个层次(层次)
public参数ReadPublicKey(字符串publicKeyFile){
//里尔
字符串pubKeyString=File.ReadAllText(publicKeyFile);
//再转化
var sr=new System.IO.StringReader(pubKeyString);
//我们需要一个反序列化程序
var xs=new System.Xml.Serialization.XmlSerializer(typeof(rsapameters));
//从流中获取对象
返回(rsa参数)xs.反序列化(sr);
}
公共参数ReadPrivateKey(字符串privateKeyFile){
//里尔
字符串privKeyString=File.ReadAllText(privateKeyFile);
//再转化
var sr=new System.IO.StringReader(privKeyString);
//我们需要一个反序列化程序
var xs=new System.Xml.Serialization.XmlSerializer(typeof(rsapameters));
//从流中获取对象
返回(rsa参数)xs.反序列化(sr);
}
//这是一个公共场所
公共字符串加密(字符串公钥文件、字符串文本加密){
var csp=新的RSACryptServiceProvider();
导入参数(ReadPublicKey(publicKeyFile));
//对于加密,始终处理字节。。。
var bytesplantextdata=System.Text.Encoding.Unicode.GetBytes(textToEncrypt);
//应用pkcs#1.5填充并加密我们的数据
var bytesCypherText=csp.Encrypt(bytesplantextdata,true);
//我们可能需要密码文本的字符串表示形式…base64就可以了
Debug.WriteLine(“Texto Encriptado:+Convert.ToBase64String(bytesCypherText));
返回Convert.tobase64字符串(bytesCypherText);
}
///
///私人住宅
///
///
///
///
公共字符串解密(字符串privateKeyFile、字符串textToDecrypt){
//首先,从base64字符串中获取字节。。。
var bytesCypherText=Convert.FromBase64String(textToDecrypt);
//我们想要解密,因此需要csp并加载私钥
var csp=新的RSACryptServiceProvider();
导入参数(ReadPrivateKey(PrivateKey文件));
//解密并剥离pkcs#1.5填充
var bytesplantextdata=csp.Decrypt(bytesCypherText,true);
Debug.WriteLine(“Desencriptado:”+
System.Text.Encoding.Unicode.GetString(bytesPlainTextData));
//把我们的原始明文拿回来。。。
返回System.Text.Encoding.Unicode.GetString(bytesPlainTextData);
}
MainWindow.cs
公共部分类主窗口:窗口{
只读RsaEnc_rs=新的RsaEnc();
私有字符串_publicKeyFile=“./public.cert”;
私有字符串_privateKeyFile=“/private.key”;
公共主窗口(){
初始化组件();
}
私有void生成器单击(对象发送方,路由目标){
_R.GeneratePublicKey(_pu
internal sealed class RSA
{
public static (string public_key, string private_key) getKeyPair()
{
try
{
var rsa_provider = new RSACryptoServiceProvider(1024);
return (rsa_provider.ToXmlString(false), rsa_provider.ToXmlString(true));
}
catch (Exception ex)
{
throw ex;
}
}
public static byte[] shroud_divulge(byte[] input_byte, string _key,bool is_shroud)
{
try
{
var rsa_provider = new RSACryptoServiceProvider();
rsa_provider.FromXmlString(_key);
var padding = RSAEncryptionPadding.OaepSHA256;
switch(is_shroud)
{
case true:
return rsa_provider.Encrypt(input_byte, padding);
case false:
return rsa_provider.Decrypt(input_byte, padding);
}
return null;
}
catch (Exception)
{
throw;
}
}
}