[PKI] RSA 암호화와 전자서명 정리
RSA는 공개 키와 개인 키를 사용하는 비대칭 암호 알고리즘이다. 큰 정수의 소인수분해가 어렵다는 성질에 안전성의 기반을 두며, 암호화와 전자서명에 모두 활용할 수 있다. 하지만 같은 수학 연산을 쓴다고 해서 암호화와 서명이 서로의 단순한 역연산인 것은 아니다. 각각 다른 인코딩 규칙과 보안 목적을 가진다.
PKCS#1의 두 영역
현재 RFC 8017의 PKCS#1 v2.2에는 대표적으로 다음 방식이 정의되어 있다.
| 목적 | 기존 방식 | 새 설계에서 선택할 방식 |
|---|---|---|
| 암호화 | RSAES-PKCS1-v1_5 | RSAES-OAEP |
| 서명 | RSASSA-PKCS1-v1_5 | RSASSA-PSS |
RSAES-OAEP는 새 애플리케이션이 지원해야 하는 암호화 방식이고, RSAES-PKCS1-v1_5는 기존 시스템과의 호환을 위해 남아 있다. 특히 v1.5 암호화의 복호화 오류를 구분해 노출하면 선택 암호문 공격에 취약해질 수 있다.
RSASSA-PSS는 무작위 salt를 사용하는 확률적 서명 방식이다. RSASSA-PKCS1-v1_5 서명은 여전히 널리 사용되지만, 새 프로토콜을 설계한다면 PSS 지원 여부를 우선 검토한다.
큰 데이터를 RSA로 직접 암호화하지 않는 이유
RSA가 처리할 수 있는 메시지 길이는 모듈러스와 인코딩 방식에 의해 제한된다. 예를 들어 RSAES-OAEP의 최대 입력 길이는 해시 길이에도 영향을 받는다. 실무에서는 보통 다음과 같은 하이브리드 암호화를 사용한다.
- 무작위 대칭 키를 생성한다.
- 실제 데이터는 AES-GCM 같은 대칭 키 암호로 암호화한다.
- 대칭 키만 수신자의 RSA 공개 키와 OAEP로 암호화한다.
이 방식은 큰 데이터를 효율적으로 처리하면서 데이터 무결성도 함께 검증할 수 있다.
암호화와 서명의 차이
- 암호화는 수신자의 공개 키로 기밀성을 제공하고, 수신자가 개인 키로 복호화한다.
- 서명은 서명자의 개인 키로 메시지에 대한 증거를 만들고, 누구나 공개 키로 검증할 수 있다.
전자서명은 메시지를 숨기지 않는다. 또한 공개 키가 누구의 것인지 확인하려면 인증서와 신뢰 체인 같은 별도의 PKI 검증이 필요하다.
구현 시 원칙
- 직접 RSA 수식이나 패딩을 구현하지 않고 검증된 암호 API를 사용한다.
- 한 RSA 키 쌍을 여러 방식에 무분별하게 재사용하지 않는다.
- OAEP와 PSS의 해시, MGF, salt 길이 같은 파라미터를 양쪽에서 명확히 합의한다.
- 개인 키는 내보내기보다 Keychain이나 보안 하드웨어 안에서 연산하는 방식을 우선한다.
댓글남기기