본문 바로가기
  • 시 쓰는 개발자
CS 개념/컴퓨터 보안

컴퓨터 보안 (10) - Cryptography1

by poetDeveloper 2024. 6. 8.

시험공부하며 러프하게 정리한 내용이니, 가볍게 참고만 하시길



🥕9장 Cryptography1

>> 기본 용어
- 엘리스 송신, 밥이 수신
- 이브는 소극적 공격자(도청만)
- 멜로리는 적극적 공격자(메세지 악의적 수정 공격)
- C = E_k(P) = E(k, P)
- P = D_k(C) = D(k, C)
- 키는 이진화된 숫자로 변경해서 사용한다.

>> 암호학의 도구들
- 일방향 해시 : 문서의 기밀성이 아닌, 무결성을 점검
- 메세지 인증 코드 (MAC) : 메세지가 원했던 상대로부터 온 것임을 확인하는 코드
- 전자 서명 : 원래 상대인척 거짓행세, 변경, 부인(repudiation)같은 위협을 방지하는 기술
repudiation - 통신 사실을 나중에 아니라고 하는 것
- 슈도 난수 생성기(PRNG) : 무작위 수열을 생성하는 알고리즘

>> 보안위혐 - 위협받는특성 - 암호기술 (중요!)
도청 - 기밀성 위험
→ 대칭, 비대칭 암호로 보안
메세지 변경 - 무결성 위험
→ 대칭, 비대칭, hash, MAC, 전자서명으로 보안
위장 - 인증 위험
→ 대칭, 비대칭, MAC, 전자서명으로 보안
부인 - 부인 봉쇄 위험
→ 전자서명으로 보안

>> 스테가노그래피 : 메세지 존재 자체를 숨김
- 메세지 내용은 안숨기는거라, 메세지 어떻게 숨겼는지만 알게 되면 내용은 쉽게 노출됨
ex) 디지털 워터마킹 : 웹툰에 사용자 id 숨겨놓음. 무단배포시 이걸 보고 누가 배포했는지 알 수 있음.

>> 암호화 보안 상식 (100% 시험)
1. 비밀 암호 알고리즘을 사용하지 말 것
1) 언젠가는 반드시 폭로된다.
2) 강한 암호 알고리즘을 만드는 건 어렵다.
3) 무조건 숨긴다고만 해서 안전한게 아님. 매우 어리석은 행위

2. 약한 암호는 암호 없는 것 보다 위험하다.
1) 강도 낮은 암호 해도 암호화 여부 자체로 안심하는 경향있음
2) 그럴바에 암호 없는게 낫다.

3. 어떤 암호라도 언젠가는 반드시 해독됨
1) 모든 키를 하나도 빠짐없이 시도하면 언젠가는 반드시 해독됨.
2) 암호문 해독까지 걸리는 시간 고려, 평문의 가치와 암호수준의 균형 필요.

4.  암호는 보안의 아주 작은 부분
1) 사회공학적인 공겨 방법은 암호 강도와 무관하다.
2) 보안 시스템에서 가장 약한 링크는 암호가 아니라 사람이다.

>> 시저암호
- 알파벳을 일정한 크기만큼 평행이동 해서 암호화
- 전사공격(브루트포스) 하면 25번만에 해독됨.

>> 단일치환암호 (simple substitution cipher)
- 하나의 문자를 다른 문자로 치환. 송수신자는 치환 표 공유해서 암/복호화 하면 됨
- 이론상 단일치환암호의 키 개수는 26! 개 라서 전사공격으로는 해독 어려움.
- 하지만 단어 빈도수는 안바뀌므로 빈도수 높거나 낮은 문자들 끼워맞추면서 해독될 수 있음. (빈도수 낮은 것도 단서가 됨)
- 단락 시작부분이나, 처음과 끝이 어디인지 아는 것도 단서가 될 수 있음.
- 같은 문자가 연속으로 나타나는 것도 단서
- 그래서 오히려 암호문이 길수록 해독이 용이하고, 해독 속도도 점점 빨라짐.

>> 다중치환암호
- 빈도분석 못하게 대응을 다르게 하면 됨
ex) 두글자씩 암호화
ex) 위치마다 다르게 대응시키기 : 애니그마 기계 → 회전하며 대응되는 게 달라서 치환이 계속 달라짐
- 애니그마는 처음에 상용으로 쓰기도 하다가 군용으로 개량됨. 로터의 설치 각도가 key가 됨

>> 암호와 키의 분리
- 암호 알고리즘에는 "변경 가능한 부분"이 반드시 포함된다. → key가 이것에 해당
- key는 매번 바뀌고, 알고리즘은 재사용함

>> 비트열 암호 (대칭암호)
- 부호화(encoding) : 문자열 → 비트열로 변환
- 비트끼리 XOR 시키는데 이게 0, 1 분포가 동일해서 모든 메세지가 나올 수 있어서 안전함.

>> 일회용 패드 (대칭암호) : 브루트포스로 키공간 다 탐색해도 해독 절대 불가능한 완벽한 암호
- 평문에 랜덤 비트열 key를 XOR하는 단순한 암호임.
- 장점
1. 랜덤 비트열이라 암호문이 1이라고 해서 원래 0이었는지 1이었는지 알 수 없음.
2. 랜덤키라서 해독이 절대 불가능. 암호문 과정에서 모든 64bit 패턴이 등장. 복호화해도 그게 맞는 평문인지 아닌지 판단을 못함.
- 단점
키 재사용 : 키를 절대 재사용하면 안됨. Two time pad 해버리면 (K⊕m1)⊕(K⊕m2) 해서 m1⊕m2를 알아낼 수 있음.
키 생성 : 그래서 실제 난수를 대량으로 생성할 필요가 있음.
키 동기화 : 키가 랜덤 비트열이지만, 메세지 길이랑은 같아야함. 메세지 길이 8bit짜리 암호화하면 키도 8bit짜리 키 사용.
키 배송 : 키를 안전하게 보낼 방법 있다면 암호화 없이 평문을 그렇게 보내는 거랑 다를 바가 없음.
키 보존 : 키를 안전하게 보관할 수 있으면 그냥 평문을 그렇게 보관하면 됨.

>> 블록암호
- 블록단위로 잘라서 암호화하는 기법
- 128bit 암호화했으면 복호화도 128bit 단위임
- DES, 3DES, AES, ECB, CBC, CTR

- 페이스텔 구조(DES류) , SPN 구조(AES류)로 나뉨

>> 스트림 암호 : 블록보다 자유롭게 암호화하는 기법
- 데이터의 스트림을 순차적으로 처리
- 1bit, 8bit, 32bit 등 암호화 단위를 자유롭게 가능

>> DES (대칭암호)
- 약한암호, 절대 쓰지 말것.
- 64bit 블록
- 56bit 키
- 페이스텔 네트워크 : DES외의 다른 블록암호 채용, 여러 round로 구성(DES는 16round)
라운드함수 F에는 어떤 함수도 사용 가능, 암/복호화가 완전히 동일한 구조임

- DES는 16라운드로 구성됨

>> 3DES
- 64bit 블록은 DES랑 동일

- DES가 16라운드였으니, 3DES는 48라운드임
- DES는 56bit 키가 너무 작아서, 서로 다른 키 3개를 겹친 알고리즘.
- 암호화 : 암복암 수행함
- 복호화 : 복암복 수행함
- 호환성 유지 가능. 3DES용 하드웨어로 DES사용도 가능함.
- 은행 등에서 현재도 사용함, 처리 속도는 느리고, 그렇게 안전하진 않음. 우리나라 표준 X. 우리나라는 SEED, ARIA 사용함

>> AES (대칭암호)
- DES를 대체함. 경쟁하며 AES 공모전 열었고, 제한없이 무료로 이용

- AES도 당연히 블록암호임
- 128bit 블록 고정(16바이트 단위)
- 128bit, 196bit, 256bit 키 가능.

>> ECB 모드 (electric codebook)
- 평문 블록별로 암호화 → 패턴을 알기가 쉬움
- 그림을 암호화 해도 비슷한 그림이 나옴.
- 블록단위로 악의적인 변경이 쉬움.
ex) 블록1 : 나, 블록2 : 친구, 블록3 : 송금액
암호문 블록1, 2의 위치만 서로 바꿔도 내가 친구한테 돈보내는걸, 친구가 나에게 보내는거로 조작 가능.


>> CBC 모드 (cipher block chaining)
- 앞서 암호화된 블록을 뒤에도 연결해서 앞에 있는 블록들에게도 영향을 받는 것.
- 초기화 벡터 : 최초의 평문 블록은 앞선 암호화가 없으니까 초기화벡터랑 XOR해서 암호화함. "앞선 암호화 블록" 역할을 하게 되는 것.
- 암호화
평문1을 초기화벡터와 xor → 암호문1 생성
암호문1을 평문2와 xor → 암호문2 생성
암호문2를 평문3과 xor → 암호문3 생성 (반복)

- 복호화
암호문 블록 자체를 전달하는 거임. 암호문3은 암호문2랑 평문3이랑 XOR한거니까
암호문3 = 암호문2 xor 평문3
암호문2 = 암호문1 xor 평문2
암호문1 = IV xor 평문1

- 특징
1) 블록 순차적으로 암호화 가능. 병렬처리 못하므로 오래걸림. 암호문3 만들려면 평문블록 1, 2, 3이 준비되어야함.
순차적으로 하니까 앞에서 한번 깨지면 뒤에까지 쭉 영향을 받음. 그래서 초기화벡터 공격하면 그 뒤 블록 다 영향받음.
2) 앞의 암호문가지고 xor 하는거라 평문1, 2가 같은 값이어도 암호문1, 암호문2가 같은 건 아님.
3) ECB의 단점이 CBC에는 없음.

- 패딩 오라클 공격 : 블록암호 패딩 이용한 공격.
패딩 내용 조금씩 바꿔서 암호문을 여러차례 보내서, 수신자가 올바로 복호화 못하면 오류 관찰해서 평문 정보 얻어냄. 
패딩 쓰는 모든 모드에 적용가능

>> CTR 모드
- 구현이 간단하다.
- 1씩 증가하는 카운터를 암호화해서 key 스트림으로 사용함 (암호때마다 다른 값을 키로 사용)
- 암/복호화가 완전히 같은 구조임.
- 암호화 위치가 다르고, CTR값도 달라서 병렬처리 가능해서 빠르게 작업가능.
- 평문이 같아도 CTR값이 달라서 암호문은 다르게 나옴.
- 시작할 때 랜덤으로 시작해서, 1이나 2 등 규칙적인 숫자 더해가면서 key값 바꿔감.