기밀성 : 주고받는 당사자만 알고 다른 사람은 몰라야한다
인증 : Authentication, 내가 지금 제대로 된 사람이랑 대화하고 있는지 확인한다.
무결성 : 메시지가 왜곡이 없는 오리지널 메시지인지 확인해야한다
보안은 각 계층마다 있는데
응용계층
트랜스퍼 계층
네트워크계층
그리고 전체 시스템 차원에서의 보안 등이 있다.
책에서는 보안 사항을 설명하기 위해 다음과 같은 그림을 사용한다.
Alice, Bob이 대화를 주고받고, 이를 Trudy가 공격하는 방식이다.
암호화를 글로 표현하자면, 평문을 암호화 알고리즘을 통해서 비문으로 바꾸고, 복호화 키를 통해서 암호화 된 정보를 해제하는 방식이다.
m : 평문
ka(m) : 비문, a로 암호화 됨
m = kb(kb(m))
26개의 알파벳을 각자 매칭되는 다른 문자에 대응하게 만들어서 보낸다. 하지만 이 방식은 너무 쉽게 뚫린다.
암호화 된 텍스트만 있다고 하면
1. 브루트포스
2. 통계적 접근 -> 특정 단어들을 사용된 것을 유추해서 복호화 키를 찾아냄
등이 있다. 이를 막기 위해서 다음과 같은 수준의 암호화 기법이 도입된다.
64비트정도를 56비트정도로 매핑시켜서 표현한다. 이때 cbc라는 기술을 쓴다 이를 3번하면 3DES이고, AES는 더 발전했다 DES를 1초만에 뚫어버린다면 AES방식으로는 149조년이 걸린다.
평문을 64비트로 나누고 이를 56비트의 대칭키를 이용해서 다시 64비트의 암호문으로 만든다.
56비트의 키를 가지는데, dl 키 속에는 테이블, 뒤섞는 방법, 몇번 했는지에 대한 정보가 들어있다.
하지만 동일한 문자가 반복되면 이를 추정해서 암호가 뚫릴수도 있다.
Exclusive OR를 쓰면 KS(message EOR R) => 암호화 가 된다.
그리고 암호를 보낼 때 R도 같이 보낸다. EOR은 그 특성상 2번 돌리면 원래 message가 나오게 된다.
이러면 중복된 문자를 보내더라도 R이 달라지면 유추가 불가능해진다. 하지만 이렇게 보내면 64비트에 R64비트를 또 보내야한다.
따라서 이를 해결하기 위해 앞에 보낸 64비트짜리 코드를 EOR로 활용하는 방식을 적용한다.
KS(message EOR R)이 다음 암호를 복호화할 때 사용하는 EOR을 쓴다.
이를 Cipher Block Chain이라 부른다.
하지만 DES는 요즘 와서는 22시간이면 뚫려서 AES가 표준이 되었다.
비트가 128비트로 늘었고 키는 128, 192, 256비트를 쓴다.
그래서 이 키는 어떻게 나눠가지는가? 이는 Public Key를 이용해서 나눠가진다.
엘리스가 밥에게 퍼블릭 메시지를 보내자고 하면, 엘리스는 공개되어있는 밥의 공개키로 메시지를 암호화한다.
이렇게 공개키로 암호화 된 것을, 밥이 가진 자신의 비밀키를 가지고 풀면 풀린다.
공개키와 비밀키는 이렇게 암호화 되어있기 떄문이다. 또 반대로 밥이 비밀키로 암호화해서 보낸 메시지는 누구나 공개된 밥의 퍼블릭키로 풀어서 볼 수 있다.
즉, Symmetric key를 공개키로 암호화해서 밥에게 보내면 밥이 이걸 받아서 풀어보면 되는것이다.
공개키(비밀키(메시지)) = 메시지 가 성립해야한다
A. 전자서명이 바로 이 내용이다. 즉 이건 내가 만든게 맞다고 선언하는 것
B. 이는 암호화가 목적이 아니라 그냥 내가 공개키로 만들었다고 하는데에 목적이 있다. 즉 이 코드는 내 공개키로만, 내 비밀키로 만든거다 라는 뜻이다.
비밀키(공개키(메시지) = 메시지
A. 이건 암호화이다. 공개키로 암호화된 메시지는 전적으로 비밀키를 가진 사람만이 풀 수 있다.
공개키로부터 비밀키를 유도해낼 수 없어야한다.
이를 RSA라고 한다.
공개키와 비밀키는 모듈러 연산을 활용해서 만들어진다.
mod 연산 FACTS
[(a mod n) + (b mod n)] mod n = (a+b) mod n
[(a mod n) - (b mod n)] mod n = (a-b) mod n
[(a mod n) * (b mod n)] mod n = (a*b) mod n
이를 정리하면 다음과 같은 식이 나온다.
우선 메시지를 암호화, 즉 메시지를 숫자로 바꿔서 암호화하는것부터 시작이다,
가령 m = 10010001 (145)를 암호화 한다고 하면,
즉, RSA 방식은 거대한수를 소인수분해하기 어렵다는점을 들어서 암호화를 하고 있는것이다. N은 두 소수의 곱인데 이 두 소수가 누군지 알면 나눠서 나머지도 다 알아낼만하긴한데, n이 엄청 커서 pq를 구할 수가 없다.
이제 암호화를 해보면
C = m^e mod n
이를 복호화 하려면
M = c ^d mod n
이 된다
밥의 공개키로 대칭키를 암호화해서 밥이 비밀키로 나눠서 가지고
이제 서로 대칭키를 가지고 있으니깐 둘이 주고받을 수 있다.
이을 세션키라고 한다, (대칭키를 비대칭키 방식으로 나눠가지는 것)
TLS도 이런 방식을 사용한다.
Diffie Hellman Key Exchange Algorithm이라고 한다.
다만 DES가 RSA보다 100배는 빠르다. 따라서 한번 이렇게 Session Key를 주고받으면 그 다음부터는 Session Key만 가지고 통신하면 된다.
다만 이는 언제까지나 기밀성 부분에서의 암호화이다. 만약 트루디가 Alice인척하고 밥에게 공개키로 보내면 밥은 확인절차없이는 그대로 속아버릴것이다.
상대가 직접 자신이 엘리스라고 밝힘
A. 하지만 이 방법은 서로가 안보여서 트루디도 똑같이 보낼 수 있다.
IP주소로 확인
A. 이 또한 트루디가 Alice의 IP주소를 가지고 보낼 수 있어서 안된다 (Spoofing)
Password로 확인
A. 공격자는 평문 패스워드를 가로채서 자신이 가로채서 들어갈 수 있다.
암호화된 Password를 사용
A. 이 암호화 매커니즘을 모르면 방법이 없지만
B. 암호화된 코드 자체를 받아서 그걸 밥한테 보내버리면 뚫릴 수도 있다.
딱 한번 쓰이는 nonce를 이용해서 쓴다
A. 즉 밥이 R을 보내면 이를 대칭키를 이용해서 앨리스가 다시 밥에게 보내고 R은 이를 해독해서 서로 확인한다
B. 이는 시간이 지나면 초기화되기 때문에 훔쳐도 의미가 없다
공개키로 Authentication은 못하는걸까?
A. 서로가 공개키와 비밀키로 공유했다는 가정 하에
B. 앨리스는 자신의 비밀키로 암호화를 한 메시지를 밥에게 보내고
C. 밥은 이에 엘리스에게 공개키를 공유받아서 이걸로 상대를 인증한다.
위험
1. 이 방식은 man in the middle이 이를 가로채서 검증을 방해할 수있다.
2. 중간에서 자기가 앨리스인척, 밥인척 앨리스와 밥에게 각각 메시지를 보내서 연결한다.
3. 이러면 밥과 앨리스는 트루디의 공개키를 사용해서 암호화를 해서 트루디한테 보내버리고 이러면 트루디는 둘다 확인해버릴 수 있다.
4. 그리고 들키지 않으려고 트루디는 이를 서로 상대방에게 보내버린다.
5. 이러면 당한놈들은 당한지도 모른다
이는 즉, 공개키에 대한 확인이 덜 되어서 그렇다, 즉 내가 쓰는 이 공개키가 진짜 누구의 공개키인지 확인할 수 있는 확신이 필요하다. 이를 인증해주는 기관이 있다.
공개키를 인증하는 기관 CA가 필요하다
기관에서는 공개키, 개인정보를 하나의 파일로 묶어서 기관의 비밀키로 암호화를 해서 보관한다. 이 기관이 비밀키로 암호화한 파일안에는 밥의 공개키가 들어있다 이 인증기관의 공개키는 알려져 있기 때문에 이는 또 풀 수 있다.
이를 이제 검증할 때 공개키로 기관비밀파일을 열어봐서 열리면 맞구나 하고 넘어가면 된다.
메시지가 기존의 메시지와 같다는것을 확인해야만 한다.
밥이 자신의 비밀키로 암호화를 했는데, 이 암호화된 코드가 공개가 되고, 원본 메시지 역시 공개가 된다. 이를 공개키로 풀어봐서 원본메시지와 일치하면 맞다고 볼 수 있다.
즉, 엘리스가 평문, 암호화문 두개를 가지고 있고 이를 밥의 공개키로 풀었는데 풀려서 일치한다? 이러면 이건 밥이 만든 무결성이 보장된 메시지가 된다. 즉 한번에 Authentication, Integrity가 보장되는것이다.
메시지를 그대로 다 보내서 확인하는건 너무 크기도 하고, 보안성이 없다. 따라서 Hash Fucntion을 이용해서 메시지를 줄일 수 있다.
Hash Function에는 아무리 큰 수를 넣어도 정해진 크기만큼만 나오게 된다. 이렇게 해서 나온 메시지는 다시 역산해서 추적해낼 수 없어야한다.
즉, 출력물로 원문을 추론해낼 수 없고 똑 같은 해시 펑션이 만들어지게 해선 안된다
해시는 조금 차이난다고 결과물도 조금차이나고 그런 방식이 아니라 아예 다른 랜덤하게 나온다.
반면 체크섬은 16비트라서 내용이 달라도 똑같은 결과물이 나올 수 있다.
밥이 자신의 메시지를 헤시펑션 한 후에 프라이빗 키로 암호화해서 원본메시지와 함께 보낸다.
그러면 엘리스가 이를 받아서 해시펑션 해보고, 복호화해서 값을 확인 할 수 있다.
해시펑션은 양쪽이 같은걸 쓴다는게 전재가 되어야 한다.
그리고 사실 위와 같은 방식이면 메시지가 노출되어서 기밀성은 없다. 이 방식은 메시지를 헤시평션하고 자기 비밀키로 암호화한다. 그리고 원본메시지랑 같이 보낸다. 즉 기밀성에는 별 관심이 없다
이 모든 과정을 합친 Secure Email을 볼 수 있다.
엘리스가 자신의 비밀키 ks를 생성하고, message를 비밀키로 암호화해서 ks(m)를 만들어낸다. 그리고 이 ks는 밥의 공개키로 암호화된다.
이 두가지 정보 ks(m), kb(ks)를 밥에게 보낸다.
밥은 이를 받아서 해제해본다.
m이 얻어진다.
다만 이 과정은 Authentication, Intergrity가 빠져있다.
따라서 다음과 같은 과정으로 처리를 한다.
message m을 해시펑션으로 처리하고, 그 다음 엘리스의 비밀키로 암호화해서 ka(h(m))을 얻어낸다.
이를 메시지와 함께 다시 한 번 암호화한다. 이때는 ks, symmetric key를 이용한다.
그리고 ks는 밥의 공개키로 암호화한다.
위 내용을 전부 밥한테 보내고, 밥은 이를 하나씩 열어본다.
끝
TLS는 키를 나눠가지는 과정
Handshake : 키를 교환하기 위한 정보교환가정
Key derivation : 키를 만들어내기 위한 유도과정
Data transfer : 데이터 전송
Connection closure : 연결 끝
TLS는 Payload부분만 암호화한다.
IPSEC은 IP, TCP를 전부 암호화해버린다. 그리고 IPSEC이 앞에다가 암호화가 되지 않은 목적지주소, 포트같은게 들어있는 임의의 헤더를 붙여준다.
IPSEC을 하게되면 이게 뭔지 아무것도 모르고 헤더 정보만 볼 수 밖에 없다. 이는 TLS보다 훨씬 강력한 암호화이다.
이 IPSEC는 VPN에서 사용된다.
VPN은 내부망에 외부망 사용자를 끼워주는것이다.
인터넷을 통해서 외부게이트웨이로 바로 연결하면 보안상 위험이 존재한다. 따라서 스위치에서 외부사용자까지 바로 연결해줄 수 있는 선이 필요한데 이건 물리적으로는 어렵다. 따라서 가상, 즉 논리적으로 터널링 소프트웨어를 만들어서 전부 다 IpSEC으로 감싸버리고 헤더를 만들어서 해당 목표지점에 던저버리는것이다.