학사 나부랭이

사이버 테러와 정보전 - 최윤성 본문

塵箱/학점을 위한 정리

사이버 테러와 정보전 - 최윤성

태양왕 해킹 (14세) 2021. 4. 15. 01:41

해시 함수에 대해 설명

MD 알고리즘, SHA 알고리즘, CRC 알고리즘 등이 있으며 다음과 같은 특징을 가진다.

 

해시 함수의 특징

1. 암호는 정보를 숨기기 위해 사용되지만 해시는 정보의 위/변조(무결성)을 확인하기 위해 사용된다.

2. 입력값의 길이가 어떻든 결괏값(해시값)은 항상 같은 길이를 가진다.

3. 계산하기 용이(빠른 처리속도)하고 확장성이 좋아야 한다.

A. 일방향성-해시값으로 입력값을 역산(복호화)할 수 없다.

B. 충돌 회피성-입력값이 조금이라도 바뀌면 결과는 항상 달라야하고 동일한 해시값을 갖는 다른 입력값을 유추할 수 없어야 한다,

 

해시 함수의 역할

1. 해시 인덱스

데이터 베이스의 탐색을 위한 인덱스나 테이블의 파티셔닝 용도로 사용된다. 키워드를 그 해시값과 일치하는 인덱스를 찾는 기법인데 범위를 검색하는데에는 오히려 비효율적이다.

2. 데이터 무결성 검증

입력값이 조금만 달라도 해시값이 전혀 달라지므로 데이터 무결성을 확인하기 위한 도구로 사용된다.

3. 블록체인

거래를 기록한 데이터 블록을 체인처럼 연결시키는데 이 체인을 구현하는데 쓰이며 블록의 무결성 검증에도 쓰인다. 비트코인은 해시 캐시라 불리는 해시 문제를 푸는 작업 증명이라는 방법으로 블록 하나를 생성하고 이전 블록과 연결하는데 이 과정에서 비트코인이라는 암호화폐가 발행된다.

4. 패스워드 암호화

리눅스 시스템의 shadow 파일에 있는 각 계정의 비밀번호를 암호화하는데 쓰인다.

 

암호학적으로 안전한 해시 함수의 필수요소

1. 프리이미지 저항성, 역상 저항성, 약일방향성

 해시값을 알고 있을 때(탈취 했을 때), 입력값을 역산 할 수 없어야 한다.

(프리이미지 공격: h(M) = C인 C가 주어졌을때, h(M') = C인 M'를 찾아내자! - 원본 추측)

 

2. 제2 프리이미지 저항성, 약한 충돌 내성, 강일방향성

 해시값과 입력값을 알고 있을 때, 해시값이 같은 다른 입력값을 찾을 수 없어야 한다.

(제2 프리이미지 공격: h(M) = C인 C와 M이 주어졌을때, h(M') = C인 M'(!= M)를 찾아내자! - 무결성 오염)

 

3. 충돌 저항성

 아무 것도 모를 때, 해시값이 같은 여러 입력값을 찾을 수 없어야 한다.

(충돌 공격: 아무 것도 없을때, h(M') = h(M)인 M'(!= M)과 M을 찾아내자! - 해시 함수 논파)

 

운영모드

평문을 일정한 크기의 블록으로 나누어서 어떻게 암호화할지 정하는게 운영모드이다. 여기에는 ECB, CBC, CFB, OFB가 있다.

같은 내용의 블록이라도 결과를 다르게 하고 싶어서 사용한다.

IV: 초기화 백터이며 첫 블록을 암호화/복호화할 때 사용되는 값이며 암호화할 때마다 다른 값을 사용해야 한다. 송수신자 모두 알고 있어야 하고 제삼자가 예측 불가해야 한다.

패딩: 평문이 마지막 블록을 못 채워서  정상적으로 암호화되지 못하게 되는 일을 막기 위해 부족한 길이를 채우는 임의의 비트이다.

 

Electronic CodeBook

같은 입력값이면 같은 결괏값이 나온다.

블록 간 독립적이라 병렬적으로 암/복호화 가능하고 오류가 다른 블록에 영향을 주지 않는다.

경우의 수가 많으면 역산을 통해 암호화 키를 유추할 수 있다.

그래서 같은 블록이 나타날 가능성이 없을 정도의 짧은 평문을 암호화할 때 쓰인다.

 

같은 내용의 블록이라도 결과를 다르게 하고 싶어서 다른 모드들이 나왔다.

 

Cipher Block Chaining

 

가장 널리 사용되는 운영모드이다.

평문 블록, 초기화 벡터, 키 중 하나라도 다르면 결과가 달라진다.

평문 블록이 같더라도 이전 암호 블록과 XOR해서 결과는 달라진다.

초기화 벡터가 같으면 출력 결과가 항상 같다.

암호화: Mi 블록 암호화하는데 Ci-1 블록이 필요해서 병렬화 불가능하다.

복호화: C1~n 블록 병렬로 복호화 가능하며 XOR에 필요한 건 Ci이기에 병렬화 가능하다. ???

암호화 중 Mi에서 1비트 오류: Ci부터 끝까지 여러 비트 영향을 준다. = 오류 전파

복호화 중 Ci에서 1비트 오류: Mi에 여러 비트 영향을 주고 Mi+11비트의 영향을 준다.

 

Message Authentication Code

CBC를 이용한 메시지 인증 코드

송신자가 평문과 CBC모드로 암호화한 마지막 Cn을 보내고 수신자가 그 평문을 암호화한 후의 마지막 암호문 Cn' == Cn이면 무결성을 입증할 수 있다. 만약 여기서 오류가 있으면 CnCn’의 값은 상이하다.

 

Cipher FeedBack mode

초기화 벡터를 암호화시키고 XOR로 변형시켜서 암호화 함수에 들어가는 문장은 보정된 문장이다. , 평문 블록에 패딩을 할 필요가 없다.

블록 암호를 이용하는 운영 모드이지만 스트림 암호처럼 실시간으로 사용할 수 있다.

암호화와 복호화가 같은 함수를 사용한다.

암호화: Mi 블록 암호화하는데 Ci-1 블록이 필요해서 병렬화는 불가능하다.

복호화: C1~n 블록 병렬로 복호화 가능하며 XOR에 필요한 건 Ci이기에 병렬화 가능하다. ???

암호화 중 Mi에서 1비트 오류: Ci1비트 영향, Ci+1부터 끝까지 여러 비트 영향을 준다.

복호화 중 Ci에서 1비트 오류: Mi1비트 영향, Mi+1부터 끝까지 여러 비트 영향을 준다.

 

Output FeedBack mode

Z가 계속 바뀜으로 ECB의 입력값이 같을 때 결괏값도 같은 연관성 단점을 개선했다.

암호화와 복호화가 같은 함수를 사용한다.

다른 평문 블록은 서로 다른 키로 XOR되어 스트림 암호 방식처럼 사용할 수도 있다.

독립적인 키스트림을 생성한다.

블록이 독립적??? 오류 전파가 안 되어서 암호문의 비트 손실이나 삽입되어도 알아채기 어렵다.

암호화 중 Mi에서 1비트 오류: Ci1비트의 영향을 준다.

복호화 중 Ci에서 1비트 오류: Mi1비트의 영향을 준다. = 오류 전파 제거

암호화: Mi 블록 암호화 하는데 Zi-1 블록이 필요해서 병렬화는 불가능하다.

복호화: Zi가 순차적으로 암호화되어서 병렬화는 불가능하다. ???

 

CounTeR

초기화 벡터를 카운터처럼 증가시키며 암호화한다.

다른 평문 블록은 서로 다른 키로 XOR되어 스트림 암호처럼 사용할 수 있다.

독립적인 키스트림이 블록 단위로 생성되고 피드백을 사용하지 않는다.

키스트림 블록을 계산할 때마다 다른 값을 생성하는 카운터가 블록 암호에 입력된다.

암호화와 복호화가 같은 함수를 사용한다.

또한 모든 요소가 독립적이라 암/복호화 병렬화 가능하다. 이로 인해 속도가 빨라 네트워크 라우터 등 고속 구현에 적합하다.

각각 블록이 독립적이라 오류 전파가 안 되어서 암호문의 비트 손실이나 삽입되어도 알아채기 어렵다.

 

대칭키 암호

암호화와 복호화에 사용되는 암호키가 동일한 암호화 기법이다.

위에서 나온 데이터를 변환하는 방식에 따라 블록 암호와 스트림 암호로 구분된다.

 

1. 블록 암호

 고정된 블록 단위로 암/복호화 연산을 수행한다. DES, AES, SEED 등이 있다. 암호화할 때 사용되는 방식에 따라 파이스텔 블록 구조와 SPN 블록 구조로 구분된다.

파이스텔: 입력되는 평문 블록을 좌우 블록으로 분할하고 왼쪽 블록을 파이스텔 함수(라운드 함수의 일종)를 적용하여 출력된 결과를 오른쪽 블록에 적용하는 과정을 반복적으로 수행한다. DES, SEED 등이 있다.

파이스텔 블록 구조인 DES

DES의 파이스텔 함수와 S박스 테이블

SPN: 분할하지 않고 전체 블록에 적용한다. 라운드 함수의 역함수를 구해야하지만 컴퓨팅 속도가 발전해서 극복할 수 있게 되었다. AES, IDEA, ARIA, SHARK 등이 있다.

SPN 블록 구조인 AES

2. 스트림 암호

이진화된 평문 스트림과 이진 키 스트림을 비트 단위로 XOR해 암호화하는 방식이다. 하드웨어 구현이 간편하고 속도가 빠르기에 무선 통신 환경에서 데이터 보호에 주로 사용된다. RC4가 대표적이며 GSM 무선통신 보안을 위한 표준인 A5/1~3 등이 있다.

 이러한 대칭키 암호 방식은 암호화 연산 속도가 빨라서 효율적인 암호 시스템을 구축할 수 있고 키를 가진 사람끼리만 통신이 가능해서 안전하다. 그러나 암호키를 전달할 때 어떻게 안전하게 줄 것인가와 암호키를 안전하게 줄 수 있으면 그 방식으로 평문을 주는게 좋지 않을까라는 딜레마가 생긴다. 마지막으로 키가 같으면 다른 통신에 비정상적으로 접근할 수 있으므로 많은 키를 관리해야 한다.

 

공개키 암호

 대칭키 암호의 키 전달 취약점을 해결하기 위해 탄생했다. 공개키 암호에서 키는 한 쌍 존재하며 그중 하나는 사용자만 가지는 비밀키(개인키)이고 다른 하나는 공용 네트워크 등에 올려 누구나 쓸 수 있는 공개키이다. 이러한 공개키 암호에는 DH, DSA, RSA 등이 있다.

 

 여기서 KeB(B의 공개키)KdB(B의 비밀키)를 유추하는 것은 수학적으로 어렵다. 예를 들어

n = p * q (, pq는 소수) 여기서 n을 공개해도 pq를 유추하는게 어렵고

n을 소인수 분해해서 나온 pq를 구하는 것이 어렵기에 n을 공개키로, pq를 개인키로 한다.

 

또한 RSA 방식에서

두 소수 pq를 준비해서

Φ(n) = 1~n n과 서로소인 수의 개수 = (p 1)(q 1)

역시 pq를 알아야 빠르게 구할 수 있고

gcd(Ke, Φ(n)) = 1

Φ(n)과 최대공약수가 1Ke를 선택해서

Ke * Kd 1 mod Φ(n)

Φ(n)으로 나누었을 때 나머지가 1인 비밀키 Kd를 선택하는데 여기서 비밀키는 공개키의 역원으로서 연관성이 있지만 외부인의 경우 Φ(n)를 구하는데 시간이 오래 걸린다.

(A B mod nABn으로 나눌 때 나머지가 같다는 뜻이다.)

여기서 구해진 (Ke, n)이 공개키(공개 암호화 키)이며 Kd가 비밀키(비밀 복호화 키)이다.

그 후 공개키는 공용 네트워크 등으로 공개하고 보내려는 평문을 송신자가

암호문 ≡ 평문^(수신자의 Ke) mod n으로 암호화하고

수신자가 받은 암호문 C

평문 ≡ 암호문^(수신자의 Kd) mod n으로 복호화한다.

 아래는 위 과정의 증명이다.

Ke * Kd = Φ(n) * t() + 1 (위의 1 mod Φ(n)에서 발췌)

평문 ≡ 평문^(수신자의 KeKd) mod n (암호화 + 복호화) gcd(평문, n) = 1 == 평문과 n은 서로소

≡ 평문^(Φ(n) * t + 1) mod n(오일러 정리에 의해)

≡ 평문^(Φ(n) * t) * 평문 mod n ≡ (평문^t)^Φ(n) * 평문 mod n 1^t 평문 mod n

≡ 평문 mod n

 

 이렇게 통신망에 공개되어있는 공개키 KeA, ... ,KeD로 인해 사람이 많아도 사용자는 자신의 비밀키와 공개키만 관리하면 되고 키 전달에 대한 문제를 해결했지만 공개키와 비밀키에 관련성이 있어서 안전하게 보호하기 위해 키 길이가 커지며 그로 인해 암/복호화에 복잡한 수학연산을 수행해서 속도가 느리다. 그래서 대칭키 암호와 혼용해서 대칭키의 키를 전달하는데

키의 경우 크기가 크지 않으므로 공개키 방식으로 암호화를 해도 시간이 얼마 걸리지 않고, 이렇게 암호화해서 전송하면 키를 전달해주는 딜레마도 해결할 수 있다. 그리고 상대적으로 크기가 큰 데이터는 속도를 위해 대칭키 방식으로 암호화 및 전달된다.

 

공개키 서명

 공개키 암호와 다르게 개인키로 암호화를 하고 공개키로 복호화를 한다.

이로 인해 B의 개인키를 가지고 있는 B만이 암호문을 만들 수 있고 대신 B의 공개키로 누구나 복호화가 가능해서 전달받은 정보가 B가 보냈다는 것을 검증할 수 있다.

 

공개키 기반 구조(PKI)

 특정 사용자의 개인키와 공개키의 생성방식과 배포방식, 관리, 마지막으로 KdA인 공개키가 A의 공개키라는 것을 보장하기 위해 디지털 인증서를 도입하게 되었고 이를 활용하는 소프트웨어, 하드웨어, 정책, 제도, 사용자 등을 모두 공개키 기반 구조라고 한다.

위의 인증서는 개인키와 쌍으로 존재하고 이 인증서와 개인키가 함께 동봉된 것이 공인인증서이다. 위의 인증기관에서 개인키와 인증서를 쌍으로 생성하여 발급하고 검증은 그 두 개의 짝이 맞는가 확인하여 검증한다.

'塵箱 > 학점을 위한 정리' 카테고리의 다른 글

서버 시스템 관리 - 임주혁  (0) 2021.04.30
모바일 프로그래밍 - 임주혁  (0) 2021.04.13
Comments