이번에 소개해 드릴 암호 알고리즘은 ... ARIA ...

.. ... Academy, Research Institute, Agency

이전 포스팅의 SEED와 마찬가지로 국가 표준 암호 알고리즘입니다.

다만 다른점이 있다면, SEED가 Feistel 구조의 블록 암호라면, ARIA는 SPN 구조의 블록암호라는 차이가 있습니다.
(정확하게는 Involutional SPN 구조 입니다만 ... )

다른 설명보다도 공식 상세 문서를 보시면 더 이해하시기가 편하실 겁니다 ...
관련 자료는 ...

ARIA 공식 홈페이지(?) - http://210.104.33.10/ARIA/index.html
국가정보원 - http://service2.nis.go.kr/

에서 다운로드 받으 실 수 있습니다만 ... ... 이번에도 제가 미리 받아 둔 파일을 첨부합니다.

 - 상세문서 :

 - 테스트벡터 :
 - 소스코드
소스코드는 위에 링크한 국정원 홈페이지에서 배포한 것을 그대로 재 첨부 한것이며,
국가정보원 표 소스코드는 JAVA / C(32Bit) / ANSI C 세 가지 스타일로 작성되어 있습니다.

※ 주의사항
ARIA 상세 명세서 ... 12 페이지 그림 잘못되어있습니다
절대 12 페이지 보고 구현하면 ... 망합니다 ... (제가 그 피해자 입니다...)
문제는 수정판이 있는데 ... 공식 홈페이지와 국정원 모두 잘못된 구 버전 명세서가 올라가있습니다 ... (2010년 2월 기준)

출처 - http://reinliebe.tistory.com/
이전 포스팅에서 소개한 DES와 AES가 미국 표준(이라고 쓰고 국제 표준이라고 읽습니다) 암호 알고리즘 이었다면

이번과 다음 포스팅에서 소개하는 알고리즘들은 국내 표준 암호 알고리즘입니다.

참고로 논란의 여지가 있어서 언급하는 겁니다만,
SEED도 국제 표준(ISO/IEC 18033-3, IETF RFC 4269)에 등록되어있습니다.
AES나 DES 만큼 여러 나라에서 사용하지 않아서 그렇지요 (거의 우리나라만 쓸겁니다)... ... ;;;;;;;


SEED 암호 알고리즘은 Feistel 구조의 블록 암호 알고리즘으로,
1999년 한국정보보호진흥원(KISA: 현 한국인터넷진흥원)에서 개발, 국내의 금융 IC 카드 등에 사용되는 알고리즘 입니다.

- 128-Bit symmetric
- Feistel structure with 16 rounds
- Two 8x8 S-boxes
- National industrial association standard (TTAS KO-12.0004, 1999)

상세 명세서와 소스코드는 KISA 홈페이지에서 받으 실 수 있습니다만,
저도 자주 보는 터라 받아 둔 게 있어 올려봅니다.

- SEED 명세서

- SEED 테스트벡터

참고 : 한국인터넷진흥원 - http://www.kisa.or.kr

현재 SEED 소스는 KISA 홈페이지에서 요청 등록을 하면 주는 식으로 바뀌어 있는 것 같습니다
따라서 SEED 소스는 Devpia 자료실의 자료를 링크합니다.
KISA 에서 제공한 C 코드를 조금 수정한 코드라는데 ... ... KISA에서 제공한 소스랑 거의 같네요 ;;
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=278&MAEULNo=20&no=17329&ref=17329


출처 - http://reinliebe.tistory.com/

이번 프로그램은 일전의 AES C# 소스 코드 포스팅의 확장입니다 ...

 

자세한 설명은 앞의 포스팅을 참고하시길 ...

 

제가 올린 소스코드에서 입출력 부분을 조금 바꾼 뒤,

 

이를 이용하여 파일 암호 프로그램으로 변형 해 보았습니다 ...

 

바꾼 입출력은 아래 예시 처럼 매우 간단한지라 ... 따로 소스는 올리지 않습니다.

 

입력예시..


대신 바뀐 클래스의 DLL 파일을 첨부합니다.

 

 

이 DLL 파일을 이용하여, 간단하게 windows form 을 이용한

 

파일 암호화 프로그램을 만들어 보았습니다.

(아래 프로그램 실행 시 위의 DLL 파일을 필요로 합니다)

 


 

작성 언어가 당연히 ... 지난 포스팅의 연속이므로 C#이며

 

실행을 위해서는 .NET 프레임웍이 필요합니다.

 

만들고나니 소스가 200줄밖에 안되는군요 ;;

출처 - http://reinliebe.tistory.com/

인터넷상에 널리고 널린게 AES 코드지만, 저도 하나 올려봅니다 ...

C/C++ 언어로 작성된 AES 코드는 많지만 C#은 많지 않기에 ... 그냥 한번 만들어 보았습니다.

일단 C# 언어로 작성되어있지만,
C/C++코드가 필요하신 분들이 가급적 보기 쉽고 바꾸기 좋도록(?) 만들었습니다.
(그래봤자 foreach를 for 로 만든 것 밖에 없지만 ...)


저의 프로그래밍 철학은 무조건 가독성이 높게 가 모토이므로,
코드가 단순 무식해 보일지도 모르지만 (사실 실력이 좋지 않습니다 ... 게다가 가독성도 .. (응?))
무릇 고급언어(C, JAVA 등)라는 것은 기계어(어셈블리어 등)에 비해 인간이 보기 쉽고
논리적으로 판단하기 쉽게 만들어야 한다고 생각합니다.
(이렇게 밖에 프로그램을 못하는 자의 비겁한 변명이려나요  .. 그냥
프로그램 잘 하는 사람들이 그냥 부러울 뿐이에요 ;;)
 

코드보기



코드가 귀찮으신 분은 ... 아래 dll 파일을

참조하신 뒤에

 

코드보기..


이렇게 하셔도 무방합니다 ...

 

일단 TEST VECTOR 를 넣고 테스트를 해 본 결과, 결과 값이 잘 나오는 것을 확인 하였지만

논리적으로 문제가 발견되면 언제든 Feedback 받습니다 ...

 

이용은 자유지만, ㅊ..추천이나 ..ㄷ..ㄷㅐ댓글같은걸 바라ㅈ ... ... 쿨럭!

언제나 오픈 마인드입니다 ... 'ㅂ'/


출처 - http://reinliebe.tistory.com/

Advanced Encryption Standard

앞 포스트에서 DES 암호 알고리즘에 대하여 살펴보았습니다.

앞 포스팅을 간단히 요약하면, 30년 가량 써온 DES 알고리즘이 .. 사용에 큰 지장은 없었으나 ...

DES 알고리즘의 문제점으로 키 길이가 너무 짧다.
또한 Differential Cryptanalysis(1990년, Biham & Shamir)와 Linear Cryptanalysis(1993년, Matsui)이 등장하면서
DES 키 분석이 더 쉬워졌다.
그래서 2개의 키로 3번 반복하는 Triple-DES(이하 T-DES)를 사용한다.
하지만 3번 반복하다보니 ... 3배로 느리다 ...
더 중요한건 키 길이는 112비트가 되었지만, 여전히 암호 블록은 64비트이다...

... 이런 이유에서 AES가 나오게 됩니다 ...

앞 포스트에도 있는 내용이지만 ... ...
3차에 걸친 DES Challenge를 통하여 DES의 (키 길이가 짧아서 생긴)취약성을 증명하였고
동시에 1997년 미쿡의 NIST에서는 DES를 대신할 새로운 블록 암호 공모를 시작하였습니다.

제안된 수많은 암호 알고리즘들 중에서 ... (그 중에는 우리나라에서 제안한 것도 있었다고 합니다 ...)

2000년 10월 2일 Rijndael(라인달 이라고 읽으면 됩니다)을 AES로 선정합니다.
(만든 사람인 Joan Daemen과 Vincent Rijmen의 이름을 따서 지어진 이름이라지요 ;;)

그리고 이듬해인 2001년 1월 16일, FIPS197로 표준을 공표합니다.

AES 소스는 웹 상에 많이 널려 있지만 ...
C# 언어로 작성한 소스 코드를 다음 포스트에 게시합니다.

더불어 AES 암호 알고리즘의 상세 문서는 ... 이것 !!!




출처 - http://reinliebe.tistory.com/

DES 알고리즘을 C#으로 만들어 보았습니다 ...

DES 암호 알고리즘이 나온지 벌써 30년이 넘었기 때문에,
웹 상에 정말 널리고 널렸기에 크게 의미는 없습니다만 ...

아무튼 ... 널리고 널린 DES 코드인 만큼 저도 다른 사람들이 만든 코드를 활용해보았습니다.
결국 구글에 DES C CODE라고 치면 두번째로 검색되는
(앞서 DES 포스트에도 언급 되어있는 소스코드 입니다)

http://ubiqx.org/libcifs/source/Auth/DES.c

위의 C코드를 C#으로 바꾼 것 밖에 한 것이 없네요 ...
(코드는 스크롤 압박이 심해서 접어둡니다)


암호학 - Block Cipher :: DES C# 소스

'Security > Cryptography' 카테고리의 다른 글

암호학 - Block Cipher :: AES C# 소스  (0) 2011.05.07
암호학 - Block Cipher :: AES  (0) 2011.05.07
암호학 - Block Cipher :: DES  (0) 2011.05.07
암호학 - Block Cipher  (0) 2011.05.07
암호학 - Introduction  (0) 2011.05.07

Data Encryption Standard 알고리즘에 대하여 알아보도록 하겠습니다.

DES 알고리즘은 1977년 미국 NIST 표준으로 공표된 이후
AES 알고리즘이 나오기 전 까지 전 세계적으로 널리 사용된 암호지요 ...

간단한 History를 살펴보면,

1972년 미쿡 상무성에서 공모를 시작하여 IBM이 개발한 알고리즘을 채택합니다.

이 DES의 개발자는 아직도 알려져 있지 않으며, 제작당시 64비트의 키를 갖는 암호 알고리즘 이었지만
미쿡 NSA에서 키 크기를 56비트로 줄이면서
미국 정보기관에서 DES의 백도어를 만들지 않았나 하는 의혹까지 일기도 하였습니다.
(현재까지 많은 학자들의 연구 결과, 백도어는 없을것이다 ... 라는게 지배적인 의견입니다)

아무튼 이 모든 사실이 아직까지 의문으로 남은 채 세상에 나오게 되었습니다.

DES는 기본 사양으로 암호 블록은 64비트, 키는 56비트를 사용하며
전체 16라운드 Feistel 구조에 8개의 비선형 함수인 S-Box를 사용합니다.

일단 만든 사람이 불명인데다 NSA에서 키 비트를 56비트로 만든것도 석연찮다는 의견같은건 배제 하더라도
DES는 실로 굉장히 안전한 암호 알고리즘이라 볼 수 있습니다.
다만 ... 70년대에 나온 알고리즘이다 보니, 당시 56비트의 키는 분석이 불가능했겠지만
근래에 이르러 컴퓨팅 파워가 늘어남에 따라 이 56비트의 키 크기도 그다지 안전하지 않게 되었습니다.

(Differential Cryptanalysis(1990년, Biham & Shamir)와 Linear Cryptanalysis(1993년, Matsui)에 대한 얘기는 일단 논외로 하겠습니다)
일례로 1997년 1차 DES Challenge에서 분산처리를 통해 96일만에 키를 분석 할 수 있었으며
1998년 2차 DES Challenge에서는 분산처리로 41일, 전용칩을 이용하여 56시간만에 키 분석이 가능 했습니다.
1999년 3차 DES Challenge에서는 전용칩과 분산처리를 이용하여 22시간만에 DES의 키를 찾을 수 있엇습니다.

단순하게 키 크기가 작은 이유로 안전하지 않은 까닭에
근래에는 2개의 키로 DES를 3번 암호화 하는 Triple-DES 사용을 권장합니다.
56비트의 키를 2개 사용하면 키 크기가 112비트가 되기 때문에
현재의 컴퓨팅 파워로도 2^112 만큼의 키를 전수키조사 하는 것은 무리가 있습니다.
따라서 보안 측면에서 매우 유리해집니다만 ... 3번 암호화를 하기 때문에 속도는 3배 느려지게 되지요 ;;;
이런 까닭에 AES가 등장하게 됩니다. 

그래도 20년가량 써온 암호이기 때문에 아직까지도 널리 사용되고 있기는 합니다.

아래는 DES의 상세 명세서 ... 

소스코드는 검색창에 DES라고만 쳐도 쏟아지지만 ... ...

http://ubiqx.org/libcifs/source/Auth/DES.c

이 곳의 소스 코드가 이용하기도 편하고, 잘 만들어 진 것 같아 소개합니다.

출처 - http://reinliebe.tistory.com/

'Security > Cryptography' 카테고리의 다른 글

암호학 - Block Cipher :: AES C# 소스  (0) 2011.05.07
암호학 - Block Cipher :: AES  (0) 2011.05.07
암호학 - Block Cipher :: DES C# 소스  (0) 2011.05.07
암호학 - Block Cipher  (0) 2011.05.07
암호학 - Introduction  (0) 2011.05.07
앞서 설명드린 현대암호의 범주 안에서도 대칭키암호에 들어가는 블록암호에 대하여 알아보도록 하겠습니다.

블록암호의 정의에 대해 간단히 살펴보면,
평문(Plaintext : 암호화 되기 전의 원 정보)이 n 비트일때, 암호문(Ciphertext) n 비트는

K 가 고정되면 Ek( ) 가 bijective 함수 라던지,
키 사이즈가 log2 |K| = k 라는건 ... 기본(?) 이겠지요 ;;


어때요 ... 참 쉽죠 ?

텍스트큐브에서도 그랬지만 ... 티스토리도 수식은 안써지니 ...
(뭐 그래서 예전 블로그 그림을 그냥 그대로 가져왔지만서도요 ;;)


그림으로 간단히 표현하면 ... 이렇습니다 ...
(이것도 이전 블로그 포스트에 있던 그림입니다 ... 투철한 재활용 정신이랄까요 ;;)



블록암호는 그 구조에 따라 Feistel 구조와 SPN 구조 ... 으로 나뉩니다
(... 등에 신경쓰시면 안됩니다 ;; 사실 두 구조를 가장 많이 쓰지요 ...)

▶ Feistel 구조

Feistel 구조는 아래 그림과 같이 평문의 좌우를 나누어 키와 조합한 뒤, XOR 연산을 거쳐
좌우를 뒤집어주는 ... ... 구조입니다 ...



암호학에 있어 Shannon의 Confusion과 Diffusion 이 중요한데 ... (이건 다음에 다루기로 하지요 ...)
아무튼 반복 연산을 통하여 Confusion과 Diffusion을 만족시킵니다.

좌우를 뒤집어가면서 연산해야 하므로 병렬연산이 어렵고,

SPN 구조에 비교하여 동일한 Confusion/Diffuison을 만족시키려면,
SPN 구조의 두 배에 해당하는 반복연산이 필요하기 때문에
성능 측면에서는 효율적이지 못할지도 모르지만

암호화와 복호화 과정이 동일하기 때문에 별도의 복호화기가 필요 없습니다 ...

그게 매우 큰 장점이지요 ...
A xor B = C 일때, C xor B = A 라는 것을 생각해보시면 쉽개 아실 수 있을겁니다.


▶ SPN 구조

SPN은 .. Substitution - Permutation Network의 약자로

말 그대로 Substitution Layer와 Permuation Layer를 이용하여 Confusion과 Diffusion을 만족시켜주는 암호입니다.

간단하게 밑의 그림과 같이 단순합니다 ...


장점이라면, Feistel 구조와 반대로 병렬연산이 가능하며

단점이라면 복호화시 별도의 복호화 모듈을 구현해줘야 한다는 것이지요


▶  블록 암호의 종류

전 세계적으로 매우 많은 종류의 블록 암호가 있고, 많은 암호들이 사용중/ 혹은 보류(?) 상태 입니다.

우리나라의 경우 AES DES(T-DES) SEED ARIA 가 주로 사용되고
그 외의 알고리즘은 별로 사용되지 않는다고 보시는게 좋을 듯 싶습니다.

서론이 조금 길었지만 다시 ... 간단하게 블록암호의 종류에 대해 살펴보면,
블록암호는 앞서 Feistel 구조와 SPN 구조 등으로 나뉜다 볼 수 있다 하였습니다.
일반적인 경우 Feistel 구조와 SPN 구조를 가장 많이 쓰긴 합니다만,
경우에 따라 두 구조의 혼합 구조나 새로운 구조를 만들어 사용하기도 합니다.

▷ Feistel 구조
  - DES
  - SEED
  - FEAL
  - LOKI
  - BLOWFISH
  - KASUMI

▷ SPN 구조
  - AES
  - ARIA
  - SHARK
  - SAFER
  - SERPENT
  - CRYPTON
▷ 기타 구조

  - SKIPJACK
  - BEAR
  - LION
  - IDEA

간단하게 제가 알거나 가지고 있는 자료는 이정도 뿐이라 ...이정도 밖에 기술하지 못하지만
세상에는 이보다 더 많은 수의 블록암호가 존재합니다.

아직 언급하지 않은 알고리즘에 대해서는 다음에 기회가 되는대로 다시 언급하도록 하겠습니다.

출처 - http://reinliebe.tistory.com/

'Security > Cryptography' 카테고리의 다른 글

암호학 - Block Cipher :: AES C# 소스  (0) 2011.05.07
암호학 - Block Cipher :: AES  (0) 2011.05.07
암호학 - Block Cipher :: DES C# 소스  (0) 2011.05.07
암호학 - Block Cipher :: DES  (0) 2011.05.07
암호학 - Introduction  (0) 2011.05.07

+ Recent posts