2015-01-02 8 views
5

Windows 용 RSA 키 쌍을 관리하는 도구를 만들고 있는데이 기능은 기본 제공 기능이 없으므로 RSA 암호화 기능을 광범위하게 사용합니다. 그물.RSACryptoServiceProvider를 사용하여 XML에서 RSA 공개 키를 가져 오면 PublicOnly 속성이 false로 설정됩니다.

이 도구는 기존 RSA 키 쌍을 나열하고, 새 키를 만들고, 키를 삭제하고, 키를 내보내고, 이전에 만든 XML 내보내기 (ASPNet_RegIIS.exe를 사용하여 내 보낸)에서 키를 가져 오는 것과 같은 다양한 기능을 제공합니다.

필자는 암호화 작업을 위해서만 공개 키를 가져 오는 것과 별개로 모든 기능을 제공합니다. 키 쌍이 원래 서버에서 작성되면 aspnet_regiis.exe을 사용하여 공용 및 공개/개인용 내보내기가 xml에 작성됩니다.

절대적으로 필요한 경우가 아니면 개인 키가 배포되지 않도록 다른 컴퓨터에서 설정 파일을 암호화하는 옵션을 제공하고자합니다.

내가 전회 보낸 XML에서 공개 키를 가져올 때마다이 RSACryptoServiceProviderPublicOnly 속성을 블록은 키 쌍은 공개 키와 개인 키를 가지고 있음을 나타내는 false로 설정됩니다. xml에 개인 키 정보가 포함되어 있지 않아 문제가 xml 파일 내에 없다는 것을 확인했습니다.

CspParameters 개체를 사용하고 플래그를 CspProviderFlags.UseMachineKeyStore으로 지정할 때 문제가 발생하는 것으로 보입니다. Csp 매개 변수를 지정하지 않고 RSACryptoServiceProvider을 구성한 다음 xml에서 키를 가져 오면 PublicOnly 속성이 false로 올바르게 설정됩니다. 그러나 키의 이름을 다른 방법이 없기 때문에 그것은 내가 RSACryptoServiceProvider을 구성 할 때 CspParameters 개체를 사용하도록 강요하고 암호화 작업을 위해 나중에 사용할 수 있도록 내가 키 컨테이너를 이름을 지정해야하기 때문에

String xmlText = File.ReadAllText(filePath); 
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); 
csp.FromXmlString(xmlText); 
//csp.PublicOnly equals true; 

컨테이너.

String xmlText = File.ReadAllText(filePath); 
CspParameters cspParams = new CspParameters(); 
cspParams.Flags = CspProviderFlags.UseMachineKeyStore; 
cspParams.KeyContainerName = keyContainerName; 
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(cspParams); 
csp.PersistKeyInCsp = true; 
csp.FromXmlString(xmlText); 
//csp.PublicOnly equals false; 

이 코드의 다양한 버전을 사용해 보았지만 문제가 남아 있습니다. RSA Encryption public key not returned from container?과 같은 유사한 질문이 있지만이 문제는 다르며 만족스러운 대답은 없다고 생각합니다.

그렇다면 XML에서 RSA 공개 키를 가져 와서 컨테이너에 공개 키 쌍만 존재하도록 보장하면서 키 컨테이너에 이름을 부여하려면 어떻게해야합니까? XML에서 전체 키를 가져오고 또한 주요 수출 할 수 있도록 플래그를 설정할 때

편집이 지역 주변

또한 연구는 또한 문제를 보여줍니다. 이 플래그가 선 csp.FromXmlString(xmlText) 던져 유형 "지정된 잘못된 플래그"의 예외 오브젝트 CSP 매개 변수에 지정된

CspProviderFlags.UseArchivableKey; 

;

정말 설명 할 수 없습니다. 키가 생성되어 이전에 XML로 내보내기되었습니다. 키를 이전에 내 보낸 경우 가져 오기가 가능하고 다시 내보낼 수 있어야합니다.

나는 이것에 대해 많은 연구를했지만이 문제 중 하나에 대한 답을 볼 수 없습니다.

이것이 현재 기본값이라고 생각하여 PROV_RSA_FULL에서 cP Provider 유형을 변경하려고 시도했지만 PROV_RSA_FULL 대신이 키를 사용하여 키가 생성되었을 수 있다고 생각했지만 차이점이 없습니다.

답변

0

XML 또는 RSAParameters에서 키 매개 변수를 가져올 때 RSACryptoServiceProvider는 공용 매개 변수가 제공된 경우 현재 키에서 분리합니다. 전용 매개 변수를 가져 오면 키 컨테이너의 키 내용 만 바꿉니다.

http://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsacryptoserviceprovider.cs,b027f6909aa0a6d1

ImportCspBlob는 다른 경로를 걸리지 만 결국 같은 결론에 도달 : 공공 전용 덩어리가 가져 오는 경우는 임시 키를 분리합니다. http://referencesource.microsoft.com/#mscorlib/system/security/cryptography/utils.cs,754f1f4055bba611

기본 Windows 암호화 API는 공개 키 저장을 허용하지 않습니다 (개인 키를 저장할 때를 제외하고). https://msdn.microsoft.com/en-us/library/windows/desktop/bb427412(v=vs.85).aspx에서

압축 천연 가스 문서

가 지속 된 키 쌍을 생성하는 BCryptExportKey를 들어, 입력 키 BLOB는 개인 키를 포함해야합니다 말한다. 공개 키는 유지되지 않습니다.

하나는 BCryptImportKey를 의미하지만 "공개 키는 유지되지 않습니다"는 것으로 가정합니다.

CAPI의 경우 매우 간단하지 않은 항목을 찾을 수 없습니다.

내가 찾을 수있는 가장 좋은는 '키 컨테이너'(https://msdn.microsoft.com/en-us/library/windows/desktop/ms721590(v=vs.85).aspx#_security_key_container_gly)의 CAPI 정의입니다 :

키 컨테이너

모든 키 쌍을 포함하는 키 데이터베이스의 일부 (교환 및 서명 키 쌍)을 생성합니다. 각 컨테이너에는 컨테이너에 대한 핸들을 얻기 위해 CryptAcquireContext 함수를 호출 할 때 사용되는 고유 한 이름이 있습니다.

이 정의는 "공개 키"가 저장소 계층에 의해 거부 될 수 있음을 제안하는 "키 쌍"만 참조합니다. RSACryptoServiceProvider 비헤이비어를 감안할 때 이것은 상당히 가능성이 높습니다.