2017-05-31 89 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); 

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