2017-09-19 8 views
1

Windowsアプリケーション(x64)がWinodws 7,8、および10で正常に動作しています。今日はWindows 2012サーバーでプログラムを実行できませんでした。イベントログを見ると、System.Security.Cryptography.RijndaelManaged..ctor()に由来するエラーが見つかりました(残念ながら、ログは完全なパスを与えませんでした)。Windowsサーバー2012でRijndael暗号化が動作しません

私は、自分のプログラム内の機密データを暗号化するためにRijndaelアルゴリズムを使用しています。プログラムが最初に行うことは、すべての設定を取得するために、暗号化された設定ファイルを取得して解読することです。そして、これは私のプログラムが始まらない場所です。

これは私のプログラムで復号化方法である:

public static string Decrypt(string cipherText, string passPhrase) 
{ 
    byte[] cipherTextBytes = Convert.FromBase64String(cipherText); 
    using (PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null)) 
    { 
     byte[] keyBytes = password.GetBytes(keysize/8); 
     using (RijndaelManaged symmetricKey = new RijndaelManaged()) 
     { 
      symmetricKey.Mode = CipherMode.CBC; 
      using (ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)) 
      { 
       using (MemoryStream memoryStream = new MemoryStream(cipherTextBytes)) 
       { 
        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) 
        { 
         byte[] plainTextBytes = new byte[cipherTextBytes.Length]; 
         int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 
         return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); 
        } 
       } 
      } 
     } 
    } 
} 

そして、これは私がログに取得するエラーメッセージです:

アプリケーション:Postbag.exe Frameworkのバージョン:v4.0.30319説明: 未処理の例外が原因でプロセスが終了しました。例外 のSystem.InvalidOperationException のSystem.Security.Cryptography.RijndaelManaged..ctor() のCommon.StringCipher.Decrypt(System.String、System.String)Common.Conf..cctor()例外の情報: Postbag.Program.MainでPostbag.FormMain..ctorでCommon.Conf.get_DataProviderで System.TypeInitializationException() ()()

新しいサーバはまた、.NET Frameworkの同じバージョンを有します。

+0

ブロックサイズを変更していないので、 'new RijndaelManaged()'を 'Aes.Create()'に置き換えるだけです。同じ出力が生成されますが、FIPS例外はありません。 – bartonjs

答えて

4

RijndaelManagedクラスはFIPSに準拠しておらず、サーバーにセキュリティポリシーがあるようですシステム暗号化:暗号化、ハッシュ、および署名にFIPS準拠のアルゴリズムを使用します。。 Microsoft ASP.NETなど

のMicrosoft .NET FrameworkアプリケーションでのみFIPS 140準拠するNISTによって認定されたアルゴリズムの実装を使用するための許可:それは言う"System cryptography: Use FIPS compliant algorithms for encryption, hashing, and signing" security setting effects in Windows XP and in later versions of Windows articalナレッジベースで

。具体的には、インスタンス化できる暗号アルゴリズムクラスは、FIPS準拠のアルゴリズムを実装するものだけです。これらのクラスの名前は「CryptoServiceProvider」または「Cng」で終わります。このように終わる名前を持つクラスなどの他の暗号化アルゴリズムクラスのインスタンスを作成しようとすると「管理」を

のでdisable the security policy(SecPol.mscツールから)またはFIPSを使用するかを発生することがInvalidOperationException例外を引き起こします。残念ながら、Rijndaelはそのような実装をしていないので、AijはRijndaelとして開始されたものの正式な実装であるため、AesCngまたはAesCryptoServiceProviderがニーズに合っているかどうかを確認したい場合があります。 the blog Is RijndaelManaged class FIPS compliant?からPrateek Kr Dubeyに基づいて、RijdaelManagedで暗号化されたデータは、AesCngまたはAesCryptoServiceProviderで復号化することができます。

私はRijnDaelManagedクラスで暗号化メソッドを作成し、この行にあなたのコードの例を適応し完全なものにするには:

using (RijndaelManaged symmetricKey = new RijndaelManaged()) 

using (var symmetricKey = new AesCryptoServiceProvider()) // or new AesCng() 

を読み、実際に文字列を復号化することができましたし。

+0

情報ありがとうございます。しかし、どうすればセキュリティポリシーを無効にできますか? – Disasterkid

+1

私はセキュリティポリシー*を無効にしてリンクしていますが、こちらも同様です:https://i.stack.imgur.com/bSsH0.png – rene

+0

ありがとうございます。サーバーからポリシーを削除して、もう一度試してみましょう。これは社内のソリューションであり、この変更を適用すると多くの更新が必要になるため、プログラムの変更は現在実行可能であるとは思いません。顧客がポリシーを削除するとすぐに、私はここに戻ってきます。 – Disasterkid

関連する問題