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 中不起作用,您应该使用基于 RSAParameters
的 ImportParameters
/ExportParameters
代替。
我正在尝试使用 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 中不起作用,您应该使用基于 RSAParameters
的 ImportParameters
/ExportParameters
代替。