2017-09-19 2 views
1

Winodws 7, 8 및 10에서 정상적으로 작동하는 Windows 응용 프로그램 (x64)이 있습니다. 오늘은 Windows 2012 서버에서 프로그램을 실행하지 못했습니다. 이벤트 로그를 살펴보면 System.Security.Cryptography.RijndaelManaged..ctor()에서 발생한 오류가 발견되었습니다 (불행히도 로그를 통해 전체 경로가 제공되지는 않았습니다).Windows Server 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 프레임 워크 버전 : 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() () (AT System.TypeInitializationException)는

새로운 서버는 .NET 프레임 워크의 동일한 버전이있다.

+0

블록 크기를 변경하지 않으므로 새로운 RijndaelManaged()를 Aes.Create()로 바꿔야합니다. 동일한 출력을 생성하지만 FIPS 예외는 없습니다. – bartonjs

답변

4

RijndaelManaged 클레임은 FIPS와 호환되지 않으며 서버에 보안 정책이있는 것 같습니다 시스템 암호화 : 암호화, 해시 및 서명에 FIPS 호환 알고리즘을 사용합니다.. 마이크로 소프트 ASP.NET과 같은

마이크로 소프트 .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"로 끝납니다. 이러한 끝나는 이름을 가진 클래스와 같은 다른 암호화 알고리즘 클래스의 인스턴스를 만들 수있는 시도 "관리는"InvalidOperationException이 예외가 이렇게합니다 (secpol.msc를 도구에서) 중 하나 disable the security policy

발생 또는 FIPS를 사용하게 준수 구현. 불행히도 Rijndael은 그러한 구현이 없으므로또는 AesCryptoServiceProvider이 귀하의 요구 사항과 일치하는지 확인하고 싶을 수 있습니다. AES는 Rijndael로 시작한 공식적인 구현이기 때문입니다. 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

관련 문제