이 블로그는 개인의 공부 목적으로 작성된 블로그입니다. 왜곡된 정보가 포함되어 있을 수 있습니다
앞 포스팅과 이어집니다~
https://bluesparrow.tistory.com/19
0. 비대칭 암호화에서 공개키의 취약성
앞선 포스팅에서 비대칭암호화 기법에 대해 알아보았다. 이때 비대칭암호화 기법은 보안 강도가 높은 대신 공개키를 통신자들 간에 전달하는 중 위변조될 수 있었다. 이번 포스팅에 사용자가 공개키를 받았을때, 공개키가 소유주의 관계를 파악할 수 있는 방법에 대해 알아보자(인증)
1. 전자 서명
전자 문서에 대해서 위 변조를 방지하고 문서의 내용 및 서명자에 대한 인증을 보장하는 것
우리가 익히 알고 있는 서명의 역활과 동일함
그러나 다른 사람의 서명을 따라해서 사용할 수 있고, 인감 도장을 가짜로 만드는 등 다양한 문제가 발생할수 있어 전자 서명에도 비슷한 문제가 발생할수 있음
전자 서명의 보안 요구사항은 다음과 같다
- 위조불가 (무결성)
- 인증
- 재사용 불가 (다른 사람이 가져가서 악용할 수 있다)
- 변경 불가
- 부인방지 (책임회피 불가능, 서명을 한 사실은 지울 수 없다)
전자 서명을 다음과 같이 제시한다.
- 데이터를 송신자의 개인키로 암호화한다. $S=Sig(M,개인키)$
- 수신자는 공개키를 통해 암호화한 데이터를 복호화한다 $ M=Verify(S,공개키)$
- 데이터와 복호화한 데이터가 같은지 확인한다.
그러나 이러한 방법에 몇가지 의문점이 있는데
- 공개키 및 암호화된 데이터가 전달 도중 위조 가능성이 존재
일단 계속 이어가보자
2. 공개키 전달
공개키를 어떻게 안전하게 전달할까? 인감도장을 생각해보자 우리는 인감도장을 사용하기 위해서 동사무소에 인감을 등록해야 한다. 공개키도 이렇게 관리하면 되지 않을까??
3. 전자서명과 기존 비대칭 암호화의 차이점
전자서명과 기존의 비대칭 암호화는 방식이 다른데, 방식이 다른이유는 암호화의 목적이 다르기 때문이다.
암호화: 지정된 사용자만이 데이터를 열람할 수 있고, 허가되지 않은 나머지 사용자는 데이터를 열람할 수 없음
전자서명: 전자서명을 통해 서명자를 알 수 있어야 하고, 이때 모든 사용자가 전자서명에 대한 정보를 열람할 수 있어야한다.
따라서 송신자가 데이터를 수신자의 공개키로 암호화하는 기존의 비대칭 암호화 방식과 다르게 전자서명은 송신자(서명자 라고 할 수 있다)가 본인의 개인키로 암호화 한뒤 다른 사용자가 송신자의 공개키를 통해 서명을 볼 수 있는 형식이다.
4. 전자서명과 해시
3대한 고민으로 우리가 생각 해볼 문제가 하나 있는데, 전자서명은 데이터를 못보게 하는 것이 아닌 데이터가 송신자로 부터 온것이라는 것을 증명만 하면 되기 때문에(1의 보안요구사항을 모두 충족하는) 데이터 전체에 대해서 암호화를 할 필요가 없어진다(데이터 전체에 대해서 암호화할경우, 그만큼 데이터도 길어지기 때문에 데이터 효율성 측면에서도 비효율적)
그래서 전자서명에서는 데이터의 해시함수를 통해 작은 값으로 변환하여 해당 값에 대한 전자서명을 만든다. 그러면 하나의 의문점이 들 수 있는데 해시함수를 통해 데이터 축소되면서 데이터의 표현 범위도 감소하게 되는데, 과연 해시함수를 사용하는 것도 데이터의 무결성을 보장할 수 있을까?
-> 그래서 실제로는 데이터$ M $과 암호화된 해시값 $S$를 보내 수신자가 데이터를 해시한 값 $H(M)$과 암호화된 해시값을 복호화하여 $Verify(S,송신자공개키)$ 두값을 비교한다고 한다!!
5. RSA Signature
RSA 암호화 알고리즘과 유사한 전자서명 방식
1. 공개키
$n=p\cdot q$ 이때 $p,q$는 prime
$e\ mod(p-1)(q-1)$ (서로소 관계)
2. 개인키
$p,q$
$d\equiv e^{-1} mod (p-1)(q-1)$
3. 암호화
$S =M^d mod\ n$
4. 복호화(인증)
$M=S^e mod\ n$
$=M^{de} mod\ n=M^{de\ mod(p-1)(q-1)}mod\ n=M\ mod\ n$ (RSA 암호화와 동일한 방식으로 증명가능)
6. RSA Signature 취약성
문제가 없어보이는데 두개의 서명을 아는 경우 문제가 생길수 있음
$S_1=M_1^d mod\ n,S_2=M_2^d mod\ n$이라는 2개의 서명을 아는 경우,
$S=S_1*S_2 mod\ n $ 에 대해서
$S=S_1*S_2 mod\ n =M_1^d\cdot M_2^d mod\ n$
$=(M_1\cdot M_2)^d mod\ n$ 으로 $S$라는 새로운 서명을 생성 할 수 있음
새로운 서명을 만들 수 있는게 문제인가?
그렇다 전자 서명 보안 요구사항은 인증을 할 수 없고 서명 생성자의 부인을 방지할 수 없기 때문에..
7. RSA에서의 해시
6에서 우리가 만약 해시함수를 사용한다고 가정해보자
$S=H(M)^d mod\ n $ 으로 표현가능
$M1+S1$ $S1=H(M1)^d mod\ n$
$M2+S2$ $S2=H(M2)^d mod\ n$ 이고,
이때 $S1 \cdot S2=H(M1)^d \cdot H(M2)^d mod \ n $이므로
$=(H(M1) \cdot H(M2))^d mod \ n \neq H(M1\cdot M2)^d mod\ n$이므로 새로운 서명을 만드는 것을 방지 할 수 있다.
8. DSA
elgamel 암호화 알고리즘과 유사한 방식
1. 개인키
2개의 prime $p,q$에 대해서
$0\leq x\leq p$ 인 prime $x$값 ,
2. 공개키
$ y=g^x mod\ p$에서 $y,g,p$
3. 암호화
$0< k < q$ 인 prime$k$에 대해서
$r=(g^k mod \ p)mod q$
$s=(k^{-1}(H(M)+xr))mod\ q$
$<M,r,s>$ 전달 ($r,s$가 서명에 해당함)
4. 복호화 (인증)
$w=s^{-1} mod\ q$
$u1=H(M)w\ mod\ q$
$u2=rw\ mod\ q$
$v=((g^{u1}y^{u2})mod\ p)mod\ q$
$v==r$ 이면 인증 완료
9. 해시
하나의 문자열을 짧은 문자열로 변환하는것 (대표적으로 모듈러연산)
자세하게는 아직 몰라서 일단 해시함수에 넣어 짧은 문자열로 변환하는 것으로 이해하자.
이때 해시함수는 짧은 문자열로 변환하는 것이기 때문에 중복되는 경우가 있음(결국 표현할수 있는 범위가 감소하는 것이기 때문에...) 그래도 그 확률이 매우 희박하기 때문이고, 따라서 일방향성을 가짐(해시값을 가지고 원문으로 변환하는것이 불가능)
나머지 연산을 예로 들면 쉽게 이해가능
10. SHA
해시 알고리즘중 하나
$0<|M|<2^{64}$ 범위의 데이터에 사용가능
$512$비트를 입력 블록으로 $16*32$단위로 해시하여 $160$해쉬 생성 SBS와 같은 방식으로 이전 해시결과를 다음 해시 결과에 사용
이해하는 못했다ㅠㅜ
11. 공개키 기반구조
다시 돌아와서 공개키를 어떻게 안전하게 전달할까?
Man in the Middle of Attack: 계속해서 말하고 있는 중간에 공격자가 공개키를 위조하는 공격기법
인증서: 공개키에 대한 증명서, X.509 표준을 따름
각각의 인증서는 상호호환(우리가 항상 고군분투하는 공인 인증서)
인증기관(CA): 공개키에 대한 증명 발급소
PKI: 사용자와 공개키, 인증서, 인증기관을 전부 포괄한 공개키 기반구조
CA, RA, PCA, PAA와 같이 업무로 분리된 기관이 처리하는 구조
PAA: 정책 승인기관(정책에만 관여)
PCA: 정책 인증기관(인증서를 보유)
CA: 인증기관(금융 결제원)
RA: 등록기관(은행)
Cross Certification: 다른 인증기관에 대해서 서로의 공개키(인증서)를 인정해주는 정책
토스나 카카오톡에서 공인인증서가 있으면 다른 인증서를 발급하게 도와주는 것이 이것에 해당하는 거 같다.
12. 그래서 개인키를 어떻게 전달할건데?
인증서에는 기본영역 + 기본영역에 대한 전자서명이 있다.
이때의 전자서명은 CA의 개인키로 암호화되어 있는데 이때 우리는 root CA(PCA)로 전자서명이 되어 있는 CA의 인증서를 검증하고 검증된 CA의 개인키를 통개 전자서명을 인증하여 인증서를 인증하는 것이다...
인증의 인증의 인증의 형태이다....(PCA를 통해 CA 인증->CA 공개키로 사용자 인증->사용자의 공개키로 사용자의 전자서명 인증=> 사용자의 개인키가 인증됨!)
13. 전자봉투
비대칭키는 느려서 대칭키를 활용하는 방법
1. 송신자는 수신자 인증서를 통해 수신자의 공개키를 획득
2. 송신사가 대칭키를 무작위로 생성하여 수신자의 공개키로 암호화하면서 이때 본인의 개인키로 전자서명 생성
3. 수신사는 송신자의 공개키로 전자서명을 인증하고 수신자의 개인키로 복호화
'보안' 카테고리의 다른 글
[Spring Security in action] 스프링 시큐리티 시작하기 (0) | 2024.01.11 |
---|---|
[보안] 전자 지불 시스템, 전자 화페 (0) | 2023.12.08 |
[보안] 비대칭 암호화, ElGamal, RSA (3) | 2023.12.01 |
[보안] 공개키와 비대칭 암호화 알고리즘 (1) | 2023.11.30 |
[보안] 대칭키 와 DES 알고리즘3 (0) | 2023.11.30 |