OpenSSL을 이용한 RSA 암호화/복호화 구현
개요
RSA 암호화 알고리즘은 현대 암호학에서 가장 널리 사용되는 비대칭 암호화 방식 중 하나이다. 본 글에서는 OpenSSL 라이브러리를 활용하여 RSA 암호화/복호화를 C 언어로 구현하는 방법을 상세히 설명한다. OpenSSL 소스코드 빌드부터 XCode 설정, RSA 키를 활용한 암호화/복호화까지 전체 과정을 다룬다.
설명
RSA 암호화는 공개키(Public Key)와 개인키(Private Key)를 사용하는 비대칭 암호화 방식이다. 공개키로 암호화된 데이터는 개인키로만 복호화할 수 있으며, 그 반대도 가능하다. 이러한 특성으로 인해 RSA는 안전한 통신, 전자서명, 인증 등 다양한 보안 분야에서 활용된다.
OpenSSL은 SSL/TLS 프로토콜과 다양한 암호화 알고리즘을 제공하는 오픈소스 라이브러리로, RSA를 포함한 여러 암호화 기능을 제공한다. C 프로그램에서 OpenSSL API를 통해 RSA 암호화/복호화를 쉽게 구현할 수 있다.
특징
- 비대칭 암호화 방식: 공개키와 개인키를 사용하는 방식으로, 키 교환 문제를 해결한다.
- 높은 보안성: 큰 소수의 곱을 인수분해하는 수학적 난제를 기반으로 한 암호화 방식이다.
- 다양한 응용: 보안 통신, 전자서명, 인증 등 여러 분야에서 활용된다.
- OpenSSL 지원: OpenSSL 라이브러리를 통해 쉽게 구현할 수 있다.
- 표준화된 API: OpenSSL에서 제공하는 표준화된 API를 통해 일관된 방식으로 구현이 가능하다.
예제
1. OpenSSL 소스코드 빌드
먼저 OpenSSL 소스코드를 다운로드하고 빌드한다:
# 소스코드 다운로드
wget https://www.openssl.org/source/openssl-1.1.1u.tar.gz
tar -xzf openssl-1.1.1u.tar.gz
cd openssl-1.1.1u
# 정적 라이브러리로 빌드 설정
./config no-shared
# 테스트 및 빌드
make test
make
# 라이브러리 확인
ls -la libssl.a libcrypto.a
2. XCode 설정
XCode에서 프로젝트를 생성하고 OpenSSL을 사용하기 위한 설정을 진행한다:
- C 콘솔 프로젝트 생성
- Build Settings 설정:
- Header Search Path: $(PROJECT_DIR) (재귀 옵션 선택)
- Library Search Path: $(PROJECT_DIR) (재귀 옵션 선택)
- 빌드된 OpenSSL 소스코드를 프로젝트 디렉토리로 복사
- libssl.a, libcrypto.a 라이브러리 파일을 프로젝트에 추가
- OpenSSL의 include 폴더를 프로젝트 디렉토리에 복사
3. RSA 암호화/복호화 구현
이제 OpenSSL API를 사용하여 RSA 암호화/복호화를 구현할 수 있다:
코드 설명:
- 키 파일 읽기: 공개키와 개인키 파일을 열고 읽어들인다.
- 키 유효성 검사: 공개키와 개인키가 유효한 쌍인지 확인한다.
- 암호화된 데이터 읽기: 암호화된 파일을 읽어들인다.
- 복호화 수행: RSA_private_decrypt() 함수를 사용하여 개인키로 데이터를 복호화한다.
- 결과 출력 및 저장: 복호화된 데이터를 출력하고 파일로 저장한다.
- 메모리 해제: 사용한 메모리와 리소스를 정리한다.
4. 핵심 함수 설명
- PEM_read_RSA_PUBKEY(): PEM 형식의 공개키 파일을 읽어 RSA 구조체로 변환
- PEM_read_RSAPrivateKey(): PEM 형식의 개인키 파일을 읽어 RSA 구조체로 변환
- RSA_size(): RSA 키의 크기(바이트 단위)를 반환
- RSA_get0_n(), RSA_get0_e(): RSA 키의 모듈러스(n)와 지수(e) 값을 가져옴
- BN_cmp(): BIGNUM 값을 비교
- RSA_private_decrypt(): 개인키를 사용하여 복호화 수행
- RSA_free(): RSA 구조체 메모리 해제
결론
OpenSSL 라이브러리를 활용한 RSA 암호화/복호화 구현은 비교적 간단한 코드로 강력한 암호화 기능을 구현할 수 있게 해준다. 이러한 구현은 보안 통신, 데이터 보호, 전자서명 등 다양한 분야에서 활용될 수 있다. 정확한 키 관리와 메모리 관리가 중요하며, OpenSSL이 제공하는 다양한 API를 활용하여 더 복잡한 암호화 시스템도 구현할 수 있다.
RSA는 계산 복잡성으로 인해 대용량 데이터의 암호화에는 적합하지 않으므로, 대칭키 암호화와 함께 하이브리드 방식으로 사용하는 것이 일반적이다. 또한 충분한 키 길이(최소 2048비트 이상)를 사용하여 보안성을 확보해야 한다.
참고문헌
- OpenSSL 공식 사이트: https://www.openssl.org/
- OpenSSL 문서: https://www.openssl.org/docs/
- RSA 암호화 알고리즘: https://en.wikipedia.org/wiki/RSA_(cryptosystem)
- OpenSSL API 문서: https://www.openssl.org/docs/man1.1.1/man3/
- XCode와 OpenSSL 통합 가이드: https://developer.apple.com/documentation/xcode