패스트터틀

암호학 왕초보(CAESER, AES, LEA) 본문

카테고리 없음

암호학 왕초보(CAESER, AES, LEA)

SudekY 2019. 4. 17. 16:59

본 블로그의 내용은 작성자가 공부를 하기위한 블로그로 잘못된 정보가 기재될수있고 이로인하여 발생하는 문제점은 저에게 책임이 없습니다. 저는 단지 제가 지식 습득을 위한 하나의 수단으로서 블로그를 사용합니다.

잘못된 정보는 댓글로 남겨주시면 후에 수정하겠습니다.

---------------------------------------------------------------------------------------------------------------------------------

 

보안공부, 보안미래 팁)

암호화 알고리즘은 절대적으로 우리가 만들어서 쓰면안됨

(무조건적으로 전문가를 신용해야되는 부분)

(어제했던거(190416)는 openssl인데 그 속을 굉장히 어려움 하지만 끌어쓰기에는 이것을 아는것이 제일 쉬움)

보안에서는 뭐든 다 잘할순없다

모든분야를 아는것보다 하나를 정하고 그쪽을 나아가는것이 좋음

 

 

기본용어 : 

 

cipher : 용어

 

1. 카이사르 암호(율리우스 카이사르 CAESAR 그대로 읽으면 카이사르 영어발음으로 시저로 시저암호라고도 부른다)

 

카이사르 암호(위키백과)

간단하게 살펴보자면 오른쪽으로 3칸씩 이동해서 쓴다고 생각해보자

 

만약에 누군가에게 내가 카이사르 암호를 이용하여 'DEAD' 라는 단어를 전달한다고 생각해보자

 

위의 표를 보고 차근차근 오른쪽으로 3칸씩 이동해서 써보면

 

-A B C D E F G H I-

 

D -> G

E -> H

A -> D

D -> G로 바뀔것이다.

 

그리고 이를 받은 상대는 이 코드를 다시 3칸씩 반대로 이동해서 써보면

 

-A B C D E F G H I- 

 

G -> D

H -> E

D -> A

G -> D로 바꾸면 다시 

 

'DEAE'라는 단어를 해석할수있다.

 

이것을 아주 간단하게 코드로 만들어보자

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

void encrypt(char* cipher, const char* plain,char key) { // c 개발자들은 아웃풋으로 하는애를 먼저쓰고 인풋을 나중에 씀 박사님이 그렇다고 하니 일단은 그런식으로 알고있자 
	for (int i = 0; i < strlen(plain); ++i) 
		cipher[i] = (((plain[i] - 'A') + key) % 26) + 'A'; 
} 

void decrypt(char* dec, const char* cipher,char key) { 
	for (int i = 0; i < strlen(cipher); ++i) 
		dec[i] = (((cipher[i] - 'A') - key) % 26) + 'A'; 
} 

int main() 
{ 
	const char* plain = "CEASER"; //암호문  
	char cipher[1024] = { 0 }; // 평문 //배열초기화할때는 함수를 사용해서는안됨 그렇기에 우선 큰값으로 넣음 
	char dec[1024] = { 0 };  

	encrypt(cipher, plain, 4); 
	printf("%s\n", cipher); // 6글자인데 %s는 마지막이 0이어야지 끝낸다는특성으로 쓰레기값이 나옴 
	decrypt(dec, cipher, 4); 
	printf("%s\n", dec); 

	return 0; 

}

 

encrypt는 암호화

decrypt는 복호화


 

 

 

 

 

 

1. AES (Advanced Encryption Standard)

 

아주쉽게 뜻 그래도 읽어보자. 이 정도 영어는 할줄안다고 믿는다.

 

진보된 암호 표준 이다. 

 

본래 예전에는 DES를 사용했었으나 DES의 공격의 취약성이 밝혀지면서 차세대 암호화 기술이 필요해졌는데

 

(물론 지금도 DES를 3DES란 기술로 업그레이드 시켰고 말 그대로 DES를 세번쓰는 방법이다.)

 

이때 등장한것이 AES이다. 

 

AES는 세가지 키 길이 128 256 ? 를 사용하는데

 

128비트가 안전하지 않는건아니지만 2030년까지 사용가능하다고 함 하지만 2030년이 거의다 다가왔고 그냥 추세가 

 

256비트를 사용하라고 한다. 그런데 아직까지는 128비트를 사용하는곳이 많다고함)

 

AES는 총 4가지 단계로 된다.

 

(이런 알고리즘들은 전부다 공개되있고 Key값은 비공개)

subbytes

128비트를 8비트 단위로 쪼개서 16개 만들어서 뭔가(S-box로 들어가면)를 통해서 다른것으로 바꾸는것

(이 과정에서 S-box가 들어감)

 

shiftrows

첫줄은 그대로두고 둘째줄은 첫칸씩 왼쪽으로 셋째줄은 두칸씩 왼쪽으로 .. 넷째줄 세칸씩 왼쪽으로.. 이런식으로 간다고함

 

mixcolumns

열을 불러와서 곱셈(고도의 수학적지식이 필요한 곱셈, 유한체곱이라고함)을 하고 바꿔주는것

이것도 어떻게 보면 골때리는것인데 

 

addroundkey

Roundkey(비밀키)를 더해주는것인데 이 RoundKey를 모르면 알고리즘을 알아도 값을 구하지못함

16개조각으로 나누어진 데이터조각에다가 16개조각의 키를 XOR를 한번씩 해주면 한라운드의 결과로 나옴

 

S-box : 행렬? 을 잘섞어주는 수학적이론이 들어간 아주 뛰어난 계산해주는 box같은것

 

AES는 어쨋든 이런식으로 4개로 되어있고

 

우리가 만들경우는없고 대충 어느정도 이해만하면 된다.

 

더 알고싶으면 위키에 자세하게 나와있다고 하니 영어로 자알 읽어보면 나온다.

 

shiftrows랑 subbytes랑 바꿀수있음 그래서 어떤 최적화된 Encryption을 할수있다고함

 

최근에 AES가 많이 쓰이고 있고 소프트웨어적으로 어느정도 빠르게 하는것에 한계가 있었는데

 

Intel/AMD가 AES 암호화 복호화를 할수있게 하드웨어 

 

CPU적으로 할수있게 해줘서 비교도 안되게 빨라지게됨

 

이것을 AES NI(인텔) AES Instruction (ARM용) 라고 함(최신 cpu에 적용되어있음)

 

 

 

(추후 수정필요 AES DES 대칭키에 대한 추가설명이 필요함)

 

 

 

 

 

 

 

 

 

IInitialization Vector (IV) 란?


-첫블록을 암호화 할 때 사용되는 값
블록암호 블록 크기와 같은 크기
키교환 과정등에서 랜덤하게 생성한 값
비밀로 지켜야 하는 값은 아님(공개되어도 무관함)

-같은 초기화 벡터가 반복되어 사용된다면?

비슷한 두 개의 평문을 암호화 했을 때
같은 암호문 블록이 나타날수있음

-nonce
동일한 키를 사용하는 암호화 과정 중 한번만 사용되어야 하는 값 (무조건 한번만 사용되어야함)

 

Encryption : 평문을 받아서 암호문으로바꾸는것

 

Decryption : 암호문을 받아서 평문으로 바꾸는것

 

 

 

블록암호 LEA 구현

 

1. LEA(Lightweight Encryption Algorithm) 

 

우리나라 연구소에서 2006년에 ARIA가 나오고 2010년에 LEA개발 2012년 LSH 개발했음

 

IOT때문에 등장한것이고 IOT는 핸드폰이나 PC처럼 빵빵한 기기(전력이나 하드웨어적인 측면)가 아니라서

 

무거운 알고리즘을 쓸경우 전기를 많이먹거나 메모리를 많이 먹으면 안됨

 

그래서 경량화 측면에서 나온것이며 하지만 경량화로 인한 보안적인 측면이 떨어지지 않았음

 

LEA는 하드웨어적인 측면과 소프트웨어 적인 측면이 있는데

 

하드웨어적인 측면보다는 소프트웨어적으로 경량화에 더욱더 무게를 두었음(소프트웨어에 집중 경량화)

 

AES를 따라 잡기위해서 열심히 노력을했는데

 

ARX ( Addition/Rotation/eXclusive-or ) 이 세가지를 이용해 만들자는것이 ARX임

 

Addition은 덧셈 Rotation은 바꾸고 뒤집고 하는거 eXclusive-or 은 같으면 0 다르면 1을 하는것이며

 

이 세가지를 이용해 한 사이클을 만들며 (대부분의 cpu에서 가장 빠른 세가지영역? 임)

 

그래서 장점이 굉장히 빠르며 메모리가 불필요 하지만 단점으로는

 

비트변화 전파가 느리고(라운드 수 증가로 예를들면 AES128은 10라운드만 돌리면 랜덤한게 보이지만 LEA같은경우는 24라운드를 줘야함)

 

안전성 분석이 어려움( 안전한지 안한지 확실히 모름, 증명을 못하는건지 안하는건지 ... 근데 아직까진 깨진적은없다)

 

LEA/LSH 핵심 구성요소 는 ARX연산과 Permutation(성능)으로 나뉠수 있음

 

최신근황으로 LEA는 개발기간이 2010년부터 2013년 까지이며 국내에서는 표준이됨

 

2019년에는 국제표준으로 올라갈예정임

 

가장 큰 특징은 ARX구조를 채택했고 32비트 연산자를 핵심 연산으로 설계 하였고 기존에 알려진 모든 공격 방법에 충분

 

한 안전성을 가지도록 설계하였음(안전성을 증명할수는없지만 기존에 알려진 공격들을 해보니까 안통했음)

 

LEA-128 LEA-192 LEA-256는 라운드수가 AES보다 크지만 전력소모가 적다

 

하지만 AES NI 는 이길수 없음 (AES NI가 대빵이다.)

 

LEA는 6번의 XOR 덧셈 3번 shift 3번 permutation은 한번으로 AES보다 빨리 끝남(덜 복잡) ( 자세히 무슨설명인지는 모르겠음)

 

각각의 연산

 

 

SHA1 은 재작년에 깨졌고

 

SAH2 이상을 써야된다라고 함

 

 

 

 

 

Comments