1 대칭키(Symmetric key) 암호화
1.1 대칭키 암호의 개념
- 대칭키 암호는 관용 암호, 비밀키 암호, 단일키 암호라고도 한다.
- 암호화하는 키와 복호화하는 키가 같고 암호의 안전성은 키의 비밀 유지에 의존된다.
- 송신자와 수신자는 안전한 채널을 통해서 암호 키가 먼저 교환되어야 한다.
- 블록 암호(Block cipher), 스트림 암호(Stream cipher) 방식이 있다.
- 계산 속도가 빠르지만, 안전한 인증이 힘들고 전자 서명이 불가능하다.
1.2 대칭 암호 원리
1.2.1 대칭 암호 구조의 요소
- 평문 (Plaintext)
원문이나 데이터로서 알고리즘의 입력으로 이용된다.
- 암호 알고리즘 (Encryption algorithm)
암호 알고리즘은 입력으로 들어온 원문을 다양한 방법으로 치환하고 변환한다.
- 비밀키 (Secret key)
비밀키도 알고리즘의 한 입력으로 이용하며 알고리즘에 의해서 정확한 대체와 전환이 이루어진다.
- 암호문 (Ciphertext)
출력으로 나오는 암호화된 메시지로 평문과 비밀키에 따라서 달라진다. 주어진 메시지에 의해 서로 다른 키를 사용하면 두 개의 암호문은 서로 다르게 출력된다.
- 복호 알고리즘 (Decryption algorithm)
알고리즘을 역으로 수행하는 것과 같다. 암호문에 알고리즘과 암호에 사용했던 동일한 키를 적용하여 원문을 복구해내는 것이다
1.2.2 암호
- 평문을 암호문으로 전환하는데 사용되는 연산 유형으로 모든 암호 알고리즘은 두 가지 일반적 원리를 따른다.
s 대체(substitution)
평문의 각 요소(비트, 문자, 비트블록, 문자 블록)를 다른 요소로 바꾸는 것을 의미한다.
s 치환(transposition)
요소의 순서를 재조정하는 것을 의미한다.
- 송신자와 수신자 양측이 동일한 키를 사용하면 그 시스템을 대칭 암호, 단일키 암호, 비밀키 암호, 관용 암호라고 한다. 만일, 송신자와 수신자 양측이 서로 다른 키를 사용하면 그 시스템을 비대칭 암호, 쌍키 암호 혹은 공개키 암호라고 한다.
- 블록암호는 한 번에 한 블록씩 입력하여 처리하고 한 블록씩 출력한다. 스트림 암호는 입력 요소를 연속적으로 처리하여 입력된 요소가 끝날 때까지 한 번에 한 요소씩 출력한다.
1.2.3 Feistel 암호 구조
- IBM의 Horst Feistel은 1973년 최초의 암호 시스템을 개발하였다.
- Feistel 암호의 특성
s 2번 이상의 기본 대치 및 순환 치환을 연속적으로 수행한다.
s 보통 암호 알고리즘에서 Feistel 연산은 짝수 라운드를 적용한다.
s 키를 각 라운드에서 사용되는 서브키로 변환하는 키 스케줄 알고리즘을 활용한다.
s 라운드 함수에 관계없이 역변환이 가능하다. 즉, 암호화와 복호화 과정이 같다.
s 하드웨어 및 소프트웨어로 구현이 용이하며 알고리즘의 수행 속도가 빠르다.
1.3 블록 암호 (Block cipher)
- 블록 암호는 고정된 크기의 블록 평문을 입력하여 동일한 크기의 블록 암호문을 생성해낸다.
- DES, 3DES, AES의 블록 암호가 있다.
1.3.1 DES (Data Encryption Standard)
- DES는 블록 암호의 일종으로 미국표준기술연구소[1]에서 공표하였다.
- 데이터를 64비트 단위의 블록으로 분할 후, 순열, XOR [2],회전 등으로 변경한다.
- 56비트의 키를 이용하는 대칭키 암호 시스템이다.
- Feistel 네트워크의 변형된 형태로, 라운드 수는 16이다.
- 56비트의 원래 키로부터 16개의 서브 키를 생성하고 그 서브 키를 각 라운드에서 사용한다.
1.3.1.1 DES의 기본 연산
- 순환: 비트를 왼쪽이나 오른쪽으로 회전한다.
s 좌순환: 가장 왼쪽의 비트는 가장 오른쪽으로 이동하며 나머지 비트들은 왼쪽으로 한 비트씩 이동한다.
- 순열: 비트 레벨의 치환이다.
1.3.1.2 DES 암호화
- 64비트 평문에 있는 각 비트의 위치를 바꾼다 즉, 초기 치환을 한다.
- 그 후, Round 1~Round 16에서 서로 다른 서브 키를 사용하며 64비트 입력을 32비트로 나누어 위치를 교체한다.
- 역 초기 치환, 즉 최종 치환을 한다. 이 때 출력인 64비트의 각 비트 위치를 바꾼다.
1.3.1.3 DES 함수
- DES 함수란 라운드 함수에 사용된 f (RI-1, KI)를 가리킨다.
- DES 함수는 32비트 출력 값을 산출하기 위하여 가장 오른쪽의 32비트(RI-1)에 48비트 키를 적용한다.
- 확장 P-박스 (Expansion P-box)
RI-1는 32비트 입력 값이고, KI는 48비트 라운드 키이기 때문에 우선 32비트 RI-1을 48비트 값으로 확장할 필요가 있다.
- XOR
확장 치환을 적용한 이후에 DES는 확장 치환의 출력 값에 라운드 키를XOR 연산한다.이때, 확장 치환의 출력 값과 라운드 키 값은 모두 48비트이다. 라운드 키는 이 연산에서만 사용된다.
- S-box
S-box는 실제로 섞어주는 역할을 수행한다. 즉, 혼돈 역할을 수행한다. DES는 각각 6비트 입력 값과 4비트 출력 값을 갖는 8개의 S-box를 사용한다.
1.3.1.4 DES 복호화
- 복호화는 암호화와 동일한 치환 테이블을 적용한다.
- 64비트 암호문의 초기 치환을 한다.
- 서브키의 생성 절차는 암호화와 동일하지만 암호화의 역순으로 서브 키를 적용한다.
- 64비트 입력을 32비트로 나누어서 위치를 교체한다.
- 64비트의 최종 치환을 한다.
1.3.1.5 DES 암호화 vs DES 복호화
- 공통점
s 서브키를 생성하는 부분이 같다.
s 각 라운드의 F 함수 적용과 위치 변환이 같다.
s 초기 치환과 역 초기 치환의 적용 순서가 같다.
- 차이점
s 암호화는 입력으로 평문이 주어지며 출력으로 암호문이 출력되지만, 복호화는 입력으로 암호문이 주어지며 출력으로 평문이 출력된다.
s 보조키 적용 순서는 암호화 과정의 역순으로 적용된다. 즉, 암호화는 라운드 1(K1), 라운드 2(K2), … , 라운드 16(K16)이지만, 복호화는 라운드 1(K16), 라운드 2(K15), … , 라운드 16(K1)이다.
1.3.1.6 DES의 취약성
- 컴퓨터 속도의 비약적 발전으로 DES의 56비트 키에 대한 안전성 문제가 제기되었다.
- NIST는 DES의 취약성을 극복하기 위해 진보된 암호화 표준(AES: Advanced Encryption Standard)의 개발 계획을 발표하였다.
- DES의 안전한 변형인 3DES를 미국의 국가 표준으로 채택하였다.
- AES 요구사항
s 형태
강력한 대칭키 블록 암호 알고리즘으로 정부 및 상업 부분에서 사용이 가능해야 한다.
s 효율성
3DES보다 좋아야 한다.
s 비용
알고리즘 공개 및 로열티 없이 무료로 이용 가능해야 한다.
s 안전성
블록의 길이는 적어도 128비트의 크기를 가져야 하며 키의 범위는 128, 192, 256 비트여야 한다.
- 15개의 제안 중, Daemen과 Rijmen이 제안한 Rijndael 알고리즘이 최종 선정되었다.
1.3.2 3DES (Triple Data Encryption Standard).
- 기존 DES 알고리즘을 기반으로 만들어졌으며 각 데이터 블록에 DES를 세 번 적용한 Triple DES 블록 암호에 대한 일반적인 이름이다.
- DES의 안전한 변형 알고리즘으로 널리 사용되고 있는 64비트 블록 단위의 대칭키 암호 방식 중 가장 안전하며, 세 개의 서로 다른 키를 이용한 3DES는 168비트의 유효 키 길이를 갖는다.
- 알고리즘은 암호-복호-암호(EDE: encrypt-decrypt-encrypt) 순서를 따른다.
- 복호의 사용은 암호적인 효과는 없지만, 3DES 사용자로 하여금 이전의 DES로 암호화된 데이터를 복호화할 수 있게 한다.
- 하드웨어 기반 구현을 목적으로 설계되었기 때문에 소프트웨어 상의 수행 속도가 느리며, DES와 비교 시 3배의 반복 과정을 수행하므로 느리다.
- 암호화: 64비트 평문에서 64비트 암호문을 생성하고, K1, K2, K3는 56비트의 DES 키이다.
s 단계 1
평문을 키 K1로 암호화한다.
s 단계 2
단계 1의 결과를 키 K2로 복호화한다.
s 단계 3
단계 2의 결과를 키 K3으로 암호화한다.
- 복호화: 64비트 암호문에서 64비트 평문을 유도한다.
s 단계 1
암호문을 키 K3으로 복호화한다.
s 단계 2
단계 1의 결과를 키 K2로 암호화한다.
s 단계 3
단계 2의 결과를 키 K1로 복호화한다
- 높은 보안을 요구하는 경우 K1, K2, K3은 서로 다른 키를 사용한다. 56*3 즉, 168비트 길이의 키로 암호화하는 것과 동일한 안전성을 갖는다.
- 일반적인 보안을 요구하는 경우 K1과 K3은 동일한 키를 사용한다.
1.3.3 AES (Advanced Encryption Standard)
- 암호화와 복호화 과정에서 동일한 키를 사용하는 대칭키 알고리즘이다.
- 2001년 미국표준기술연구소에 의해 제정된 암호화 방식으로, Daemen과 Rijmen에 의해 개발된 Rijndael 암호에 기반하여 AES 공모전에서 선정되었다.
- DES를 대신하는 대칭 블록 암호방식으로 평문을 128비트 단위로 나누어 암호화, 복호화를 수행한다.
- Feistel 구조를 사용하지 않지만, AES 알고리즘은 안전성을 제공하기 위해 각 라운드는 4가지 암호화 과정으로 이루어진다.
s 바이트 대체(Substitute bytes)
s 행 이동(Shift rows)
s 열 혼합(Mix columns)
s 라운드 키 더하기(Add round key)
1.3.3.1 AES의 세 가지 특성
- 보안성 (Security)
s 전수조사 공격 (Brute-Force Attack): AES는 DES보다 큰 사이즈의 키를 사용하기 때문에 DES보다 더 안전하다.
s 통계적 공격 (Statistical Attacks): 수많은 테스트들이 암호문의 통계적인 분석에 실패했다.
s 차분 공격과 선형 공격 (Differential and Linear Attacks): 아직까지 AES에 대한 차분 공격[3]과 선형 공격[4]이 알려지지 않고 있다.
- 구현 (Implementation)
s AES는 소프트웨어, 하드웨어, 펌웨어로 구현할 수 있다. Table lookup 도는 잘 정의된 대수적 구조를 사용하는 루틴을 사용하여 구현될 수 있다.
- 단순성과 비용 (Simplicity and Cost)
s AES에 사용하는 알고리즘은 매우 단순하므로 싼 프로세서와 최소 메모리를 이용하여 쉽게 구현 가능하다.
1.3.4 운영 모드
1.3.4.1 ECB(Electronic Codebook) 모드
- 운영 모드 중 가장 간단한 모드이다.
- 평문은 N개의 n비트 블록으로 분할된다.
- 각각의 블록을 암호화 혹은 복호화하기 위하여 사용되는 키는 동일하다.
- ECB 운영 모드는 안전하지 않은 채널을 통하여 두 개 이상의 블록을 갖는 메시지를 암호화하여 전송하는 수단으로 권장되지 않는다.
- 데이터베이스에 암호화된 레코드를 저장하거나 암호화된 레코드를 복호 해야 하는 분야에서는 암호문 블록의 독립성이 유용하다.
- 블록의 암호화와 복호화 과정의 순서가 ECB 모드에서는 중요하지 않기 때문에 각각의 레코드가 단일 블록이거나 블록의 배수라면 데이터베이스에 랜덤 하게 접근할 수 있다. 뿐만 아니라 다른 레코드에 영향을 주지 않고도 수정된 이후에 레코드는 중간에서부터 암호화되거나 복호화될 수 있다.
1.3.4.2 CBC(Cipher Block Chaining) 모드
- 각각의 평문 블록은 암호화되기 전에 이전 암호문 블록과 XOR 된다.
- 블록이 암호화될 때 암호화된 블록은 전송이 되지만, 다음 블록을 암호화할 때 사용하기 위해서는 메모리에 저장되어야 한다.
- 첫 번째 블록을 암호화할 때에는 이전의 암호문 블록이 존재하지 않으므로 초기 벡터(IV: Initialization Vector)라고 불리는 허구의 블록이 사용된다.
1.3.4.3 CFB(Cipher Feedback) 모드
- 암호화와 복호는 블록 암호의 암호화 함수를 이용한다.
- 고정 길이의 평문을 고정 길이의 암호문으로 변환하는 비밀키 암호 방식을 사용함으로써 송수신에서 같은 길이의 비트 수 단위로 암호화하는 모드이다.
- 송신 측에서 블록 암호의 출력 비트열과 평문의 입력 비트열의 XOR을 취하여 암호문의 비트열을 출력한다.
- 블록 암호의 입력을 설정하는 레지스터에서는 출력된 암호문의 비트열을 하위에서 비트 쉬프트로 값을 갱신한다.
- 수신 측에서는 송신 측의 반대 과정을 거쳐 나온 출력의 일부 비트열과 수신한 암호문의 비트열과의 XOR을 취해 복호 한다.
1.3.4.4 OFB(Output Feedback) 모드
- 블록 암호를 사용하여 블록 간의 의존 관계를 갖는 비트열 암호 운영 모드로 블록 암호의 출력 전부를 입력 레지스터 갱신에 사용하는 비트열 암호화 방법이다.
- 송신 측에서는 입력 레지스터에 기반을 두고 블록 암호화하여 그 출력의 비트열과 평문 비트열의 XOR을 취하여 생성한다.
- 수신 측에서는 송신 측의 암호화 처리와 같은 방법의 역순으로 복호 한다.
1.3.4.5 CTR(Counter) 모드
- 블록 암호를 스트림 암호로 바꾸는 구조를 가진다.
- CTR 방식에서는 각 블록마다 현재 블록이 몇 번째인지 값을 얻어 그 숫자와 nonce를 결합하여 블록 암호의 입력으로 사용한다. 그렇게 각 블록 암호에서 연속적인 난수를 얻은 다음 암호화하려는 문자열과 XOR 한다.
- CTR 모드는 각 블록의 암호화 및 복호화가 이전 블록에 의존하지 않는다. 따라서 병렬적으로 동작하는 것이 가능하다. 혹은 암호화된 문자열에서 원하는 부분만 복호화하는 것도 가능하다.
1.4 스트림 암호 (Stream cipher)와 RC4
1.4.1 스트림 암호
- 입력되는 요소를 연속적으로 처리하여 지속적으로 한 번에 한 요소씩 배출한다.
- 평문을 한 번에 1비트 단위로 암호화하는 방식이다.
- 키를 Keystream generator라는 알고리즘에 입력하여 발생되는 1비트 키의 무한수열로 평문을 암호화한다.
1.4.1.1 스트림 암호 구조
- 전형적인 스트림 암호는 한 번에 평문을 한 바이트씩 암호화한다.
- 랜덤한 8비트 숫자의 스트림을 만들어내는 의사랜덤 비트생성기에 하나의 키를 입력으로 사용한다.
- 의사랜덤 스트림은 입력되는 키를 알지 못하면 예측할 수 없는 스트림이며 랜덤한 문자로 구성된다.
- 생성기의 출력은 Keystream이라고 불리는데, 한 번에 한 바이트씩 평문 스트림과 비트별로 XOR 연산된다.
1.4.2 RC4 알고리즘
- Ron Rivest가 1987년에 설계한 스트림 암호이다.
- RC4에서 사용된 알고리즘은 랜덤 치환에 기초해서 만들어졌다.
- 웹 브라우저와 서버 사이의 통신에 정의된 SSL/TLS(Secure Socket Layer/Transport Layer Security) 표준에서 사용된다. 또한, IEEE 802.11 무선랜 표준인 WEP(Wired Layer Security) 표준에서 사용되며 WPA(WiFi Protocol Access) 프로토콜에서 사용된다
- RC4 알고리즘은 길이가 1바이트에서 256바이트인 다양한 키를 사용하여 S [0],∙∙∙, S[255]를 원소로 가지는 256바이트의 상태 벡터 S를 초기화한다. 어느 경우이건 S는 8비트 숫자로 이루어진 모든 가능한 0~256까지의 숫자 치환을 포함하고 있으며, 암호화와 복호화를 위해 대칭을 이루는 형태로 255개의 성분 중에서 한 개를 선택하여 한 개의 바이트k를 S로부터 생성한다. 각각의 k의 값이 생성되면 S의 성분을 다시 한 번 치환한다.
[1] National Institute of Standards and Technology(NIST): 미국상무부 기술관리국 산하의 각종 표준과 관련된 기술을 담당하는 연구소
[2] exclusive OR (배타적 논리합): 입력된 2개의 값 중 1개만 참일 때 참이 되는 논리 연산자
[3] 차분 공격(differential cryptanalysis): 암호해독의 한 방법으로, 입력 값의 변화에 다른 출력 값의 변화를 이용하는 방법이다.
[4] 선형 공격(linear cryptanalysis): 암호 공격의 한 방법으로, 암호화 과정에서 근사적 선형 관계식을 찾는 것을 목적으로 한다.
'와사비크래커 IT Tip > 보안' 카테고리의 다른 글
[보안] 응용 레벨 보안: PGP, S/MIME (0) | 2020.08.18 |
---|---|
[보안] 해쉬 함수와 메시지 인증 (0) | 2020.08.18 |
[보안] 메시지 무결성 및 키 관리 (0) | 2020.08.14 |
[보안] 비대칭키(Asymmetric key) 암호화 (0) | 2020.08.14 |
[보안] 암호학 (0) | 2020.08.13 |