본문으로 바로가기

블록암호(Block Cipher) #AES

category Study/crypto 2018. 4. 25. 00:53


AES(Advanced Encryption Standard)란?


AES란 대칭키 블록암호의 종류로 직역하면 고급 암호화 표준이다. DES가 더이상 안전하지 않게되자 이를 대체하기 위해 NSA가 공개적으로 투명한 연구를 진행하며 선정한 높은 안정성(부르트 포스 방지)과 빠른 속도를 가진 암호 알고리즘이다. DES 처럼 반복되는 암호블록 형식을 띄고 있지만 페이스텔 암호는 아니다.






AES 종류


AES-128 : 블록 크기가 128비트로 9번의 라운드를 반복한다

AES-192 : 블록 크기가 192비트로 11번의 라운드를 반복한다

AES-256 : 블록 크기가 256비트로 13번의 라운드를 반복한다






AES의 구조 및 알고리즘


 


좌측이 암호화 알고리즘, 우측이 복호화 알고리즘이다. 전반적인 루트는 비슷하다.



암호화에서 사용하는 세부적인 알고리즘(각 단계)는 다음과 같다


Add Round Key

Sub Byte

Shift Row

Mix Column



복호화에서 사용하는 세부적인 알고리즘(각 단계)는 다음과 같다


Add Round Key

Inv_Shift Row

Inv_Sub Byte

Inv_Mix Column







Add Round Key


이 과정은 단순히 받아들인 키와 데이터를 XOR연산을 한다


AES-AddRoundKey.png







Sub Byte


이 과정은 각 바이트를 S-box(Substitution Box)에 있는 바이트들과 치환한다

암호화시 S-box는 다음과 같다


---

00

01

02

03

04

05

06

07

08

09

0A

0B

0C

0D

0E

0F

00

0x63

0x7C

0x77

0x7B

0xF2

0x6B

0x6F

0xC5

0x30

0x01

0x67

0x2B

0xFE

0xD7

0xAB

0x76

10

0xCA

0x82

0xC9

0x7D

0xFA

0x59

0x47

0xF0

0xAD

0xD4

0xA2

0xAF

0x9C

0xA4

0x72

0xC0

20

0xB7

0xFD

0x93

0x26

0x36

0x3F

0xF7

0xCC

0x34

0xA5

0xE5

0xF1

0x71

0xD8

0x31

0x15

30

0x04

0xC7

0x23

0xC3

0x18

0x96

0x05

0x9A

0x07

0x12

0x80

0xE2

0xEB

0x27

0xB2

0x75

40

0x09

0x83

0x2C

0x1A

0x1B

0x6E

0x5A

0xA0

0x52

0x3B

0xD6

0xB3

0x29

0xE3

0x2F

0x84

50

0x53

0xD1

0x00

0xED

0x20

0xFC

0xB1

0x5B

0x6A

0xCB

0xBE

0x39

0x4A

0x4C

0x58

0xCF

60

0xD0

0xEF

0xAA

0xFB

0x43

0x4D

0x33

0x85

0x45

0xF9

0x02

0x7F

0x50

0x3C

0x9F

0xA8

70

0x51

0xA3

0x40

0x8F

0x92

0x9D

0x38

0xF5

0xBC

0xB6

0xDA

0x21

0x10

0xFF

0xF3

0xD2

80

0xCD

0x0C

0x13

0xEC

0x5F

0x97

0x44

0x17

0xC4

0xA7

0x7E

0x3D

0x64

0x5D

0x19

0x73

90

0x60

0x81

0x4F

0xDC

0x22

0x2A

0x90

0x88

0x46

0xEE

0xB8

0x14

0xDE

0x5E

0x0B

0xDB

A0

0xE0

0x32

0x3A

0x0A

0x49

0x06

0x24

0x5C

0xC2

0xd3

0xAC

0x62

0x91

0x95

0xE4

0x79

B0

0xE7

0xC8

0x37

0x6D

0x8D

0xD5

0x4E

0xA9

0x6C

0x56

0xF4

0xEA

0x65

0x7A

0xAE

0x08

C0

0xBA

0x78

0x25

0x2E

0x1C

0xA6

0xB4

0xC6

0xE8

0xdD

0x74

0x1F

0x4B

0xBD

0x8B

0x8A

D0

0x70

0x3E

0xB5

0x66

0x48

0x03

0xF6

0x0E

0x61

0x35

0x57

0xB9

0x86

0xC1

0x1D

0x9E

E0

0xE1

0xF8

0x98

0x11

0x69

0xD9

0x8E

0x94

0x9B

0x1E

0x87

0xE9

0xCE

0x55

0x28

0xDF

F0

0x8C

0xA1

0x89

0x0D

0xBF

0xE6

0x42

0x68

0x41

0x99

0x2D

0x0F

0xB0

0x54

0xBB

0x16



복호화시 Inv_S-box는 다음과 같다


---

00

01

02

03

04

05

06

07

08

09

0A

0B

0C

0D

0E

0F

00

0x52

0x09

0x6A

0xD5

0x30

0x36

0xA5

0x38

0xBF

0x40

0xA3

0x9E

0x81

0xF3

0xD7

0xFB

10

0x7C

0xE3

0x39

0x82

0x9B

0x2F

0xFF

0x87

0x34

0x8E

0x43

0x44

0xC4

0xDE

0xE9

0xCB

20

0x54

0x7B

0x94

0x32

0xA6

0xC2

0x23

0x3D

0xEE

0x4C

0x95

0x0B

0x42

0xFA

0xC3

0x4E

30

0x08

0x2E

0xA1

0x66

0x28

0xD9

0x24

0xB2

0x76

0x5B

0xA2

0x49

0x6D

0x8B

0xD1

0x25

40

0x72

0xF8

0xF6

0x64

0x86

0x68

0x98

0x16

0xD4

0xA4

0x5C

0xCC

0x5D

0x65

0xB6

0x92

50

0x6C

0x70

0x48

0x50

0xFD

0xED

0xB9

0xDA

0x5E

0x15

0x46

0x57

0xA7

0x8D

0x9D

0x84

60

0x90

0xD8

0xAB

0x00

0x8C

0xBC

0xD3

0x0A

0xF7

0xE4

0x58

0x05

0xB8

0xB3

0x45

0x06

70

0xD0

0x2C

0x1E

0x8F

0xCA

0x3F

0x0F

0x02

0xC1

0xAF

0xBD

0x03

0x01

0x13

0x8A

0x6B

80

0x3A

0x91

0x11

0x41

0x4F

0x67

0xDC

0xEA

0x97

0xF2

0xCF

0xCE

0xF0

0xB4

0xE6

0x73

90

0x96

0xAC

0x74

0x22

0xE7

0xAD

0x35

0x85

0xE2

0xF9

0x37

0xE8

0x1C

0x75

0xDF

0x6E

A0

0x47

0xF1

0x1A

0x71

0x1D

0x29

0xC5

0x89

0x6F

0xB7

0x62

0x0E

0xAA

0x18

0xBE

0x1B

B0

0xFC

0x56

0x3E

0x4B

0xC6

0xD2

0x79

0x20

0x9A

0xDB

0xC0

0xFE

0x78

0xCD

0x5A

0xF4

C0

0x1F

0xDD

0xA8

0x33

0x88

0x07

0xC7

0x31

0xB1

0x12

0x10

0x59

0x27

0x80

0xEC

0x5F

D0

0x60

0x51

0x7F

0xA9

0x19

0xB5

0x4A

0x0D

0x2D

0xE5

0x7A

0x9F

0x93

0xC9

0x9C

0xEF

E0

0xA0

0xE0

0x3B

0x4D

0xAE

0x2A

0xF5

0xB0

0xC8

0xEB

0xBB

0x3C

0x83

0x53

0x99

0x61

F0

0x17

0x2B

0x04

0x7E

0xBA

0x77

0xD6

0x26

0xE1

0x69

0x14

0x63

0x55

0x21

0x0C

0x7D




테이블 사용법은 아래와 같이 4bit씩 확인하면 된다


AES S-box.png





Shift Row


각 행들을 시프트 연산을 하는 과정이다. 한 행이 내려갈 수록 시프트 크기가 1씩 커진다


아래는 암호화시 행해지는 shift row 과정이다


 

 

 

 

--- Left Shift 0 -->

    

 

 

 

 

--- Left Shift 1 -->

    

 

 

 

 

--- Left Shift 2 -->

    

 

 

 

 

--- Left Shift 3 -->

    


암호화 시에는 0,1,2,3 순으로 시프트가 이루어지고, 복호화 시에는 0,3,2,1 순으로 이루어진다.






Mix Columns


이 단계가 이해하기까지 가장 오래걸렸다. 아래 과정을 보자


AES-MixColumns.png


a를 c와 연산하여 b를 도출한다. 이때 이 특수연산은 다음과 같다 (위의 c행렬은 아래의 [2 3 1 1 ... ] 과 같다)


aes mix columns에 대한 이미지 검색결과


위의 그림에서 볼 수 있듯이 a[0] * [ 2 3 1 1 ] = r[0] 와 같은 방식으로 진행된다

위의 연산에서 곱하기를 AES에서는 x2 연산(xtime 방식)과 +1 연산을 통해 구현된다


예를 들자면 x3의 경우 x2+1 이런식으로 구현될 수 있다는 말과 같다

최근에는 속도 향상을 위해 계산과정 없이 거대한 룩업 테이블을 이용해서 치환한다고 한다






'Study > crypto' 카테고리의 다른 글

블록암호(Block Cipher) #DES  (4) 2018.04.23
블록암호(Block Cipher) #페이스텔(Feistel)  (0) 2018.04.22
스트림 암호(Stream Cipher) #RC4  (2) 2018.04.22
스트림 암호(Stream Cipher) #A5/1  (0) 2018.04.22
암호분석(Crytanalysis)  (0) 2018.04.22