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

... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12590정성태4/9/202116905.NET Framework: 1033. C# - .NET 4.0 이하에서 Console.IsInputRedirected 구현 [1]
12589정성태4/8/202118132.NET Framework: 1032. C# - Environment.OSVersion의 문제점 및 윈도우 운영체제의 버전을 구하는 다양한 방법 [1]
12588정성태4/7/202119869개발 환경 구성: 565. PowerShell - New-SelfSignedCertificate를 사용해 CA 인증서 생성 및 인증서 서명 방법
12587정성태4/6/202121140개발 환경 구성: 564. Windows 10 - ClickOnce 배포처럼 사용할 수 있는 MSIX 설치 파일 [1]
12586정성태4/5/202118011오류 유형: 710. Windows - Restart-Computer / shutdown 명령어 수행 시 Access is denied(E_ACCESSDENIED)
12585정성태4/5/202116989개발 환경 구성: 563. 기본 생성된 kubeconfig 파일의 내용을 새롭게 생성한 인증서로 구성하는 방법
12584정성태4/1/202118170개발 환경 구성: 562. kubeconfig 파일 없이 kubectl 옵션만으로 실행하는 방법
12583정성태3/29/202119052개발 환경 구성: 561. kubectl 수행 시 다른 k8s 클러스터로 접속하는 방법
12582정성태3/29/202118457오류 유형: 709. Visual C++ - 컴파일 에러 error C2059: syntax error: '__stdcall'
12581정성태3/28/202118412.NET Framework: 1031. WinForm/WPF에서 Console 창을 띄워 출력하는 방법 (2) - Output 디버깅 출력을 AllocConsole로 우회 [2]
12580정성태3/28/202116275오류 유형: 708. SQL Server Management Studio - Execution Timeout Expired.
12579정성태3/28/202116878오류 유형: 707. 중첩 가상화(Nested Virtualization) - The virtual machine could not be started because this platform does not support nested virtualization.
12578정성태3/27/202117324개발 환경 구성: 560. Docker Desktop for Windows 기반의 Kubernetes 구성 (2) - WSL 2 인스턴스에 kind가 구성한 k8s 서비스 위치
12577정성태3/26/202118952개발 환경 구성: 559. Docker Desktop for Windows 기반의 Kubernetes 구성 - WSL 2 인스턴스에 kind 도구로 k8s 클러스터 구성
12576정성태3/25/202116996개발 환경 구성: 558. Docker Desktop for Windows에서 DockerDesktopVM 기반의 Kubernetes 구성 (2) - k8s 서비스 위치
12575정성태3/24/202115568개발 환경 구성: 557. Docker Desktop for Windows에서 DockerDesktopVM 기반의 Kubernetes 구성 [1]
12574정성태3/23/202121104.NET Framework: 1030. C# Socket의 Close/Shutdown 동작 (동기 모드)
12573정성태3/22/202118522개발 환경 구성: 556. WSL 인스턴스 초기 설정 명령어 [1]
12572정성태3/22/202117825.NET Framework: 1029. C# - GC 호출로 인한 메모리 압축(Compaction)을 확인하는 방법파일 다운로드1
12571정성태3/21/202115834오류 유형: 706. WSL 2 기반으로 "Enable Kubernetes" 활성화 시 초기화 실패 [1]
12570정성태3/19/202121144개발 환경 구성: 555. openssl - CA로부터 인증받은 새로운 인증서를 생성하는 방법
12569정성태3/18/202121510개발 환경 구성: 554. WSL 인스턴스 export/import 방법 및 단축 아이콘 설정 방법
12568정성태3/18/202114836오류 유형: 705. C# 빌드 - Couldn't process file ... due to its being in the Internet or Restricted zone or having the mark of the web on the file.
12567정성태3/17/202116879개발 환경 구성: 553. Docker Desktop for Windows를 위한 k8s 대시보드 활성화 [1]
12566정성태3/17/202116705개발 환경 구성: 552. Kubernetes - kube-apiserver와 REST API 통신하는 방법 (Docker Desktop for Windows 환경)
12565정성태3/17/202113495오류 유형: 704. curl.exe 실행 시 dll not found 오류
... 46  47  48  49  50  51  52  53  [54]  55  56  57  58  59  60  ...