💡 IT 보안에서의 암호는 정보를 이해할 수 없도록 암호화 하거나 다시 해독하기 위한 일련의 단계를 정의한 알고리즘을 암호 라고 합니다.
용어
암호화를 설명하기 앞서서 자주 사용될 용어에 대해 짚고 넘어가겠습니다.
평문(Plaintext) : 암호기술을 통해 보호하고자 하는 원본 데이터
암호문(ciphertext) : 평문에 암호기술을 적용한 것
암호화 : 평문에 암호 기술을 적용하여 변환하는 과정으로 암호 키 (key) 를 생성
복호화 : 암호 기술이 적용된 평문을 다시 복원하는 과정
기대효과
암호 기술을 이용하여 데이터 기밀성, 데이터 무결성, 인증 및 부인 방지 등의 기능을 제공 할 수 있습니다.
기밀성 : 허락되지 않은 사용자 또는 객체가 정보의 내용을 알 수 없도록 하는 성질
무결성 : 허락되지 않은 사용자 또는 객체가 정보를 함부로 수정할 수 없도록 하는 성질
인증 : 사용자 또는 개체의 디지털 정체성을 식별
부인방지 : 정보를 보낸 사람이 나중에 정보를 보냈다는 것을 부인하지 못 하도록 하는 것
종류
암호의 종류는 크게 세가지로 나눌 수 있습니다.
대칭형 암호화 (비밀 키 암호)
암. 복호화에 같은 암호 키를 사용하는 알고리즘이며, 송신자와 수신자는 암호 키가 노출되지 않도록 비밀로 관리해야하며 블록 암호와 스트림 암호로 나눌 수 있습니다.
비대칭형 암호화 (공개 키 암호)
대칭 키 암호화와 달리 암.복호화에 서로 다른 키를 사용하는 알고리즘입니다. 송신자는 수신자의 공개키를 이용하여 암호화하며, 수신자는 자신의 공개키로 암호화된 암호문을 자신의 개인키로 복호화 할 수 있습니다.
대표적인 알고리즘으로는 RSA, DSA, ELGamal, ECC 등이 있습니다.
단방향 암호화
해시 함수라고도 불리며 임의의 길이의 메시지를 입력으로 받아 고정된 길이의 해시 값을 출력하는 함수 입니다. 해시 함수에는 암호 키가 사용되지 않기 때문에, 같은 입력에 대해서 항상 같은 해시 값을 얻을 수 있습니다.
대표적인 해시 함수로는 MD5, HAS-160, SHA-1,SHA-2,SHA-3 등이 있습니다.
위의 암호 종류 중 대중적으로 사용되는 비대칭형 암호화 그 중에서도 RSA가 무엇인지 살펴보도록 하겠습니다.
RSA(Rivest-Shamir-Adleman) 암호
: 암호화 뿐만 아니라 전자서명이 가능한 최초의 알고리즘 RSA 암호체계의 안정성은 큰 숫자를 소인수 분해하는 것이 어렵다는 것에 기반을 두고 있어 큰 수의 소인수 분해를 획기적으로 빠르게 할 수 있는 알고리즘이 발견된다면 이 암호 체계는 가치가 떨어질 것으로 보고 있습니다.
방식
RSA는 공개키(public key)와 개인키(private key) 를 사용합니다. **키 : 평문을 열고 잠구는 상수(Constant)
공개키 알고리즘은 누구나 어떤 메시지를 암호화 할 수 있지만, 그것을 해독하여 열람할 수 있는 사람은 개인키를 지닌 단 한 사람만이 존재한다는 점에서 대칭 키 알고리즘과 차이를 가집니다.
위의 이미지처럼 메시지와 공개키 모두를 알 수 있다면 변조된 메시지를 보낼 수 있기 때문에, 실제로 사용시에는 수신측의 공개키만을 사용하여 암호화하는 경우는 드뭅니다.
일반적으로 RSA 암호화를 사용하는 경우는 송/수신 쌍방으로 암호화를 진행하는 방식이 있는 B의 개인(private)키로 암호화하여 A의 공개(public)키로 암호화를 한 데이터를 송신하고
A는 본인의 개인(private)키로 복호화 한 후 A의 공개(public)키로 재 복호화하는 방식입니다.
키 생성
소수 선택: 두 개의 큰 소수(p, q)를 선택합니다. 이 소수는 매우 크고 무작위로 선택되어야 합니다. ** p와q : p와q는 각각 매우 큰 소수입니다. RSA의 보안성은 이 두 소수가 크고 무작위로 선택되어야 한다는 점에서 시작됩니다.
곱셈: p와 q를 곱하여 n을 계산합니다.n=p×q
여기서 n은 모듈러 연산에서의 모듈러 값으로 사용됩니다.
오일러 피 함수 계산: 두 소수(p, q)의 오일러 피 함수 값(φ(n))을 계산합니다. ϕ(n)=(p−1)×(q−1)
공개키 선택: 공개키 e를 선택합니다. 일반적으로 1보다 크고, φ(n)과 서로 소인 값을 선택합니다. 가장 일반적으로 사용되는 값은 65537입니다.
개인키 계산: 공개키 e의 모듈러 역수인 d를 계산합니다. 즉, 다음 조건을 만족하는 d를 찾습니다 :d×e≡1 (mod ϕ(n))
이렇게 생성된 공개키와 개인키는 RSA 알고리즘의 핵심 요소로서, 암호화와 복호화에 사용됩니다.
암호화
공개키 사용: 위에 언급한 키 생성 중 공개키 방식으로 메시지를 암호화합니다. 공개키는 (e, n) 형태로 제공됩니다.
메시지 변환: 암호화하려는 원본 메시지를 숫자로 변환합니다. 일반적으로 메시지를 블록화하고, 각 블록을 숫자로 변환한 후 암호화 과정을 적용합니다.
암호화 계산: 메시지의 숫자 표현에 대해 공개키 e를 사용하여 연산을 수행합니다 암호문=원본 메시지^e mod n 여기서 n은 공개키와 개인키 쌍에서 사용되는 모듈러 값입니다.
암호문 전송: 계산된 암호문은 수신자에게 안전하게 전송됩니다.
암호화 주요 조건
메시지 크기: RSA는 대개 고정된 크기의 블록 단위로 메시지를 처리합니다. 일반적으로 블록 크기는 RSA 모듈러 값 n의 크기와 관련이 있으며, RSA의 보안 강도에 중요한 영향을 미칩니다.
블록화: 일반적으로 큰 메시지는 블록으로 나누어 암호화됩니다. 각 블록은 RSA 암호화 알고리즘에 의해 개별적으로 처리됩니다. 이는 RSA가 직접적으로 긴 메시지를 처리하기 어렵기 때문에 필요한 절차입니다.
패딩 (Padding): RSA에서는 블록 암호화를 사용하고, 메시지 길이가 블록 크기보다 작을 경우 패딩을 추가하여 블록 크기와 맞춥니다. 패딩은 일반적으로 RSA 블록의 마지막에 추가되며, 암호화 및 복호화 과정에서 메시지의 왜곡을 방지합니다.
모듈러 연산: RSA에서 모든 연산은 모듈러 연산으로 처리됩니다. 즉, 큰 소수 n에 대해 m^e mod nm^e \mod nmemodn과 c^d mod nc^d \mod n c^d mod n과 같은 형태로 암호화와 복호화가 이루어집니다. 이 모듈러 연산은 RSA 알고리즘의 핵심 부분입니다.
공개키 및 개인키의 적절한 사용: RSA에서는 공개키는 암호화에, 개인키는 복호화에 사용됩니다. 공개키는 모든 사용자에게 공개되며, 개인키는 오직 소유자만이 접근할 수 있습니다.
복호화
개인키 사용: 수신자는 자신의 RSA 개인키를 사용하여 암호문을 복호화합니다. 개인키는 (d, n) 형태로 제공됩니다.
암호문 수신: 수신자는 암호화된 메시지(암호문)를 받습니다.
복호화 계산: 개인키 d를 사용하여 암호문에 대해 연산을 수행합니다 원본 메시지=암호문^d mod n 이 연산은 암호화 과정의 역 연산으로, 개인키 d는 공개키 e와 관련된 역수로 선정되어 있습니다.
원본 메시지 복구: 계산된 결과는 원본 메시지의 숫자 표현입니다. 이를 원하는 형태로 변환하여 사용할 수 있습니다.
복호화 주요 조건
비밀 키 d:
비밀 키 d는 공개 키 e와 ϕ(n)을 이용하여 계산된 값으로, 암호문을 복호화하는 데 반드시 필요합니다.
d는 모듈러 산술에서 e의 역수입니다.
모듈러스 n:
복호화 과정에서도 공개 키와 동일한 n이 사용됩니다.
모듈러 연산:
RSA 암호화와 복호화는 모두 모듈러 연산에 기반합니다. 이는 큰 수의 연산을 효율적으로 처리하기 위해 필수적입니다.
소수 p와 q:
비밀 키 생성 시 사용된 소수 p와 q는 공개되지 않습니다. p와 q를 알면 ϕ(n)을 계산할 수 있고, 이를 통해 d를 구할 수 있기 때문에, 이 소수들은 안전하게 비밀로 유지되어야 합니다.
간단 예제
위에서 설명했듯 p와q는 큰 수들로 이루어져 있기 때문에 작은 수를 통해서 계산하는 예제를 통해 암 복호화의 원리를 설명 드리겠습니다.