2009-03-19 15 views
1

「不正データ」エラーを生成し、クラス:System.Security.Cryptographyと "Bad Data" - 文字エンコーディング?

 

using System; 
using System.Collections.Generic; 
using System.Security.Cryptography; 
using System.Text; 
using System.Windows.Forms; 

namespace MyNameSpace 
{ 

    public class RSAcrypt 
    { 
    private string _encryptedData; 
    private string _decryptedData; 

    public string EncryptedData 
    { 
     get { return _encryptedData; } 
     set { _encryptedData = value; } 
    } 

    public string DecryptedData 
    { 
     get { return _decryptedData; } 
     set { _decryptedData = value; } 
    } 

    public RSAcrypt() 
    { 
    } 
    /// <param name="CryptAction"> The action to perform on the string {Encrypt|Decrypt} </param > 
    /// <param name="StringToCrypt"> A string to perform the Action on </param> 
    public RSAcrypt(string CryptAction, string StringToCrypt) 
    { 
     UnicodeEncoding thisUnicodeEncoding = new UnicodeEncoding(); 
     RSACryptoServiceProvider thisRSACryptoServiceProvider = new RSACryptoServiceProvider(); 
     byte[] _stringToCrypt = thisUnicodeEncoding.GetBytes(StringToCrypt); 

     switch (CryptAction) 
     { 
      case "Encrypt": 
       byte[] encryptedData = Encrypt(_stringToCrypt, thisRSACryptoServiceProvider.ExportParameters(false)); 
       _encryptedData = thisUnicodeEncoding.GetString(encryptedData); 
      break; 

      case "Decrypt": 
       byte[] decryptedData = Decrypt(_stringToCrypt, thisRSACryptoServiceProvider.ExportParameters(true)); 
       _decryptedData = thisUnicodeEncoding.GetString(decryptedData); 
      break; 

      default: 

      break; 
     } 

    } 

    static private byte[] Encrypt(byte[] DataToEncrypt, RSAParameters keyInfo) 
    { 
     RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 
     RSA.ImportParameters(keyInfo); 
     return RSA.Encrypt(DataToEncrypt, false); 
    } 

    static private byte[] Decrypt(byte[] DataToDecrypt, RSAParameters keyInfo) 
    { 
     #region Temporary Assignment - Remove before build 

     byte[] tmpVal = null; 

     #endregion 

     RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 

     try 
     { 
      RSA.ImportParameters(keyInfo); 

      #region Temporary Assignment - Remove before build 

      tmpVal = RSA.Decrypt(DataToDecrypt, false); 

      #endregion 
     } 
     catch (Exception ex) 
     { 

      MessageBox.Show("Error: " + ex.Message, "Exception Thrown"); 

     } 

     #region Temporary Assignment - Remove before build 

     return tmpVal; 

     #endregion 
    } 
    } 
} 
 

は私が前に/復号化を暗号化するために、バイト配列を渡すにエンコーディングをチェックできるようになる私は、このクラスに変更できることはありますか?

ところで...私はどこかこの辺りの参照を持っているように思えるが、私はイライラになるのです、私は読んでコンパイルする以外の何かを停止した場合、私はそれが、少なくとも役立つだろうと思いました私はこのクラスを呼び出して、Nini初期化フレームワークを使用してXMLファイルへのパスワードに書き込みます。 http://nini.sourceforge.net/manual.php#ASimpleExample

また、私はXMLファイルに書いた前に、ファイルのエンコーディング(UTF-8)を変更するNotepad2を使用しました。

初めてコンパイルした後にプログラムが停止した後です。デバッガを使用して、メモリ(UTF-8)のXMLデータとディスク(ANSI)のデータのエンコーディングが異なることがわかりました。

これは当てはまりませんが、プログラムはまだ停止し、RSAcrypt()のDecrypt部分から返された不良データを参照します。

(私のフラストレーションが設定される前にEncryptとDecryptが同じメソッドであったことにも注意してください。同じ機能を果たしますが、間違ったデータクレームに関連する追加例外情報をキャプチャしようとしました。私の不満が私のコードをハンディキャップできるようにしました;-))

どのような提案、アイデアや参考資料が素晴らしいでしょう。あなたが暗号化と復号化どこコンストラクタがある

RSACryptoServiceProvider thisRSACryptoServiceProvider = new RSACryptoServiceProvider(); 

ので、あなたが暗号化されている:あなたはあなたが鍵ペアごとに新しいRSAを生成

あなたのコンストラクタ内
+0

aファイルに格納するデータを暗号化する場合は、AESを使用します。よりパフォーマンスが高く、対称暗号です。 – Alan

+0

機密データをセカンダリパーティに渡す場合は、RSAが適しています。 – Alan

+0

アラン、ありがとう、私はアプリケーションが動作している別の暗号に移動する予定だった。システムは物理的なアクセスが制限されたプライベートサブネット上に置かれますが、個人情報をDBに書き込むので、すべての情報を暗号化する必要があります。 お返事ありがとうございます。E – EtherealMonkey

答えて

3

TIA、

E RSA Keyを使用して暗号化し、まったく異なる鍵で復号化します。

この作業を行うには、コードの使用方法に基づいていくつかのオプションがあります。

1つの選択肢は、RSAキーをエクスポートし、すべての暗号化/復号化操作に使用することです。実行可能ファイルの異なる実行間でデータの復号化/暗号化を計画している場合は、これが唯一のオプションです。

もちろん、公開鍵/秘密鍵(Windows上でDPAPIをお勧めします)をどのように保存するかについては、アプリケーションで使用するために完全に説明しています。

+0

Alan、EncryptとDecryptメソッドもImportParameters()を実行すると、これは「異なるキー」の問題を解決すると思います。 –

+0

ただし、渡されるRSAキーは、デフォルト以外のRSAcryptコンストラクタを呼び出すたびに再生成されます。暗号化/復号化操作を行うたびに、コンストラクタを使用して暗号化/復号化を呼び出す唯一の方法であるため、新しいRSA鍵ペアが取得されます。 – Alan

関連する問題