1

開発マシンで正常に機能する値を復号化するために使用しているこの関数があります。しかし、別のサーバーで本番環境で実行すると、次の正確なエラー メッセージが表示されます。

システムは、指定されたファイルを見つけることができません。

関数は次のとおりです。

 public static string Decrypt(string stringToDecrypt, string key)
    {
        string result = null;

        if (string.IsNullOrEmpty(stringToDecrypt))
        {
            throw new ArgumentException("An empty string value cannot be encrypted.");
        }

        if (string.IsNullOrEmpty(key))
        {
            throw new ArgumentException("Cannot decrypt using an empty key. Please supply a decryption key.");
        }

        try
        {
            System.Security.Cryptography.CspParameters cspp = new System.Security.Cryptography.CspParameters();
            cspp.KeyContainerName = key;

            System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(cspp);
            rsa.PersistKeyInCsp = true;

            string[] decryptArray = stringToDecrypt.Split(new string[] { "-" }, StringSplitOptions.None);
            byte[] decryptByteArray = Array.ConvertAll<string, byte>(decryptArray, (s => Convert.ToByte(byte.Parse(s, System.Globalization.NumberStyles.HexNumber))));


            byte[] bytes = rsa.Decrypt(decryptByteArray, true);

            result = System.Text.UTF8Encoding.UTF8.GetString(bytes);

        }
        finally
        {
            // no need for further processing
        }

        return result;
    }

アップデート

みんな、私はもともとこのルートに行きました。何時間も検索した後、スタックオーバーフローで答えを得たからです。暗号化/復号化のこの方法は文字列に対してのみ機能し、キーをインポート/エクスポートする必要はありません。

それで....今、キーファイルがありませんか?キーファイルを作成していませんでした。

4

5 に答える 5

2

あるマシンから別のマシンにキーをコピーする必要がある場合は、キー コンテナーからエクスポートする必要があります。rsaCryptoServiceProvider.ImportCspBlobメソッドとExportCspBlobメソッドがこれにうまく機能することがわかりました。Convert.ToBase64String単一のバイト配列を取得し、それを取得できますConvert.FromBase64String

もちろん、それはエクスポート可能なキーである必要があります (または、さらに良いことに、一方の端には秘密キーがあり、もう一方の端には公開キーのみがあるように、PKC が意図されている方法である公開キーのみをエクスポートします)。エクスポート不可能なキーは、その公開キーのみをエクスポートできます。システムが機能するようになったら、秘密鍵が必要な場所に新しいエクスポート不可能な鍵を作成し、公開鍵をエクスポートして、その単一の受信者に暗号化する必要がある場所に転送することができます。

Disposeまた、完了したら、暗号プロバイダーに確認する必要があります (明らかにClear()十分ではありません)。1 つのローカル スコープで使用している場合、またはブロックusing内で実行できる場合は、ステートメントを使用してこれを行うとよいでしょう。finally明示的に実装されるため、別のステートメントで行うにはややぎこちなくIDisposableキャストする必要があることに注意してください。IDisposableステートメントはキャスト自体を処理するusingため、簡単です。

于 2009-10-01T17:10:03.690 に答える
2

keyパラメータを暗号としてではなく、コンテナの名前として使用していることに注意してください。これは、以前にキーを保存した暗号化機能に依存しています。コンピュータ間で暗号化されたデータを転送するのには適していません。キーも転送しない限り。

于 2009-10-01T17:02:23.557 に答える
1

Sysinternals.com の FileMon を使用して、探しているファイルを確認しますか?

私の推測では、 cspp.KeyContainerName = key; です。該当する行です。

于 2009-10-01T16:58:57.910 に答える
0

問題は、RSA オブジェクトがユーザー プロファイルで CryptoContainer を作成しようとすることです。
これを追加しようとすることができます:

rsa.UseMachineKeyStore = true;
于 2009-10-01T17:06:25.773 に答える
0

keyサーバー上の暗号プロバイダーで指定されたコンテナーにキーをインストールしましたか? 「方法: X.509 証明書管理ツールを使用する」を参照してください。

ところで、サーバー上でのみ秘密鍵であるべきものを自分のマシンで復号化できる場合、その鍵はすでに侵害されています。できるだけ早くキーを変更する必要があります。

アップデート

RSA 暗号化は非対称キーに基づいています。あなたは公開鍵で暗号化し、宛先は秘密鍵で復号化します。キーは事前にプロビジョニングされ、宛先はキーペアを生成または取得し、プライベート部分を自分自身に保持し、パブリック部分を他の人にアドバタイズします. 通常、キーは X509 証明書としてパックされます。これは、証明書に関する信頼インフラストラクチャ全体 (署名、信頼できる機関、証明書の目的など) を利用するためです。その場合、メッセージの宛先は、信頼できる機関 (つまり、Verisign) などからの暗号化目的の証明書を要求する必要があります。または、自己署名証明書 (makecert.exe) を使用し、バンド外の方法 (つまり、 . 証明書ハッシュまたは発行者名/シリアル番号を検証するための電話)。

RSa 暗号化は、「単なる文字列」とはかけ離れています「単なる文字列」に近いのは対称鍵暗号 (AES、DES、XDES、RC4) で、アプリケーションには暗号化と復号化の両方に使用される秘密鍵があります。

何をしているのかよくわからない場合は、暗号化を避けて、SSL/TLS (オンライン) やS-MIME (オフライン) などの市販のプロトコルを使用してください。さらに良いことに、CryptoStreamProtectedDataなどのフレームワーク機能を使用してください。会ったことのない人々からのニュースグループのアドバイスに基づいて、さらに別の疑似暗号を作成しないでください...

于 2009-10-01T17:03:17.120 に答える