고급 암호화 표준

From The Hidden Wiki
(Redirected from AES 암호화)
Jump to navigationJump to search

개요

고급 암호화 표준은 Advanced Encryption Standard, 줄여서 AES라고 흔히 불린다. 벨기에의 2명의 암호학자, 존 대먼과, 빈센트 라이먼이 만든 암호화 알고리즘이다. NIST가 제정한 알고리즘이다. 미국 정부가 채택한 후, 인기를 얻어 많이 사용되고 있다.

역사

NIST(National Institute for Standards and Testing)가 기밀문서를 안전하게 암호화 시켜서 보호하기 위해 DES 암호화 알고리즘을 대체할 새로운 암호화 알고리즘을 찾기 시작했다 [* DES는 몇몇 수퍼 컴퓨터에 의하여 더이상 안전하지 않다는 결과가 나왔다.]. 그러다 AES라는 암호화 알고리즘이 나온 것이다. NIST는 1998년 8월 20일에 First AES Candidate를 개최하였고[* 이 행사때 후보에 들어간 암호화 알고리즘은 15개가 된다.], 1999년 3월에 Second ARS Candidate Conference를 개최하였고, 1999년 8월에 5개의 암호화 알고리즘이 후보로 추가되었다 [* 암호화 알고리즘들은 MARS, RC6, Rijndael(레인달), Serpent, Twofish 였다.]. 결국, AES를 위한 암호화 알고리즘은 레인달이 뽑혔다[* 암호화 알고리즘 후보는 보안성이 좋아야 했었고, 비용도 적게 들고, 유연하면서 간단해야 했다. Rijndael이 뽑힌 이유는 다른 암호화 알고리즘이 안 좋아서가 아니다. 다른 알고리즘도 좋기는 하나, 레인달이 유난히 더 좋아서라고 카더라.]. 이후 ~~2001년 2월 28일~~, 기밀문서를 암호화 할 때, DES를 대체하여 많이 사용되기 시작되었다.

알고리즘

AES암호화에 사용되는 단계들이다.

SubBytes

바이트들을 S-Box에 있는 바이트들과 바꾸는 부분이다.

ShiftRows

바이트의 행을 뒤집는 부분이다.

|| 0x30 || 0x6F || 0x3E || 0x20 || || 0x50 || 0x52 || 0x62 || 0x45 || || 0x66 || 0x7E || 0x21 || 0x30 || || 0x5A || 0x3C || 0x48 || 0x32 ||

이런 식으로, 바이트가 있다면,

|| 0x30 || 0x6F || 0x3E || 0x20 || || 0x52 || 0x62 || 0x45 || 0x50 || || 0x21 || 0x30 || 0x66 || 0x7E || || 0x32 || 0x5A || 0x3C || 0x48 ||

이런 식으로 바뀐다. 첫번째 줄은 안 바뀐다. 두번째 줄부터 바이트의 순서가 바뀐다. 보다시피, 1줄씩 밀렸다. 0x52가 0x50이 있던 자리로 가고, 0x62가 0x52가 있던 자리로 가고, 0x45가 0x62가 있던 자리로 이동하고, 0x50이 0x45가 있던 자리로 간다. 세번째 같은 경우는, 두번째가 이동했던 것처럼 2번을 이동한다. 네번째는 세번째가 이동한 것보다 한 번 더 움직인다.

MixColumns

이 단계에서는, 특수한 공식이 사용된다.

a0 * 2 3 1 1 -> r0 a1 * 1 2 3 1 -> r1 a2 * 1 1 2 3 -> r2 a3 * 3 1 1 2 -> r3 ~~퀄리티가 낮은 건 양해 부탁한다.~~

여기서 r값들을 구하려면, 이런 식으로 해야한다.

r0 = (a0 * 2) + (a1 * 3) + (a2 * 1) + (a3 + 1). r1 = (a0 * 1) + (a1 * 2) + (a2 * 3) + (a3 + 1). r2 = (a0 * 1) + (a1 * 1) + (a2 * 2) + (a3 + 3). r3 = (a0 * 3) + (a1 * 1) + (a2 * 1) + (a3 + 2).

근데, 여기서 곱하기는 절대로 초등학교 수학에서나 나오던 곱하기가 아니다. Exclusive-OR, 또는 XOR을 특별하게 사용해야 한다.

AddRoundKey

이 단계는 다른 단계와는 비해 간단하다. 비트 연산자인, XOR연산자를 사용하면된다. 예를 들어, 0x0A ⊕ 0x03 같은 경우에는, 0x09다 [* 빼기 아니다.].

1010 -> 0x0A 0011 -> 0x03


1001 -> 0x09

이런 식으로, 이진수로 바꾸어서 계산할 때, 서로 비트가 다르면 1, 같으면 0이 된다.

특징

128-bit, 192-bit, 그리고 256-bit 키 길이로 처리한다.

프로그래밍 언어 API

wiki:"Java" 자바 API에 java.security 패키지와, javax.crypto 패키지를 사용하여 AES 암호화를 사용할 수 있다 ~~뭐, wiki:"Java" 자바는 API자체 크기가 wiki:"크고 아름다운" 크고 아름다우니.~~ [* JSP는 웹서버 스크립트가 자바이기 때문에 당연히 지원한다.]. [여기를 참고하면 될 듯하다.]

wiki:"C(프로그래밍 언어)" C/C++ 같은 경우는, 기본 라이브러리에는 없는 듯 하다 [* C/C++언어의 기본 라이브러리는 기초적인 것만 있다. 절대 그 이상이 있는 건 존재하지 않는다.]. 3rd Party Software나, 다른 API는 구글에 검색만 해도 다 나오니 필요하면 검색해 보자.

PHP 언어도 지원하는 듯 하다 ~~확실하지는 않으니, 다르면 수정바람~~. 자바와 마찬가지로, [여기를 참고하면 될 듯하다.]

C#]은 지원한다. System.Security.Cryptography 클래스를 사용하면 된다. 설명은 [이곳을] 참고하면 된다.

안전성

미국 정부가 채택하여 기밀문서를 암호화를 했다. 즉, 정부가 믿을 정도라는 것이다.

기타

Rijndael은 AES를 만든 암호학자 이름에서 따온 것이라고 한다.

개요

Template:출처 필요 Template:정리 필요 고급 암호화 표준(AES, Advanced Encryption Standard)은 2001년 미국 표준 기술 연구소(NIST)에 의해 제정된 암호화 방식이다. AES는 두 명의 벨기에 암호학자인 존 대먼빈센트 라이먼에 의해 개발된 Rijndael(레인달, [rɛindaːl]) 암호에 기반하며 AES 공모전에서 선정되었다.

AES는 미국 정부가 채택한 이후 전 세계적으로 널리 사용되고 있다. 1977년 공표된 DES를 대체한 AES는, 암호화와 복호화 과정에서 동일한 키를 사용하는 대칭 키 알고리즘이다.

미국 표준 기술 연구소(NIST)는 2001년 11월 26일 AES를 미국 연방 정보 처리 표준(FIPS-197)으로 공포하였다. NIST는 5년의 표준화 과정을 거쳤으며 이 과정에서 15개의 알고리즘이 경쟁, Rijndael 암호가 가장 적합한 알고리즘으로 선정되었다. 이 표준은 2002년 5월 26일부터 효력을 발휘하기 시작했다. AES는 ISO/IEC 18033-3 표준에 포함되어 있으며 여러 암호화 패키지에서 사용되고 있다. AES는 또한 미 국가안보국에 의해 1급비밀(Top Secret)에 사용할 수 있도록 승인된 알고리즘 중 최초로 공개되어 있는 알고리즘이다.

Rijndael알고리즘의 개발자인 존 데이먼(Joan Daemen)과 빈센트 라이먼(Vincent Rijmen)의 이름을 따서 지은 것으로 AES 표준은 여러 Rijndael 알고리즘 중 블록 크기가 128비트인 알고리즘을 말한다.

개요

1997년 1월 2일 미국국립표준원(NIST)에서는 DES를 대체할 목적으로 암호알고리즘을 제안받았으며 DES를 대체할 암호를 공모하였으며 암호의 정식 명칭은 1997년 9월 2일 AES(Advanced Encryption Standard)로 하기로 정해졌다. NIST의 암호 요구 사항은 128비트 블록을 128혹은 192혹은 256비트 키 길이로 처리할 수 있는 암호 알고리즘을 요구 하였다. 뿐만 아니라 로열티 측면에서도 무료로 배포 할 수 있는 알고리즘이어야 했다. (NIST의 이러한 요구안은 암호론의 Kerckhoffs' principle 에 기반한 것이다.) 1998년 1월 15일까지 제안할 수 있었으며 21개의 암호 알고리즘이 제안되었고 그 중 15개 암호 알고리즘이 AES 후보로 선정되어 안전성을 평가 받았다. NIST는 15개의 암호 알고리즘에 대하여 "First AES Candidate Conference"를 1998년 8월 20일에 개최 하였고 "Second ARS Candidate Conference"를 1999년 3월에 개최하였으며 이후, 1999년 8월에는 5개의 후보 알고리즘을 최종 후보로 선정하여 많은 암호학자들로 부터 안전성 평가를 받게 하였다. 이 때, 남은 5개 알고리즘의 이름은 MARS, RC6, Rijndael, Serpent, Twofish 였다. 그리고 2000년 4월 "Third AES Candidate Conference"이 개최되고 2000년 10월 2일 AES 알고리즘으로 Rijndael을 선정 하였다. 이어 NIST는 2001년 2월 28일에 연방 정보 처리 표준으로 AES를 공개/리뷰/배포 하면서 기밀성있는 정보에 DES를 대체하여 AES를 사용하기 시작한다. 2001년 11월 16일에는 표준으로 채택되었으며 2001년 12월 4일에는 FIPS 197로 등록 되었다.

AES 선정과정에서 주목해야할 점은 개방성과 국제 흐름을 반영하였다는 점이다. 세 번의 conference와 많은 사람들(전문가/비전문가)의 코멘트를 공개/반영 하였으며 피드백의 기회를 부여하고 다함께 이슈에 대하여 토론하는 과정이 있었다. 뿐만아니라 다양한 분야의 전문가들의 의견이 반영 되었다. 수학자, 컴퓨터 학자, 암호학자, 공학자등 다양한 분야의 전문가들이 의견을 적극적으로 반영하여 안전하면서도 훌륭한 퍼포먼스를 갖는 알고리즘을 선택할 수 있었다. 국제화 측면에서 AES는 15개의 후보 알고리즘의 저자들의 국적 만큼이나 다양한 국가의 평가를 받았다. 당시 알고리즘 안전성 평가에 적극적이었던 국가로는 대한민국을 비롯하여 일본, 이스라엘, 독일, 프랑스, 코스타리카, 케나다, 벨기에, 호주. 노르웨이, 영국, 미국이 있었다. Rijndael은 Daemen과 Rijndael이라는 두 명의 벨기에 연구원에 의해 설계 되었다. AES 선정과정에서 재밌는 점중 다른 하나는 Second AES Candidate Conference가 미국이 아닌 이탈리아 로마에서 개최되었다는 점이다. AES 후보 알고리즘들은 다음과 같은 세가지 조건을 만족해야 했다.

  • 안전성(security)
  • 비용(cost)
  • 알고리즘 및 구현 특성(algorithm and implementation characteristics)

"안전성"은 절대적으로 갖춰야 하는 부분이었으며 특히 당시 대칭키 암호를 분석하는 방법인 '선형 공격(linear cryptanalysis)'와 '차분 공격(Differential cryptanalysis)'에 대한 안전성 증명이 주를 이루었다.

"비용"은 '스마트 카드, 하드웨어, 소프트웨어, 구현'을 위한 다양한 형태의 계산효율성(computational efficiency)을 참고하여 평가 되었다. 여기서 계산효율성이라고 하는 것은 속도 및 메모리 요구량(speed and memory requirement)등을 의미 하였다.

"알고리즘 및 구현 특성"은 유연성(Flexibility)와 알고리즘의 단순성(simplicity)을 주로 평가 하였다.

마지막 평가과정에서 남았던 5개의 알고리즘중 4개의 알고리즘은 탈락했지만 안전성이 떨어지는 알고리즘은 절대 아니였다.

다만 Rijndael의 알고리즘이 안전성, 속도, 효율성, 구현 및 유연성이 다른 알고리즘들 보다 우수했을 뿐이다.<ref>

Douglas R. Stinson, 《Cryptography Theory and Practice 3rd edition》, Chanpman & Hall/CRC, 2006, pp. 102-103</ref>

주석

<references/>

같이 보기

  • SEED — AES와 유사하며 대한민국에서 개발한 블록 암호 형식.
  • Botan - AES에 사용되는 라이브러리의 하나.

Template:블록 암호.