2017-05-31 92 views
1

我想用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"; 

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 
    ... 

我有错误:

CryptographicException:Bad data

我犯的错误文本数组?错误的数组大小?

+0

您还需要发布加密代码 –

回答

0

最容易犯的错误:您在文件末尾写了一个换行符,并且正在将这个换行符读入to_decrypt/text,从而使它在实际密文中大于两个字节(在Windows上)。比较dataToEncrypt(当它已被加密时)和text的长度。

正如马丁已经说过的,我们中有很多人说过无数次,(真实/现代)密码学中没有字符串,只是字节。当需要时,Base64是通过文本流发送字节的稳定方式。您的其他错误来源可能是您在对“密文”(这不是文本,而是基于字符的加密的传统名称)的文本解释中获得\0,并且它不会以您希望的方式来回跳动或预期。不过,我认为这不是你目前的问题,因为你将数据分离作为字节来处理。

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

0

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

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

你当然也可以创建一个带有加密内容的二进制文件。


此加密过程:

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

是你不希望也不需要所有的东西。