Microsoft MVP성태의 닷넷 이야기
.NET Framework: 292. RSACryptoServiceProvider의 공개키와 개인키 구분 [링크 복사], [링크+제목 복사],
조회: 39102
글쓴 사람
정성태 (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로 변환해서 소스 코드와 함께 이 글에 첨부해 두었으니 참고하세요. ^^
정성태

... 106  107  108  [109]  110  111  112  113  114  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11199정성태5/16/201721139.NET Framework: 657. CultureInfo.GetCultures가 반환하는 값
11198정성태5/10/201722666.NET Framework: 656. Windows Forms의 오류(Exception) 처리 방법에 대한 차이점 설명
11197정성태5/8/201719527개발 환경 구성: 315. VHD 파일의 최소 크기파일 다운로드1
11196정성태5/4/201720713오류 유형: 384. Msvm_ImageManagementService WMI 객체를 사용할 때 오류 상황 정리 [1]
11195정성태5/3/201721030.NET Framework: 655. .NET Framework 4.7 릴리스
11194정성태5/3/201723262오류 유형: 383. net use 명령어로 네트워크 드라이브 연결 시 "System error 67 has occurred." 오류 발생
11193정성태5/3/201721560Windows: 141. 설치된 Windows로부터 설치 이미지를 만드는 방법
11192정성태5/2/201722108Windows: 140. unattended.xml/autounattend.xml 파일을 마련하는 방법
11191정성태5/2/201722816Windows: 139. Dell Venue 8 Pro 태블릿에 USB를 이용한 윈도우 운영체제 설치 방법
11190정성태5/2/201728152Windows: 138. Windows 운영체제의 ISO 설치 파일에 미리 Device driver를 준비하는 방법
11189정성태5/2/201720189Windows: 137. Windows 7 USB/DVD DOWNLOAD TOOL로 98%에서 실패하는 경우
11188정성태4/27/201722678VC++: 118. Win32 HANDLE 자료형의 이모저모 [1]
11187정성태4/26/201723221개발 환경 구성: 314. C# - PowerPoint 확장 Add-in 만드는 방법 [1]파일 다운로드1
11186정성태4/24/201721011VS.NET IDE: 117. Visual Studio 확장(VSIX)을 이용해 사용자 매크로를 추가하는 방법 [1]파일 다운로드1
11185정성태4/22/201718947VS.NET IDE: 116. Visual Studio 확장(VSIX)을 이용해 사용자 메뉴 추가하는 방법 (2) - 동적 메뉴 구성파일 다운로드1
11184정성태4/21/201720506VS.NET IDE: 115. Visual Studio 확장(VSIX)을 이용해 사용자 메뉴 추가하는 방법파일 다운로드1
11183정성태4/19/201719334.NET Framework: 654. UWP 앱에서 FolderPicker 사용 시 유의 사항파일 다운로드1
11182정성태4/19/201723384개발 환경 구성: 313. Nuget Facebook 라이브러리를 이용해 ASP.NET 웹 폼과 로그인 연동하는 방법
11181정성태4/18/201720312개발 환경 구성: 312. Azure Web Role의 AppPool 실행 권한을 Local System으로 바꾸는 방법
11180정성태4/16/201723357Java: 18. Java의 Memory Mapped File 자원 반환이 안 되는 문제
11179정성태4/13/201716499기타: 64. SVG Converter 스토어 앱 개인정보 보호 정책 안내
11178정성태4/10/201718616개발 환경 구성: 311. COM+ 관리자의 DCOM 구성에 나오는 기준
11177정성태4/7/201719142.NET Framework: 653. C# 7 새로운 문법(1) - 더욱 편리해진 Out 변수 사용파일 다운로드1
11176정성태4/5/201716121VC++: 117. Visual Studio - ATL COM 개체를 단위 테스트 하는 방법
11175정성태4/5/201725866.NET Framework: 652. C# 개발자를 위한 C++ COM 객체의 기본 구현 방식 설명파일 다운로드1
11174정성태4/3/201719375VC++: 116. Visual Studio 단위 테스트 - Failed to set up the execution context to run the test
... 106  107  108  [109]  110  111  112  113  114  115  116  117  118  119  120  ...