5

EDIT2: Convert.FromBase64Stringは私の救世主です。コンマがすべてこのような文字列に含まれるかどうかは誰にも分かりますか?私は基本的なCSV解析を行っています。それは私はいつも引用符を使用することができます(しかし、このような文字列に引用符を入れることもできます)。しかし、これは私にとってはちょっとしたプロジェクトなので、 '、'で分割して解析する方が簡単です。C#RSACryptoServiceProvider ToXmlString()/ FromXmlString()

EDIT: OK暗号化されたバイトを文字列に変換してから、その文字列を復号化するバイトに変換すると問題が発生するようです。実際に暗号化された文字列をどこかに格納し、その文字列を復号化できるようにするために、私はこれをどのように行うことができますか?

xmlファイルに公開鍵(および非公開のテスト用)を保存しようとしているため、後で同じファイルを読むことができますが、解読しようとすると「不正なデータ」エラーが発生します。誰かが私が間違っているのを見ることができますか?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Cryptography; 
using System.IO; 

namespace EncryptionTest 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     UnicodeEncoding ByteConverter = new UnicodeEncoding(); 

     byte[] dataToEncrypt = ByteConverter.GetBytes("Test data"); 

     WriteRSAInfoToFile(); 

     string enc = Encrypt(dataToEncrypt); 

     enc = Decrypt(enc); 
    } 

    static void WriteRSAInfoToFile() 
    { 
     RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 
     TextWriter writer = new StreamWriter("C:\\publicKey.xml"); 
     string publicKey = RSA.ToXmlString(false); 
     writer.Write(publicKey); 
     writer.Close(); 

     writer = new StreamWriter("C:\\privateKey.xml"); 
     string privateKey = RSA.ToXmlString(true); 
     writer.Write(privateKey); 
     writer.Close(); 
    } 

    static string Encrypt(byte[] data) 
    { 
     UnicodeEncoding ByteConverter = new UnicodeEncoding(); 
     RSACryptoServiceProvider encrypt = new RSACryptoServiceProvider(); 
     TextReader reader = new StreamReader("C:\\publicKey.xml"); 
     string publicKey = reader.ReadToEnd(); 
     reader.Close(); 

     encrypt.FromXmlString(publicKey); 

     byte[] encryptedData = encrypt.Encrypt(data, false); 

     return ByteConverter.GetString(encryptedData); 
    } 

    static string Decrypt(string data) 
    { 
     UnicodeEncoding ByteConverter = new UnicodeEncoding(); 
     RSACryptoServiceProvider decrypt = new RSACryptoServiceProvider(); 
     TextReader reader = new StreamReader("C:\\privateKey.xml"); 
     string privateKey = reader.ReadToEnd(); 
     reader.Close(); 

     decrypt.FromXmlString(privateKey); 

     byte[] d = ByteConverter.GetBytes(data); 
     byte[] decryptedData = decrypt.Decrypt(d, false);  // ERROR: bad data 

     return ByteConverter.GetString(decryptedData); 
    } 
} 

}

答えて

0

これは(私はその部分がOKに見えると思いますが、ファイルI/Oはしかし容易に行うことができます)の取り扱いあなたの公開鍵/秘密鍵とは何の関係もありません。

しかし、暗号化されたデータを文字列として転送する方法は、「往復」には適していません。代わりにBase64エンコーディングを使用してください。

これはデバッガで見ることができるはずです:長さと最初のバイトをメモして、encryptedDataとし、これはDecryptメソッドでdと一致する必要があります。

+0

あなたが正しくありました。 Base64が働いた。ありがとうございました – user441521

+0

文字列を使って暗号文を往復させない - http://blogs.msdn.com/b/shawnfa/archive/2005/11/10/491431.aspx ここで言及する価値があります。 – gmaran23

0

2番目の編集に対する答えは「いいえ、base64文字列は英数字と「+」、「/」、「=」のみを使用します。

詳細については、

関連する問題