Microsoft MVP성태의 닷넷 이야기
.NET Framework: 292. RSACryptoServiceProvider의 공개키와 개인키 구분 [링크 복사], [링크+제목 복사],
조회: 39141
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

(시리즈 글이 14개 있습니다.)
.NET Framework: 292. RSACryptoServiceProvider의 공개키와 개인키 구분
; https://www.sysnet.pe.kr/2/0/1218

.NET Framework: 327. RSAParameters와 System.Numerics.BigInteger 이야기
; https://www.sysnet.pe.kr/2/0/1295

.NET Framework: 329. C# - Rabin-Miller 소수 생성방법을 이용하여 RSACryptoServiceProvider의 개인키를 직접 채워보자
; https://www.sysnet.pe.kr/2/0/1300

.NET Framework: 356. (공개키를 담은) 자바의 key 파일을 닷넷의 RSACryptoServiceProvider에서 사용하는 방법
; https://www.sysnet.pe.kr/2/0/1401

.NET Framework: 383. RSAParameters의 ToXmlString과 ExportParameters의 결과 비교
; https://www.sysnet.pe.kr/2/0/1491

.NET Framework: 565. C# - Rabin-Miller 소수 생성 방법을 이용하여 RSACryptoServiceProvider의 개인키를 직접 채워보자 - 두 번째 이야기
; https://www.sysnet.pe.kr/2/0/10925

.NET Framework: 566. openssl의 PKCS#1 PEM 개인키 파일을 .NET RSACryptoServiceProvider에서 사용하는 방법
; https://www.sysnet.pe.kr/2/0/10926

.NET Framework: 638. RSAParameters와 RSA
; https://www.sysnet.pe.kr/2/0/11140

.NET Framework: 1037. openssl의 PEM 개인키 파일을 .NET RSACryptoServiceProvider에서 사용하는 방법 (2)
; https://www.sysnet.pe.kr/2/0/12598

.NET Framework: 2093. C# - PKCS#8 PEM 파일을 이용한 RSA 개인키/공개키 설정 방법
; https://www.sysnet.pe.kr/2/0/13245

닷넷: 2297. C# - ssh-keygen으로 생성한 Public Key 파일 해석과 fingerprint 값(md5, sha256) 생성
; https://www.sysnet.pe.kr/2/0/13739

닷넷: 2297. C# - ssh-keygen으로 생성한 ecdsa 유형의 Public Key 파일 해석
; https://www.sysnet.pe.kr/2/0/13742

닷넷: 2300. C# - OpenSSH의 공개키 파일에 대한 "BEGIN OPENSSH PUBLIC KEY" / "END OPENSSH PUBLIC KEY" PEM 포맷
; https://www.sysnet.pe.kr/2/0/13747

닷넷: 2302. C# - ssh-keygen으로 생성한 Private Key와 Public Key 연동
; https://www.sysnet.pe.kr/2/0/13749




RSACryptoServiceProvider의 공개키와 개인키 구분

데브피아 질문이 있군요.

RSA 암호화에 대해 질문드립니다.  
; http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=142654&ref=142654&page=1

질문의 요지는, RSAParameters에서 공개키와 개인키를 구분해서 저장하는 방법이라고 볼 수 있습니다.

우선, RSA에서 암호화를 하기 위해서는 '공개키'를 사용한다는 것과 복호화를 하기 위해서는 '개인키'를 사용한다는 개념은 알고 계셔야 겠지요.

이를 바탕으로, 여러분이 RSA 암호화를 구현하고 싶다면 우선 (공개키를 포함한) 개인키를 생성해야 합니다. 이는 다음과 같이 간단하게 할 수 있습니다.

RSAParameters privateKey = RSA.Create().ExportParameters(true);

만약, ExportParameters에 false를 주면 공개키만을 반환해 주므로 의미가 없습니다. 자, 그럼 이렇게 반환된 개인키로부터 공개키는 어떻게 가져올 수 있을까요? 간단합니다. ^^ 다음과 같이 개인키로부터 Modulus와 Exponent 값만 취해서 별도의 RSAParameters 타입으로 구성해 주면 됩니다.

RSAParameters publicKey = new RSAParameters();
publicKey.Modulus = privateKey.Modulus;
publicKey.Exponent = privateKey.Exponent;

공개키는 말 그대로 공개해서 사용할 수 있도록 해주면 되는데 다음과 같이 XML 문자열로 변환해서 배포할 수 있습니다.

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(publicKey);
string publicKeyText = rsa.ToXmlString(false);

publicKeyText 값:

<RSAKeyValue><Modulus>3GujGHHw7hecMfuyU9W1mkAA1FqOolhSaKl8jF4wuJW26rwr7P/QjljwD
+Tyav2DVDJ0tW93VgzZV3rjMq2FDpjyEUOOMfiGptSeYtQica+6rLb5g+n0ZYh8lI7VGwiy4/OTAHc/
OBBmb8VNvG6yKwxeRcX2v5mrkjHjQcXMoc8=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>

개인키도 마찬가지 방식으로 XML 문자열로 저장할 수 있습니다.

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(privateKey);
string privateKeyText = rsa.ToXmlString(true);

privateKeyText 값:

<RSAKeyValue><Modulus>3GujGHHw7hecMfuyU9W1mkAA1FqOolhSaKl8jF4wuJW26rwr7P/QjljwD
+Tyav2DVDJ0tW93VgzZV3rjMq2FDpjyEUOOMfiGptSeYtQica+6rLb5g+n0ZYh8lI7VGwiy4/OTAHc/
OBBmb8VNvG6yKwxeRcX2v5mrkjHjQcXMoc8=</Modulus><Exponent>AQAB</Exponent><P>+BTv/
DqzhEecQqJ7PT4bWQWDzCpr6/itZtyaN1cqi9V+c5wmDKc/szB2mGTVeUJ5NuPIixtwcL4yoeQr26aV1w==</
P><Q>43SuMl9XyVjXw/Vvvgq5s3LR0oVzQpw5YcaWHgHWCwIF6+kTdtwsgaL4e3QjCq9dxPPJm0DkwAIndRGwvS9kyQ==</
Q><DP>Jyy/PNhUMsZQIaGgzmn5TZR2XI4yXp/1WfHqFGUaXdyHzF/TDlp2z6gOgkAiCbT6iTVtHLJnjhYqzq/GUTg8Hw==</
DP><DQ>1bjxZYuI5TyBoTOhx6Q0UZV16qZSYyiAEouSyqdXBAjmn4DmNS009Kq5aOb7djLJnSKlMSiMyI49nRb+RwWdYQ==</
DQ><InverseQ>HIWjouZtBwUJqg6VCxrXQBvpd+3OdLqx8ScGR1tpGVxT9MijkVlmXbkEe7cYFZlw7iToEBfQrcmy6AWEpXl1NA==</
InverseQ><D>vAZxpSulK2Umj5i2oT8fYAqS6pKpM6GGAtP5c7/xbbQAyjJkghIidRs3BUf25v
+E5PD5j8AbG2Nwj2g7oQJWCe0UyX6pWsbUAaiv6dIop664q5UDVSulJXlAV3eV/vT6/ohMTFej7h1LQ/8crPd2wv8p+NYAIh+H719A/NqjOTE=</
D></RSAKeyValue>

물론, 개인키를 Import 한 다음에 ToXmlString에서 false 인자를 주면 공개키만 export 하게 됩니다.

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(privateKey);
string publicKeyText = rsa.ToXmlString(false);

자... 이렇게 해서 공개키 문자열을 보관하고 있는 측에서는 XML 문자열로부터 공개키를 다시 Import 할 수 있고 암호화를 해주면 됩니다.

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publicKeyText);
rsa.Encrypt(...DataToEncrypt..., false);

개인키에 대한 XML을 보관하고 있는 측에서도 역시 개인키를 동일하게 Import하고 복호화 해 줄 수 있습니다.

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privateKeyText);
rsa.Decrypt(...DataToDecrypt..., false);

설명이 끝난 것 같군요.

첨부된 파일은 위의 코드를 포함한 예제 프로젝트입니다.

참고로, 이 내용은 모두 다음의 MSDN 문서에 있는 것입니다. ^^

RSACryptoServiceProvider 클래스
; https://docs.microsoft.com/ko-kr/dotnet/api/system.security.cryptography.rsacryptoserviceprovider




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 8/12/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2013-08-06 10시09분
Javascript와 .NET 간의 RSA 암호화 데이터 교환 방법을 구현한 코드 예제가 있군요. ^^

로그인 RSA 암호화 asp.net
; http://blog.naver.com/103hana/10166459171

저도 언제 한번 이와 관련해서 글을 쓰려고 했는데 ^^ 그럴 필요가 없어졌군요. 참고로, 위의 글에 나온 js 소스 코드는 다음의 경로에서 구할 수 있습니다.

RSA and ECC in JavaScript
; http://www-cs-students.stanford.edu/~tjw/jsbn/

URL 경로로 판단해 보건데... 아무래도 오래 지속될 것 같진 않으므로 위의 페이지 자체를 mhtml로 변환해서 소스 코드와 함께 이 글에 첨부해 두었으니 참고하세요. ^^
정성태

... 121  122  123  124  125  126  [127]  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
2879정성태3/3/201526648개발 환경 구성: 259. Visual Studio 없이 Visual C++ 컴파일하는 방법
2878정성태2/28/201527462.NET Framework: 503. == 연산자보다는 Equals 메서드의 호출이 더 권장됩니다. [3]파일 다운로드1
2877정성태2/28/201521723.NET Framework: 502. 연산자 재정의(operator overloading)와 메서드 재정의(method overriding)의 다른 점 - 가상 함수 호출 여부 [3]파일 다운로드1
2876정성태2/27/201524208VS.NET IDE: 98. IntegraStudio - Visual Studio에서 Java 프로그램 개발
2875정성태2/26/201522807디버깅 기술: 72. Visual Studio 2013에서의 sos.dll 사용 제한
2874정성태2/26/201519544디버깅 기술: 71. windbg + 닷넷 디버깅 (2) - null 체크 패턴
2873정성태2/25/201537007.NET Framework: 501. FtpWebRequest 타입을 이용해 FTP 파일 업로드 [4]파일 다운로드1
2872정성태2/25/201521156디버깅 기술: 70. windbg + 닷넷 디버깅 (1) - 배열 인덱스 사용 패턴
2871정성태2/24/201525167개발 환경 구성: 258. 윈도우 8.1에서 방화벽과 함께 FTP 서버 여는 (하지만, 권장하지 않는) 방법 [1]
2870정성태2/24/201526274개발 환경 구성: 257. 윈도우 8.1에서 방화벽과 함께 FTP 서버 여는 방법
2869정성태2/23/201520244.NET Framework: 500. struct로 정의한 값 형식(Value Type)의 경우 Equals 재정의를 권장합니다.파일 다운로드1
2868정성태2/23/201524771VS.NET IDE: 97. Visual C++ 프로젝트 디버깅 시에 Step-Into(F11) 동작이 원치 않는 함수로 진입하는 것을 막는 방법 [2]
2867정성태2/23/201518415오류 유형: 273. File History - Failed to initiate user data backup (error 80070005)
2866정성태2/23/201520279오류 유형: 272. WAT080 : Failed to locate the Windows Azure SDK. Please make sure the Windows Azure SDK v2.1 is installed.
1868정성태2/20/201517573오류 유형: 271. The type '...' cannot be used as type parameter 'TContext' in the generic type or method 'System.ServiceModel.DomainServices.EntityFramework.LinqToEntitiesDomainService&lt;T&gt;
1866정성태2/20/201518455오류 유형: 270. "aspnet_regiis -i" 실행 시 0x00000006 오류 해결 방법
1865정성태2/20/201519814.NET Framework: 499. 특정 닷넷 프레임워크 버전 이후부터 제공되는 타입을 사용해야 한다면?
1864정성태2/18/201524806.NET Framework: 498. C#으로 간단하게 만들어 본 ASCII Art 프로그램 [2]파일 다운로드1
1862정성태2/18/201528634.NET Framework: 497. .NET Garbage Collection에 대한 정리 [6]
1861정성태2/18/201523991.NET Framework: 496. 마우스 커서가 놓인 지점의 문자열 얻는 방법 [1]파일 다운로드1
1860정성태2/18/201523826.NET Framework: 495. CorElementType의 요소 값 설명파일 다운로드1
1859정성태2/17/201524199Windows: 106. 컴퓨터를 재부팅하면 절전(Power Saver) 전원 모드로 돌아가는 경우
1858정성태2/16/201534251Windows: 105. 자동으로 로그아웃/잠김 화면 상태로 전환된다면? [2]
1857정성태2/16/201522253.NET Framework: 494. 값(struct) 형식의 제네릭(Generic) 타입이 박싱되는 경우의 메타데이터 토큰 값파일 다운로드1
1856정성태2/15/201521243.NET Framework: 493. TypeRef 메타테이블에 등록되는 타입의 조건파일 다운로드1
1855정성태2/10/201520784개발 환경 구성: 256. WebDAV Redirector - Sysinternals 폴더 연결 시 "The network path was not found" 오류 해결 방법
... 121  122  123  124  125  126  [127]  128  129  130  131  132  133  134  135  ...