정보 보호에는 다음과 같은 3 요소를 중요하게 생각한다.
- confidentiality - 데이터와 privacy한 기밀성
- integrity - 데이터와 시스템의 무결성
- availability - Ddos의 위협을 받는 가용성
3 요소는 이와 같은 방식 안에서 지켜진다.
owner는 위험을 줄이기 위해 대응책을 만들고, 공격하는 사람은 risk를 높이는 방법을 강구한다.
참고로 여기서 asset은 owner가 관리하는 정보를 말한다.
엑세스된 데이터는 반드시 통제 하에 안전하게 보호되어야 하며, 컴퓨터의 사용자 인증권한을 사용해서 보호한다.
앞으로 이 인증권한을 어떻게 주고받는지가 정보 보호의 핵심이다.
아래는 기초적인 보안 설계의 원칙들이다.
- 디자인은 가능한 한 심플하고 작게 설계
- 유저가 시스템에 접근 시 접근제한 엑세스를 체크
- 밑에서 설명할 원칙인데 알고리즘은 open design으로 설계
- 각 권한들을 나눠야 하고 각각에 적은 권한들을 부여
- common part를 가능한 한 작게 설계해야 함
(우리가 자주 접하는 영역이면 침범하기 쉽고 이는 전체 감염으로 이어짐)
이런 원칙들을 지키며 보안 전략을 짜야 한다.
Kerckhoff's Principle
암호의 안전성은 알고리즘이 아닌 키의 비밀성에 의존하여야 한다는 원칙이다.
즉, 적의 손에 암호화 알고리즘이 들어가도, 공격이 어려워야 한다.
실제 환경에서는 알고리즘을 잘 안 바꾸고, 쓰던 것을 계속 사용하는데
이 때문에 키의 비밀성을 유지하는 것보다 알고리즘의 비밀성을 유지하는 것이 더 어렵다.
애초에 이런 복잡한 알고리즘보다 짧고 간단한 키 하나 비밀 유지하는 것이 더 쉽다. 결국 비밀은 적을 수록 안전하다는 말을 하고 있다.
만약 키 보안이 뚫렸다? 그럼 키 비밀번호를 바꾸기만 하면 된다.
이 말은 시스템 자체는 유지하기 편하다는 것이다. 만약 다른 키를 가지고 있는 사람들과 소통할 때에도 키만 알려주면 되기 때문에 소통하기도 쉽다.
이제 어떤 전략들이 있는지 살펴보자.
Symmetric Encryption
대칭 암호화(Symmetric Encryption)는 암호화 및 복호화 프로세스에서 동일한 키를 사용하기 때문에 "대칭"이라는 용어를 사용한다.
배포자가 수신자에게 secret key를 알려주고 수신자는 그 키를 이용하여 plaintext를 본다.
이 과정에서 배포자와 수신자 모두 동일한 키를 사용하므로 암호화 및 복호화 과정이 빠르고 간단하다는 장점이 있다.
하지만 대칭 암호화에는 secret key 교환 과정에서 제 3자가 가로챌 수 있는 키 교환 문제(Key Exchange Problem)와 많은 수의 key가 필요하다는 단점이 있다.
많은 수의 key가 필요하다는 것이 무슨말이냐면
예를들어 N명의 사람들이 있는데 그 중 2명이서 서로 문서를 주고받으려 한다면 n Combination 2 로 n( n-1 ) / 2 의 경우의 수가 필요하다. 경우의 수가 거의 n의 제곱만큼 필요하다..
여기서 각 사용자들은 N개의 secret key가 있다.
Asymmetric Encryption
공개 키와 다르게 Asymmetric Encryption는 public key와 private key가 존재한다.
예를 들어 Bob이 Alice에게 안전한 메시지를 보내려고 한다고 가정해보자.
Bob은 Alice의 public key를 사용하여 메시지를 암호화한다. 그런 다음 암호화된 메시지를 Alice에게 전송한다.
Alice는 자신의 private key를 사용하여 이 메시지를 복호화한다...
여기에서 대칭 암호화랑 다른 점이 생긴다.
(나는 key sharing이 쉽다는 점과 암호를 건네줄 때 취약점이 이해 안갔었다.)
비대칭 암호화는 서로 key를 주고받을 필요가 없다.
이미 정형화된 시스템 안에서 Alice의 public key는 누구나 접근 가능하고, 만약 암호화를 시켜 주고받을 메세지가 있다면 그 사람이 Alice의 public key에 secret key를 이용하여 암호화를 시킨다.
Alice는 암호화된 문서를 받고 나면, secret key를 알 필요 없이 원래 Alice가 갖고 있던 public key의 private key를 이용하여 해독한다.
여기서 Symmetric Encryption과 차이점은, public key와 secret key는 대칭 암호화와 다르게 서로 같지 않다.
때문에 위의 예시로 알 수 있듯이 key sharing이 쉽고, key의 수가 적다.
key의 수가 적다는 것은 N개의 public key가 있으면 N개의 secret key만 필요하다는 것이다.
N의 제곱에 비하면 확실히 적은 수다.
하지만 public과 secret이 서로 다르기 때문에, private key 복호화가 symmetric보다 느리다.
위의 예시 외에도 전통적인 복호화 Encryption 방법이 있다.
일반적으로 각 알파벳에 숫자를 대응시키고 mod연산을 사용하여 복호화한다.
mod는 나누기 후 나머지를 계산하는 연산인데, 예를들어 10 mod 3을 통해 10을 3으로 나눈 후 나머지가 1임을 알 수 있다.
Shift Cipher
문자 그대로 이동 암호이다.
위의 그림에서 처럼 문자들에 대응시킨 숫자들을 일정 부분 더하거나 빼서 암호화 시키는 방법이다.
알파벳 가짓수만큼 Key K는 0부터 25까지 임의의 숫자인데,
Enc(K, x) = (x + K) mod 26 으로
Dec(K, Y) = (Y - K) mod 26 으로 나타낸다.
예를 들어보자.
shift (18 7 8 5 19)를 +9 mod 26 만큼 이동한다면 (1 16 17 14 2) BQROC가 된다.
반대로 BQROC (1 16 17 14 2)를 -9 mod 26 만큼 이동한다면 shift (18 7 8 5 19)가 된다.
만약 우리가 Brute force 방식으로 암호를 attack한다면
plaintext attack은 (shift, BQROC) 이 주어질 때 우리가 K를 계산하는 것이다.
K = B - s = (1 - 18) mod 26 = 9
K = Q - h = (16 - 7) mod 26 = 9
Affine Cipher
아핀 암호는 시프트와 곱하기를 같이 사용하는 방법이다. 여기서 K = ( α , β ) 두 개의 숫자를 갖는다.
gcd( α , 26 ) = 1 이다. ( α 와 알파벳 개수 26의 최대공약수 Greatest Common Divisor ) = 1
여기서 α의 나머지가 1이 되어야 하는데 나눴을 때 후보군은 1 3 5 7 9 11 15 17 19 21 23 25이 있다.
갑자기 최대공약수 1이 왜나왔나 싶었는데 곱셈에 대한 역원이 없는 경우도 존재하기 때문에 이를 정의해준다.
그런데 이렇게 α 값을 한정해 놓으면 키 값의 개수는 12개가 되므로 shift 암호에 비해 오히려 약하다고 평가된다.
Enc(K, x) = αx + β mod 26
Dec(K, Y) = 1/ α( Y - β ) mod 26
예를 들어보자.
hot (7 14 19)를 ( α , β ) = (7, 3)을 이용하여 (52 101 136) mod 26 을 계산해주면 (0 23 6) AXG로 바뀐다.
(hot, AXG)가 주어질 때 브루트 포스 방식으로 암호를 공격해보면
Enc(K, x) = αx + β mod 26 에 h >> A, o >> X를 대입
0 = 7α + β mod 26
23 = 14α + β mod 26 >>> 여기서 gcd( α , 26 ) = 1 을 이용해야 한다.
다시한번 말하지만 α의 나머지가 1이 되어야 하는데 나눴을 때 후보군은 1 3 5 7 9 11 15 17 19 21 23 25이 있다.
브루트 포스에 맞게 하나하나 맞는 값이 나올 때 까지 대입해보면.. (mod26이 0이랑 23을 만족하는 α , β 찾기)
결국 α = 7, β = 3을 구했다.
그럼 우린 K키 (7, 3)을 구한 것이다.
Substitution Cipher
이것은 특정 문자를 다른 문자로 치환함으로서 암호를 생성하는 방식이다.
여기서 K는 알파벳 26개의 순열인 π로 나타낸다.
Enc(K, x) = π(x)
Dec(K, Y) = 1/ π(Y)
왜 순열로 나타낼까?
우선 하나의 문자를 다른 임의의 문자로 치환할 가능성은 26가지 있다. 그 다음 문자는 25가지, 24가지... 그렇게 각 가능성을 곱하기 때문에 순열로 나타낸다.
이번에도 brute force 방식으로 공격해보면
private key 후보가 26!가지 있기 때문에 주먹구구식으로 공략하긴 좀 어려워 보인다.
이 방식은 어울리지 않는다. 만약에 몇몇 문자쌍이 주어진다면 가짓수는 (26 - n)!이 될 것이다.
비록 이렇게 brute force식으로 하긴 했지만.. 신기하게 사람들이 자주 사용하는 문자 빈도가 있다고 한다.
보면 e가 제일 많고 a, t, o, i도 많다. 이런 빈도를 활용해서 앞으론 처음부터 하나하나 하지 말고 빈도가 많은 문자부터 시도한다.