2장은 주로 Confidentiality(기밀성)
3장은 주로 인증 & 서명 (무결성)
메시지를 반드시 암호화하여 송수신자 간의 인증을 수행한다.
메시지를 암호화하지 않고 인증할 경우, 기밀성은 보장되지 않는다.
메시지 암호화를 하지 않고 인증하는 방법은 MAC과 해시를 사용한 인증 2가지가 존재한다.
► 메시지 인증 코드 (MAC)
MAC(Message Authentication Code)는 송신자가 비밀키를 이용해 메시지에 작은 데이터 블록을 추가하는 방식이다.
MAC = F(Key, Message)
- 여기서
Key
는 송수신자가 공유하는 비밀키이다.- MAC의 크기는 메시지 크기보다 작다.
- 수신자는 수신한 메시지에 키를 적용하여 새로운 MAC을 생성하고, 수신한 MAC과 비교하여 메시지의 무결성을 검증한다.
- 예를 들어, DES를 사용하여 암호문 끝부분의 일부 비트를 MAC으로 사용할 수 있다.
► 해시를 사용한 인증
해시 함수 자체는 비밀키를 사용하지 않기 때문에, 사실상 인증이라기보다는 데이터의 무결성을 보장하는 방법에 가깝다.
1. 블록 암호 사용 방법
- 메시지 다이제스트(Hash(M))를 암호화하여 인증한다.
- 메시지 전체를 암호화하지 않으므로 오버헤드가 줄어든다.
- 공개키 암호 사용 방법
- 메시지 다이제스트를 개인키로 암호화하고, 공개키로 복호화하여 인증한다.
- Nonce(비밀값) 사용 방법
- 송수신자가 공통의 비밀값(S)을 갖고 있으며,
MD = H(S||M)
형태로 사용한다.- 여기서
||
는 Concatenation(연결)을 의미한다.
해시 함수는 메시지 인증과 디지털 서명에 사용된다.
H(x) = H(y)
를 만족하는 y를 찾기 어려워야 한다.H(x) = H(y)
를 만족하는 두 개의 서로 다른 입력 쌍(x, y)을 찾기 어려워야 한다.일방향 성질 (Preimage Resistance)
: 어떤 해시 값
h
에 대해H(x) = h
를 만족하는 x를 찾는 것이 계산적으로 불가능
H가 일방향이 아니라면?
- 공격자는 메시지와 해시코드 값을 얻게 됨
C = H(S||M)
- 공격자는 해시 함수의 역을 게산 ->
S||M
을 구함- 공격자는 M과 S(Nonce)를 알 수 있게 됨
약한 충돌 저항성
주어진 블록
x
에 대해서,H(x) = H(y)
를 만족하는y
를 찾는 것이 불가능
약한 충돌 저항성이 성립되지 않으면?
1. 메시지와 암호화된 해시코드 가로채기
2. 메시지로부터 암호화되지 않은 해시코드 생성
3. 동일한 해시코드를 갖는 변조된 메시지를 생성
즉, 위조가 가능해진다.
➜ 무결성 성립 못함
강한 충돌 저항성
생일 공격(Birthday attck)을 방어할 수 있다.
전수 공격 (Brute Force)
n
비트일 때:2^n
의 난이도2^n
의 난이도2^(n/2)
의 난이도Parity 값을 해시 코드로 사용하는 단순한 방법
충돌 저항성이 없다는 문제가 있다!
➜ 동일한 해시 값을 갖는 다른 메시지를 찾을 수 있다.
b1과 b2를 바꿔도 상관 없다.
Rotated XOR
위의 문제를 해결하기 위해 Rotated XOR방식을 사용한다.
n 비트 해시값을 0으로 초기화 한다.
뒤에 이어지는 n 비트 데이터 블록에 다음과 같은 절차를 시행한다.
- 현재 해시값을 왼쪽으로 한 비트 회전한다.
- 블록을 해시값에 XOR한다.
취약성: 평문 메시지에 해시코드만 암호화하는 경우 단순 XOR, RXOR 모두 취약
공격자가 평문 메시지로부터 동일한 해시 코드를 생성하는 다른 메시지를 찾는 것이 용이함
SHA는 안전 해시 함수이다.
2^128
비트 이하패딩 비트 붙이기 (1024의 배수로 만들어줌)
길이 붙이기
MD 버퍼 초기화
1024비트 블록 메시지 처리
출력
키는 사용하지 않는다는 것이 포인트
HMAC은 기존 해시 알고리즘에 비밀키를 추가하여 메시지 인증을 수행하는 방식이다.
H = 내장된 해시함수 ex) SHA-1
Y = M의 i번째 블록
b = 블록의 비트 수
n = 내장된 해시함수에 의해 생성된 해시코드의 길이
K = 비밀키
K+ = K의 왼쪽에 0을 붙여서 길이가 b가 되도록 만듦
ipad = 00110110
opad = 01011100
ipad는 ~opad이다
메시지 인증을 하기 위해서 HASH를 이용하는 방법이 있었다.
Nonce 붙이는 거
이건 아예 Hash 함수 자체만으로 인증이 되는 방식
Cipher Based Message Authentication Code는 블록 암호를 기반으로 MAC을 생성하는 방식이다.
앞에서 본 Message를 암호화 한 방법 말고 다른거(얘는 메시지 전체를 DES해서 MAC을 붙이는 방식)
CMAC은 chaining을 적용함
메시지 길이가 블록 길이의 정수배인 경우
Counter Mode를 이용한 MAC 방식으로, 기밀성과 무결성을 동시에 보호한다.
필요한 기술들
포인트
공개키 암호는 서로 다른 두 개의 키를 사용하는 비대칭 암호 방식이다.
공개키 방식이 관용 암호보다 오버헤드가 있다~ (O)
대칭 암호(관용 암호)
공개키 암호
알고리즘 | 암호/복호 | 디지털 서명 | 키 교환 |
---|---|---|---|
암호/복호: 수신자의 공개키로 메시지 암호화
디지털 서명(인증): 송신자 자신의 개인키로 암호화
키 교환: 세션 키를 공유
소인수분해 문제의 어려움을 기반으로 한 알고리즘
송신자와 수신자는 모두 n과 e를 알고있어야 함.
수신자만이 d값을 알아야 함.
공개키: e, n
개인키: d, n
C = M^e mod n
M = C^d mod n
RSA의 요구 조건
n보다 작은 모든 정수 M에 대해서 M = M^ed mod n을 만족하는 값 e,d,n을 구할 수 있어야 함
M^e와 c^d를 구하는 것이 쉬워야 함
e,n으로 d를 구하는 것이 어려워야 함
RSA 해독 방법
키 교환
두 사용자가 비밀키를 안전하게 교환해서 메시지를 암호화하려는 목적
이산 대수 문제를 푸는 것이 어렵다는 데 근거함
소수 p의 원시근(primitive root)
원시근: 자신의 거듭제곱을 이용하면 1부터 p-1까지의 정수를 모두 생성해 낼 수 있는 수
모두에게 알려진 정보
A는 랜덤넘버 X_A(X_A < q) 를 선택
B는 랜덤넘버 X_B(X_B < q) 를선택
A는 Y_a를 계산 Y_A = a^X_A mod q
B는 Y_b를 계산
이산대수
공식:
공개키: Y
개인키: X_A, X_B
공개키와 개인키를 이용해서 대칭키 교환을 함
대칭키: K = Y_B^X_A mod q
Y_A = a^X_A mod q
, Y_B^X_A mod q
등의 계산들은 쉽다. man-in-the-middle attack에는 취약함
-> 인증이 안되었기 때문이다.
중간자 == 공격자
메시지 위조가 가능
인증이 안되어서 발생한 문제이다!
해결방안: 전자 서명, 공개키 인증서를 사용
DSS
ECC
메시의 출처와 메시지 내용에 대한 확신을 위해 메시지 전체를 암호화
문서의 기능을 대신하는 작은 비트블록을 암호화
salt: 임의의 값이지만 A와 B가 모두 알아야 함.
해시 2번 거쳐서 나온 결과를
RSA 방식으로 A가 개인키로 암호화 해서 보냄
B는 A의 공개키로 까봄 (인증)
디지털 서명 자체는 무결성 + 기밀성인가? <- 공부 필요