2017-02-11 10 views
1

Crypto ++에서 생성 된 DER로 인코딩 된 RSA 키 쌍이 있고 암호가 있습니다. Base64Encoded 문자열입니다. 먼저 Base64에서 바이트 배열로 데이터를 디코딩하지만, RSACryptoServiceProvider에로드하는 방법을 잘 모르겠습니다.C#에서 ASN.1/DER로 인코딩 된 RSA 키 쌍을로드하십시오.

static void Main() 
{ 
    string pbkeystr = "mypublickey"; 
    string pvkeystr = "myprivatekey"; 
    string cipherstr = "mycipher"; 

    byte[] pbkey = Convert.FromBase64String(pbkeystr); 
    byte[] pvkey = Convert.FromBase64String(pvkeystr); 
    byte[] cipher = Convert.FromBase64String(cipherstr); 

    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 

    //Set keys here.. 

    //Decrypt the cipher using private key 
    rsa.Decrypt(pvkey, false); 
} 

키를 설정할 기능이 없습니다. 내가 찾은 유일한 것은 , q, n, 계수, 지수 등으로 구성된 RSAParameters 클래스를 취하는 ImportParameters 메서드였습니다. 이것들에 액세스 할 수 없습니다.

문자열을 키로로드 할 수있는 방법이 있습니까? RSACryptoServiceProvider에 키를로드하려면 어떻게해야합니까?

+1

Base64로 인코딩 된 문자열의 내용은 무엇입니까? DER/PEM ASN.1 키 또는 다른 것? – yaakov

+0

암호화에서 가져온 DER입니다. ++ – Kyojin

답변

1

문자열을 키로로드 할 수있는 방법이 있습니까? RSACryptoServiceProvider에 키를로드하려면 어떻게해야합니까? 당신이 DEREncodeBERDecode 사용 때문에 공개 키와 개인 키를 가지고있는 것처럼 다른 암호화 ++ 질문 How to load Base64 RSA keys in Crypto++에서

, 그것은 보인다. 즉, 공개 키 정보 및 개인 키 정보가 아닌 RSA 매개 변수가 있습니다. 키에 OID 식별자와 버전 번호가 없습니다. 그런 것은 괜찮습니다.

코드 프로젝트에서 Cryptographic Interoperability: Keys에서 Base64 디코딩 후에 ASN.1/DER을 구문 분석하는 C# 클래스가 필요합니다. CodeProject 아티클은 AsnKeyParser이라는 C# 클래스를 제공하여 ASN.1/DER을 읽고 RSAParameters을 반환하여 CSP에로드합니다.

AsnKeyParser 클래스의 코드는 약 800 줄이며 모든 것을 수행하기 위해 5 개의 다른 지원 파일이 있으므로 여기에 배치하는 것이 적절하지 않습니다. 직접 다운로드해야합니다. 관심 파일은 CSInteropKeys.zip입니다.

AsnKeyParser 클래스를 배선하면 RSA 공개 키에 대해 다음과 같이 간단합니다. 개인 키는 비슷하며 코드는 CodeProject 사이트에서 제공됩니다.

// Your ASN.1/DER parser class 
AsnKeyParser keyParser = new AsnKeyParser("rsa-public.der"); 
RSAParameters publicKey = keyParser.ParseRSAPublicKey(); 

// .Net class 
CspParameters csp = new CspParameters; 
csp.KeyContainerName = "RSA Test (OK to Delete)";  
csp.ProviderType = PROV_RSA_FULL; // 1 
csp.KeyNumber = AT_KEYEXCHANGE;  // 1 

// .Net class 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); 
rsa.PersistKeyInCsp = false; 
rsa.ImportParameters(publicKey); 

다른 사이트의 파일에 연결하는 것은 싫은 일이지만 다른 방법으로 정보를 제공하는 방법을 모르겠습니다. 대답에 너무 많은 소스 코드가 포함되어 있습니다.


완성도를 들어, 닷넷 하지 메이크업 상호 운용성 쉽지 않습니다. 그들은 ASN.1/DER 또는 PEM을 승인하지 않습니다. 오히려 .Net은 XML의 일부 XML 표현을 허용합니다. 나는 당신이 RFC 3275, XML-Signature Syntax and Processing에서 찾을 수 있다고 믿습니다. Microsoft does not state that for you. 코드 프로젝트 기사를 작성할 때 나는 그것을 함께 연결했습니다.

ASN.1/DER 및 PEM 외에도 XML을 역행시키기 위해 Crypto ++에 클래스를 추가해야 할 수도 있습니다.

+0

그래, 내가 한 것은 Base64 문자열을 읽고 바이트 데이터로 변환 한 것입니다 (Base64에서 원래 DEREncoded 바이트로 변환 됨). "rsa-private.der"라는 파일에 쓴 다음 예제에서와 같이 AsnKeyParser에 전달했지만 예외가 발생합니다. CryptographicException : 매개 변수가 유효하지 않습니다. http://pastebin.com/hLwErEfp 내가 뭘 잘못 했니? – Kyojin

+0

@Kyojin - PasteBin의 노트에서 예외가 'var data = rsp.Decrypt (cipherArr, false)'에서 발생하는 것처럼 보입니다. 그 맞습니까? 그렇다면 개인 키가 예상대로로드되었음을 의미합니다. 나는이 문제가'csp.KeyNumber = AT_KEYEXCHANGE'이거나 당신의 RSA 패딩이라고 추측하고있다. 어쩌면 당신은 ['Decrypt Method (Byte [], RSAEncryptionPadding)'] (https://msdn.microsoft.com/en-us/library/mt132683 (v = vs.110) .aspx)를 시도 할 수 있습니다. 패딩보다 더 많은 것이 있다면, 아마도 새로운 질문을해야 할 것입니다. 스택 오버플로는 질문과 답변의 범위를 좁게 유지하는 것을 좋아합니다. – jww

+0

예, rsa.ToXmlString()을 수행 한 결과 모든 내용이 정확하고 파일의 base64 문자열과 동일합니다. 그렇다면 암호가 해독되지 않은 이유는 무엇입니까? 이제는 그럴 것 같네요. – Kyojin