1

私はこのようにRSACryptoServiceProviderを使用しています...

 private byte[] RSAEncrypt(byte[] DataToEncrypt, string ContainerName, bool DoOAEPPadding)
    {
        try
        {
            byte[] encryptedData;

            // Create a new instance of CspParameters.  Pass
            // 13 to specify a DSA container or 1 to specify
            // an RSA container.  The default is 1.
            CspParameters cspParams = new CspParameters();

            // Specify the container name using the passed variable.
            cspParams.KeyContainerName = ContainerName;

            cspParams.Flags = CspProviderFlags.UseDefaultKeyContainer;

            //Create a new instance of RSACryptoServiceProvider.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams))
            {
                //Encrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  

                encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
            }
            return encryptedData;
        }
        //Catch and display a CryptographicException  
        //to the console.
        catch (CryptographicException ex)
        {
            sl.Write(ex, MessageType.Error);
            throw;                
        }
    }

次に、Outlook プラグイン Windows フォーム アプリケーションをオフにして、このコードを使用しているアプリケーションを再びオンにした後、データの暗号化を解除しようとしました。復号化コードは次のようになります...

private byte[] RSAEncrypt(byte[] DataToEncrypt, string ContainerName, bool DoOAEPPadding)
    {
        try
        {
            byte[] encryptedData;

            // Create a new instance of CspParameters.  Pass
            // 13 to specify a DSA container or 1 to specify
            // an RSA container.  The default is 1.
            CspParameters cspParams = new CspParameters();

            // Specify the container name using the passed variable.
            cspParams.KeyContainerName = ContainerName;

            cspParams.Flags = CspProviderFlags.UseDefaultKeyContainer;

            //Create a new instance of RSACryptoServiceProvider.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams))
            {
                //Encrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  

                encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
            }
            return encryptedData;
        }
        //Catch and display a CryptographicException  
        //to the console.
        catch (CryptographicException ex)
        {
            sl.Write(ex, MessageType.Error);
            throw;                
        }
    }    

指を置くことができない何かが現れるまで、うまく機能します。日付が変わったようなものかどうかはわかりません。データを復号化しようとすると、「不良データ」エラーが発生します。ここでも、一定の時間が経過するか、アプリをオフにするか、ユーザーがログオフするまで、うまく機能します。何が原因なのかわからず、特定できません。テキストファイルから暗号化されたデータを吹き飛ばし、それを再作成して復号化した瞬間、問題はありません。暗号化/ファイルへの保存とファイルからの読み取り/復号化の間にアプリケーションを再起動しても、うまく機能します! 何かが起こり、CspParameters の有効期限が切れる原因を理解するのに十分な KeyContainers を知りません。

4

3 に答える 3

0

最終的にCspParametersフラグを使用し、UsersKeyContainerストアを使用する代わりにMachineKeyContainerストアを使用しました。

于 2010-09-09T00:41:43.650 に答える
0

はい、設定した場合: cspParams.Flags = CspProviderFlags.UseDefaultKeyContainer;

次に、キー コンテナーがユーザーのキー コンテナー ストアに格納されます。次に、別のユーザーが行うようにログオンし、RSA を使用して、まったく異なる KeyContainer ストアを提示します。

代わりにこれを使用します: cspParams.Flags = CspProviderFlags.UseMachineKeyStore = true;

マシンのグローバルであるローカル マシンの KeyContainer ストアを使用し、ログインしているユーザーに関係なく、同じ KeyContainer ストアを提供します。ただし、これはその Windows インストールにのみ適用されます。別の Windows インストールまたはマシンでプログラムを実行すると、別の KeyContainer ストアが提供されます。複数のマシンで同じデータを復号化する場合は、キーをハード ドライブ上のファイルに永続化する必要があります。キーをプレーン テキスト ファイルに保持することはセキュリティ上の大きなリスクとなるため、キーをファイルに保持する前に暗号化するか、パスワードで保護された .rar ファイルなどに入れてください。

それでも問題が解決しない場合は、次のように設定してみてください: RSA.PersistKeyInCsp = true;

これにより、キーが KeyContainer ストアに永続化されます。次のような CspParameters コンストラクターを使用する場合、KeyContainer 内のファイルの永続化が既定の動作になります。

CspParameters cspParams = new CspParameters();

Microsoft 自身の言葉を借りれば、「この形式の CspParameters は、ProviderType フィールドを PROV_RSA_AES プロバイダーを指定する値 24 に初期化します。」ソース: http://msdn.microsoft.com/en-us/library/xw9ywed4.aspx

したがって、コード内のコメントは正しくなく、誤解を招く可能性があります。それらを修正することをお勧めします。

KeyContainer ストアでのキーの永続化に関する他の ProviderTypes とそのデフォルト設定については不明であるため、問題が解決しない場合は PersistKeyInCsp を TRUE に設定する必要があるかもしれません。

お役に立てれば。

〜アダム・ホワイトハット();

于 2013-01-17T10:49:34.943 に答える
0

本当に行き詰まっている場合は、弾む城の暗号ライブラリを使用してみてください。

http://www.bouncycastle.org/csharp/

于 2010-08-30T23:44:26.757 に答える