RSA解密错误

RSA decrypt error

我正在尝试使用 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

我在文本数组中出错了?数组大小错误?

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

如果您想通过文本界面传输它,那么您应该在加密后进行 base 64 编码,在解密前进行 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);

是您不需要也不需要的所有东西。

最容易犯的错误:你在文件末尾写了一个换行符,这个换行符被读入 to_decrypt/text,使它成为两个(在 Windows) 比实际密文大的字节。比较 dataToEncrypt 的长度(当它已经加密时)和 text.

正如 Maarten 已经说过的,我们中的许多人也说过无数次,在 (real/modern) 密码学中没有字符串,只有字节。 Base64 是一种通过文本流发送字节的稳定方式,如果需要的话。您的另一个错误来源可能是您在 "ciphertext" 的文本解释中得到 [=14=] (这不是文本,而是基于字符的加密的遗留名称)并且它不是圆形-以您希望或期望的方式绊倒。不过,我认为这不是您当前的问题,因为您将数据分隔作为字节处理。

并且,仅供参考:基于 XML 的密钥 export/import 在 .NET Core 中不起作用,您应该使用基于 RSAParametersImportParameters /ExportParameters 代替。