반응형

이번 포스트에서는 RSA 알고리즘에 대해서 알아보고, openssl 을 이용해서 RSA 키를 생성해보고, 몇몇 프로그래밍 언어에서 RSA 를 이용해서 encrypt / decrypt 하는 방법에 대해서 소개해 보겠습니다.

 

 

RSA 알고리즘

RSA 알고리즘은 비대칭키 알고리즘으로 두 개의 서로 다른 키를 사용해서 암호화와 복호화를 하는 방식입니다. 알고리즘을 개발했던 개발자들(Ron Rivest, Adi Shamir, Leonard Adleman)의 이름 이니셜을 따서 명명하였습니다. 자세한 알고리즘의 원리는 위키를 참고해 주세요.

 

RSA 암호화 - 나무위키 (namu.wiki)

 

RSA 암호화

RSA key cryptosystem 현재 SSL/TLS 에 가장 많이 사용되는 공개키 암호화 알고리즘 이다.

namu.wiki

 

 

OpenSSL로 RSA 키 생성하기

키 파일 생성하는 방법을 요약하면 다음과 같습니다. 

# private key 파일 생성
openssl genrsa -out private-key.pem 4096

# 생성한 private key를 이용해서 public key 파일 생성
openssl rsa -in private-key.pem -pubout -out public-key.pem

# private key를 이용해서 (self-signed) 인증서 발급
openssl req -new -x509 -key private-key.pem -out cert.pem -days 360

# pem 파일을 pfx 파일로 변경
openssl pkcs12 -export -inkey private-key.pem -in cert.pem -out cert.pfx

 

 

위의 내용은 아래 사이트에서 가지고 왔습니다.

https://www.scottbrady91.com/openssl/creating-rsa-keys-using-openssl

 

Creating RSA Keys using OpenSSL

An OpenSSL cheat sheet for creating RSA private keys, public keys, and certificates for use with RSASSA-PKCS1-v1_5 and RSASSA-PSS.

www.scottbrady91.com

 

 

RSA encrypt (with .net 8.0)

이번에는 .net8.0 라이브러리 (System.Security.Cryptography)를 이용해서 데이터를 encrypt 하는 코드 샘플입니다. 참고로 .net5.0 이후는 같은 코드로 동작하지만 .netframework에서는 작동하지 않습니다.

encrypt는 public key를 사용하게 됩니다. 미리 public key를 준비해 둡니다. 저는 위에서 설명한 openssl로 생성한 pem 파일을 열어서 PUB_KEY라는 이름으로 문자열 형태의 리소스를 등록해 두었습니다.

 

using System.Security.Cryptography;

...


        byte[] rsaEncrypt(byte[] encodeData)
        {
            byte[] ret = null;
            // rsa 객체 생성
            using (var rsa = RSA.Create())
            {
            	// resource에서 pem 형식의 public 키를 가지고 옵니다.
                var pubKeyStr = Properties.Resources.ResourceManager.GetString("PUB_KEY");
                // public 키를 import 합니다.
                rsa.ImportFromPem(pubKeyStr);
                // 데이터를 encrypt 합니다.
                ret = rsa.Encrypt(encodeData, RSAEncryptionPadding.OaepSHA256);
            }
            return ret;
        }

 

 

RSA decrypt (with .net 8.0)

이번에는 .net8.0 라이브러리 (System.Security.Cryptography)를 이용해서 데이터를 decrypt 하는 코드 샘플입니다. 참고로 .net5.0 이후는 같은 코드로 동작하지만 .netframework에서는 작동하지 않습니다.

decrypt는 private key를 사용하게 됩니다. 미리 private key를 준비해 둡니다. 저는 위에서 설명한 openssl로 생성한 pem 파일을 열어서 PRI_KEY라는 이름으로 문자열 형태의 리소스를 등록해 두었습니다.

 

using System.Security.Cryptography;

...


        byte[] rsaDecrypt(byte[] encodedData)
        {
            byte[] ret = null;
            // rsa 객체 생성
            using (var rsa = RSA.Create())
            {
            	// resource에 저장된 private 키를 가지고 옵니다.
                var priKeyStr = Properties.Resources.ResourceManager.GetString("PRI_KEY");
                
                //  private 키를 import 합니다.
                rsa.ImportFromPem(priKeyStr);
                
                // decryhpt 합니다.
                ret = rsa.Decrypt(encodedData, RSAEncryptionPadding.OaepSHA256);
            }
            return ret;
        }

 

 

RSA 코드 테스트

아래 코드를 이용하면, encrypt / decrypt 결과를 테스트 할 수 있습니다.

 

        public void test()
        {
            string str = "Hello";

            // encrypt string data - string을 byte[] 형태로 변경해서 전달
            byte[] buf = rsaEncrypt(Encoding.UTF8.GetBytes(str));
            // buf를 base64 string 형태로 출력
            Debug.WriteLine(Convert.ToBase64String(buf));

            // decrypt encrypted data
            buf = rsaDecrypt(buf);
            // buf를 string 형태로 출력
            Debug.WriteLine(Encoding.UTF8.GetString(buf));
        }
반응형
반응형

지난 포스트에서는 https 를 적용하기 위해서, 실제 인증기관을 통해서 서명된 인증서를 사용하는 방법에 대해서 적어 보았습니다.

 

하지만, 테스트 용도의 서버나 개발 서버 등 외부로 노출되지 않는 서버까지 유료 인증서를 사용할 필요는 없습니다. 이런 경우 self signed certificate 을 이용해서 적용할 수 있습니다.

 

1. 이전과 마찬가지로 private key 파일과 인증 요청서 파일을 생성하는 것입니다. 이번에는 nodes 옵션을 추가해서 암호 설정이 되지 않은 key 파일을 생성하겠습니다.

openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr

 

2. 인증서를 생성합니다.

openssl x509 -signkey domain.key -in CSR.csr -req -days 10000 -out domain.crt

days 옵션에 숫자로 날짜를 입력할 수 있습니다. 해당 기간 동안 인증이 유효한 것인데, 테스트 용은 길게 적어 줘도 상관 없습니다.

 

3. key 파일과 인증서 (crt) 파일을 적당한 경로로 옮겨 둡니다.

 

4. nginx 설정에 다음 내역을 추가합니다.

server {
    listen 443 ssl;
    server_name your_domain.com;
    
    ssl_certificate '/etc/ssl/certs/domain.crt';
    ssl_certificate_key '/etc/ssl/certs/domain.key';
    
    ...
}

 

5. nginx 서버를 재시작 합니다.

 

 

위의 내용은 아래 사이트에서 참조하여 작성하였습니다.

https://www.baeldung.com/openssl-self-signed-cert#:~:text=A%20self%2Dsigned%20certificate%20is,the%20certificate%20isn't%20trusted

 

Creating a Self-Signed Certificate With OpenSSL | Baeldung

A quick and practical guide to creating self-signed certificates with OpenSSL.

www.baeldung.com

 

반응형

'프로그래밍' 카테고리의 다른 글

[docker] min.io 사용하기 - 활용편  (0) 2022.07.20
[docker] min.io 사용하기 - 기초편  (0) 2022.07.20
NGINX SSL 설정 (https) - part 1  (0) 2022.06.11

+ Recent posts