2017-05-31 20 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に読み込まれているため、実際の暗号文よりも2バイト大きい(Windows上の)バイトになります。 dataToEncrypt(既に暗号化されている場合)とtextの長さを比較してください。

Maartenはすでに言いましたが、私たちの多くは無数の時間を言っていましたが、現実の/現代の暗号では文字列がなく、バイトしかありません。 Base64は、テキストストリーム上でバイトを送信する安定した方法です。あなたの他のエラーは、「暗号文」(テキストではなく、文字ベースの暗号化からのレガシー名)のテキスト解釈で\0を取得している可能性があります。あなたが望むようにラウンドトリップしていませんまたは期待する。私はこれがあなたの現在の問題だとは思わない、あなたがバイトとしてデータの分離を渡しているので。

FYIと同様に、XMLベースのキーのエクスポート/インポートは.NETコアでは機能しません。代わりにRSAParametersベースのImportParameters/ExportParametersを使用してください。

0

RSAは、UTF-8ではなく文字エンコーディングのないバイト配列である暗号文に暗号化します。

テキストインターフェイスで転送する場合は、暗号化の後に64エンコードを、復号化の前にベース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); 

は、あなたが欲しいも必要としないすべてのものです。

関連する問題