Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RSA解密错误_C#_Cryptography_Rsa - Fatal编程技术网

C# RSA解密错误

C# RSA解密错误,c#,cryptography,rsa,C#,Cryptography,Rsa,我正在尝试用RSA加密和解密带有小字符串的文件。 加密字符串后,程序将私钥和加密文本写入文件 要加密的代码: RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(4096); string pub = rsa.ToXmlString(false); string priv = rsa.ToXmlString(true); string to_crypt = "Hello world, try to crypt me"; byt

我正在尝试用RSA加密和解密带有小字符串的文件。 加密字符串后,程序将私钥和加密文本写入文件

要加密的代码:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(4096);
string pub = rsa.ToXmlString(false);
string priv = rsa.ToXmlString(true);
string to_crypt = "Hello world, try to crypt me";

byte[] dataToEncrypt = Encoding.ASCII.GetBytes(to_crypt);
rsa.FromXmlString(pub);
dataToEncrypt = rsa.Encrypt(dataToEncrypt, false);

string s = System.Text.Encoding.UTF8.GetString(dataToEncrypt, 0, dataToEncrypt.Length);
WriteFile("crypt", priv+s);
另一个程序读取数组中的文本并尝试解密:

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(4096))
{
byte[] to_decrypt = File.ReadAllBytes(args[0]);
byte[] key = new byte[3219];
byte[] text = new byte[to_decrypt.Length - key.Length];
Buffer.BlockCopy(to_decrypt, 0, key, 0, key.Length);
Buffer.BlockCopy(to_decrypt, key.Length, text, 0, text.Length);

string skey = System.Text.Encoding.UTF8.GetString(key, 0, key.Length);
rsa.FromXmlString(skey);
rsa.Decrypt(text, false);        <---- Error: Bad data
    ...
使用(RSACryptoServiceProvider rsa=新的RSACryptoServiceProvider(4096))
{
字节[]to_decrypt=File.ReadAllBytes(args[0]);
字节[]键=新字节[3219];
字节[]文本=新字节[to_decrypt.Length-key.Length];
BlockCopy(要解密,0,key,0,key.Length);
Buffer.BlockCopy(要解密,key.Length,text,0,text.Length);
string skey=System.Text.Encoding.UTF8.GetString(key,0,key.Length);
rsa.FromXmlString(skey);

rsa.Decrypt(text,false);rsa加密为密文,密文不是UTF-8,而是一个没有任何字符编码的字节数组

如果您想通过文本接口传输它,那么您应该在加密之后进行base64编码,在解密之前进行base64解码

当然,您也可以创建一个包含加密内容的二进制文件


在加密过程中执行以下操作:

string s = System.Text.Encoding.UTF8.GetString(dataToEncrypt, 0, dataToEncrypt.Length);
在解密过程中:

byte[] key = new byte[3219];
byte[] text = new byte[to_decrypt.Length - key.Length];
Buffer.BlockCopy(to_decrypt, 0, key, 0, key.Length);
Buffer.BlockCopy(to_decrypt, key.Length, text, 0, text.Length);
...
string skey = System.Text.Encoding.UTF8.GetString(key, 0, key.Length);

都是你不想要也不需要的东西。

RSA加密为密文,它不是UTF-8,而是一个没有任何字符编码的字节数组

如果您想通过文本接口传输它,那么您应该在加密之后进行base64编码,在解密之前进行base64解码

当然,您也可以创建一个包含加密内容的二进制文件


在加密过程中执行以下操作:

string s = System.Text.Encoding.UTF8.GetString(dataToEncrypt, 0, dataToEncrypt.Length);
在解密过程中:

byte[] key = new byte[3219];
byte[] text = new byte[to_decrypt.Length - key.Length];
Buffer.BlockCopy(to_decrypt, 0, key, 0, key.Length);
Buffer.BlockCopy(to_decrypt, key.Length, text, 0, text.Length);
...
string skey = System.Text.Encoding.UTF8.GetString(key, 0, key.Length);

都是你不想要也不需要的东西。

最容易犯的错误是:你在文件末尾写了一个换行符,而该换行符被读入
以解密
/
文本
,使其比实际密文大两个字节(在Windows上)。比较
数据的长度和加密的长度(当它已经加密时)和
text

正如Maarten已经说过的,我们中的许多人已经说过无数次,在(真实/现代)加密中没有字符串,只有字节。Base64是一种通过文本流发送字节的稳定方式,当这是一种要求时。您的另一个错误源可能是您在对“密文”的文本解释中得到了
\0
(这不是文本,而是基于字符的加密的遗留名称)并且它不是您希望或期望的往返方式。不过,我不认为这是您当前的问题,因为您将数据分离作为字节处理


而且,仅供参考:基于XML的密钥导出/导入在.NET Core中不起作用,您应该使用基于
RSAPERAMETERS
ImportParameters
/
ExportParameters

最容易的错误是:您在文件末尾写了一个换行符,而该换行符正被读入
以进行解密/<代码>文本
,使其比实际密文大两个字节(在Windows上)。将
数据的长度与加密
(已加密时)和
文本
进行比较

正如Maarten已经说过的,我们中的许多人已经说过无数次,在(真实/现代)加密中没有字符串,只有字节。Base64是一种通过文本流发送字节的稳定方式,当这是一种要求时。您的另一个错误源可能是您在对“密文”的文本解释中得到了
\0
(这不是文本,而是基于字符的加密的遗留名称)并且它不是您希望或期望的往返方式。不过,我不认为这是您当前的问题,因为您将数据分离作为字节处理


而且,仅供参考:基于XML的密钥导出/导入在.NET Core中不起作用,您应该使用基于
rsapameters
ImportParameters
/
ExportParameters

您还需要发布加密代码