์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.


1. ์†Œ๊ฐœ2. ์—ญ์‚ฌ3. ํŠน์ง•4. ์•Œ๊ณ ๋ฆฌ์ฆ˜
4.1. ๊ฐœ์š”4.2. KeyExpansion
4.2.1. ๊ฐœ๊ด€4.2.2. RotWord & SubWord4.2.3. Rcon, Round Constant
4.3. SubBytes
4.3.1. InvSubBytes
4.4. ShiftRows
4.4.1. InvShiftRows
4.5. MixColumns
4.5.1. InvMixColumns
4.6. AddRoundKey4.7. ์ด ์™ธ
4.7.1. BASE64 ์ธ์ฝ”๋”ฉ4.7.2. PKCS#7 ํŒจ๋”ฉ
5. ์•ˆ์ „์„ฑ6. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด API7. ๊ธฐํƒ€8. ๊ด€๋ จ ๋ฌธ์„œ

1. ์†Œ๊ฐœ[ํŽธ์ง‘]

fFgx/YKxIRcNIQwkmcWzMw==
๋‹จ์–ด namu.wiki๋ฅผ ์•”ํ˜ธ umanle๋กœ 256bit AES๋ฐฉ์‹์œผ๋กœ ์•”ํ˜ธํ™”ํ•œ ๋ฌธ์žฅ
์ค€๋ฌธ์„œ : FIPS-197.

<Advanced Encryption Standard>๋ฅผ ์ค„์ธ ๋ง์ด๋‹ค. ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋ฉด '๊ณ ๊ธ‰ ์•”ํ˜ธํ™” ํ‘œ์ค€'์ด๋‹ค. ๋Œ€์นญํ‚ค๋ฅผ ์“ฐ๋Š” ๋ธ”๋Ÿญ ์•”ํ˜ธ์ด๋‹ค. ๋†’์€ ์•ˆ์ „์„ฑ๊ณผ ์†๋„๋กœ ์ธํ•ด ์ธ๊ธฐ๋ฅผ ์–ป์–ด ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋žœ์„ฌ์›จ์–ด์—๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

ํ˜„์žฌ AES๋Š” DES(๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ํ‘œ์ค€)์˜ ๋’ค๋ฅผ ์ด์„ AES(๊ณ ๊ธ‰ ์•”ํ˜ธํ™” ํ‘œ์ค€)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฑธ๊ณ  NIST๊ฐ€ ์ฃผ์ตœํ•œ ๊ณต๋ชจ์ „์—์„œ ์ฑ„ํƒ๋œ Rijndael(๋ ˆ์ธ๋‹ฌ) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์—„๋ฐ€ํ•˜๊ฒŒ๋Š” Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์—ฌ๋Ÿฌ ๊ฐ€๋Šฅ์„ฑ ์ค‘, ์•”ํ˜ธํ™” ๋ธ”๋Ÿญ์˜ ํฌ๊ธฐ๊ฐ€ 128๋น„ํŠธ์ด๋ฉฐ ์•”ํ˜ธํ™” ํ‚ค์˜ ๊ธธ์ด๊ฐ€ 128, 192, 256๋น„ํŠธ์ธ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ AES ํ‘œ์ค€์œผ๋กœ ์ง€์ •๋˜์—ˆ๋‹ค. ๊ฐ๊ฐ AES-128, AES-192, AES-256์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค.

2. ์—ญ์‚ฌ[ํŽธ์ง‘]

AES์ด์ „ NIST๋Š” 1977๋…„์— DES๋ฅผ ํ‘œ์ค€์œผ๋กœ ์ง€์ •ํ•˜์˜€๊ณ  DES๋Š” ์˜ค๋žซ๋™์•ˆ ์•”ํ˜ธํ™”์˜ ํ‘œ์ค€์œผ๋กœ ์ž˜ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 1990๋…„๋Œ€์— ๊ธฐ์ˆ ์˜ ๋ฐœ์ „์œผ๋กœ 56๋น„ํŠธ ํ‚ค๋ฅผ ์“ฐ๋Š” DES๊ฐ€ ๋” ์ด์ƒ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๊ณ [1], DES๋ฅผ 3๋ฒˆ ์‚ฌ์šฉํ•˜๋Š” 3-DES์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋„ ์‚ฌ์šฉ๋˜๊ธฐ๋Š” ํ•˜์˜€์œผ๋‚˜ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ƒˆ๋กœ์šด ์•”ํ˜ธํ™” ํ‘œ์ค€์„ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.

NIST๋Š” 1997๋…„ 1์›”์— AES๋ผ๋Š” ์ด๋ฆ„์˜ ํ‘œ์ค€์„ ์ œ์ •ํ•  ๊ฒƒ์„ ๋ฐœํ‘œํ•˜์˜€๊ณ , 1997๋…„ 9์›”๋ถ€ํ„ฐ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ณต๋ชจ๋ฅผ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์กฐ๊ฑด์€ 128๋น„ํŠธ ๋ธ”๋ก ์•”ํ˜ธ์ด๋ฉฐ, 128, 192, 256๋น„ํŠธ ๊ธธ์ด์˜ ํ‚ค๋ฅผ ์ง€์›ํ•  ๊ฒƒ์ด์—ˆ๋‹ค. ์ด 15๊ฐœ์˜ ํ›„๋ณด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 1998๋…„ 8์›” 20์ผ์˜ ์ฒซ๋ฒˆ์งธ AES ํ›„๋ณด ํ•™์ˆ ๋Œ€ํšŒ(First Advanced Encryption Standard Candidate Conference)์™€ 1999๋…„ 3์›”์˜ ๋‘๋ฒˆ์งธ ํ•™ํšŒ๋ฅผ ๊ฑฐ์น˜๋ฉฐ 5๊ฐœ๋กœ ์ถ”๋ ค์กŒ๋‹ค. MARS, RC6, Rijndael, Serpent, Twofish ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ด์•„๋‚จ์•„ 2000๋…„ 4์›”์˜ ์„ธ๋ฒˆ์งธ ํ•™ํšŒ์—์„œ ๋‹ค๋ฃจ์–ด์กŒ๋‹ค. ๊ฒฐ๊ตญ ์•ˆ์ „์„ฑ, ์œ ์—ฐ์„ฑ, ์„ฑ๋Šฅ ๋“ฑ์„ ์ž˜ ๋งŒ์กฑํ•˜๋Š” Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ตœ์ข…์ ์œผ๋กœ ์ฑ„ํƒ๋˜์—ˆ๊ณ , NIST๋Š” 2001๋…„ 11์›” 26์ผ์— Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜[2]์„ FIPS 197, AES๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ‘œ์ค€์œผ๋กœ ๋ฐœํ‘œํ•˜์˜€๋‹ค.

3. ํŠน์ง•[ํŽธ์ง‘]

๋Œ€์นญํ˜•, ๋ธ”๋Ÿญ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋Œ€์นญํ˜• ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๋‹ค.

์•”ํ˜ธํ™” ํ‚ค๋Š” 128, 192, 256์˜ ์„ธ ๊ฐ€์ง€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ AES-128, AES-192, AES-256์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค. ์•”ํ˜ธํ™” ํ‚ค์˜ ๊ธธ์ด์— ๋”ฐ๋ผ ์‹คํ–‰ํ•˜๋Š” ๋ผ์šด๋“œ์˜ ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ๋ฐ, ๊ฐ๊ฐ 10, 12, 14 ๋ผ์šด๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

S-Box๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •๋œ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์„œ ์•”ํ˜ธ๋ฅผ ๊นจ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. AES๋Š” ์ด๊ฑธ ์ฐฝ์กฐ๋กญ๊ฒŒ ์žฌ๋ฐœ๋ช…ํ•˜์—ฌ ์•”ํ˜ธํ™” ์†๋„๋ฅผ ๋†’์ด๊ณ  ์‹ถ์œผ๋ฉด S-Box๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ•์•„๋†“๊ณ , ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ์ค„์ด๋ ค๋ฉด ์‹คํ–‰์‹œ S-Box๋ฅผ ์—ฐ์‚ฐ์œผ๋กœ ๊ตฌํ•ด๋‚ด๋Š” ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

4. ์•Œ๊ณ ๋ฆฌ์ฆ˜[ํŽธ์ง‘]

AES์˜ ๊ณผ์ •์„ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ๋ณด์—ฌ์ฃผ๋Š” ๋™์˜์ƒ. ์•„๋ž˜์˜ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค๋ฉด ์˜์ƒ๊ณผ ๊ฐ™์ด ๋ณด์ž.

Rijndael(๋ ˆ์ธ๋‹ฌ)์ด AES๋กœ ์ฑ„ํƒ๋˜์—ˆ์œผ๋ฏ€๋กœ ์•„๋ž˜๋Š” Rjindael ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ์„ค๋ช…์ด๊ธฐ๋„ ํ•˜๋‹ค.
์•„๋ž˜ ์„ค๋ช…์—์„œ ๋ธ”๋Ÿญ ํฌ๊ธฐ์ธ 128๋น„ํŠธ์™€, ํ‚ค ๊ธธ์ด์ธ 128, 192, 256๋น„ํŠธ๋ฅผ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์ž.

4.1. ๊ฐœ์š”[ํŽธ์ง‘]

Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํฌ๊ฒŒ ๋ณด์•„ ๋„ค ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  • KeyExpansion : key schedule(ํ‚ค ์Šค์ผ€์ค„)์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. 128, 192 ๋˜๋Š” 256๋น„ํŠธ ๊ธธ์ด์ธ ํ•˜๋‚˜์˜ ์ฃผ ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ๋ฐ›์•„์„œ ์•„๋ž˜ ๋ผ์šด๋“œ๋“ค์—์„œ ์‚ฌ์šฉํ•  ์—ฌ๋Ÿฌ ๊ฐœ์˜ 128๋น„ํŠธ ๋ผ์šด๋“œ ํ‚ค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • 0 ๋ผ์šด๋“œ : ์œ„์˜ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑํ•œ ๋ผ์šด๋“œ ํ‚ค ์ค‘ ์ฒซ๋ฒˆ์งธ ํ‚ค๋ฅผ ์‚ฌ์šฉ, AddRoundKey๋ฅผ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•œ๋‹ค.
  • 1~(9, 11, 13) ๋ผ์šด๋“œ : SubBytes, ShiftRows, MixColumns, AddRoundKey๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค. ์ด๊ฒƒ์„ AES-128, 192, 256์— ๋”ฐ๋ผ ๊ฐ๊ฐ 9๋ฒˆ, 11๋ฒˆ, 13๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ๋งˆ์ง€๋ง‰ (10, 12, 14)๋ฒˆ์งธ ๋ผ์šด๋“œ : SubBytes, ShiftRows, AddRoundKey๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค.

4.2. KeyExpansion[ํŽธ์ง‘]

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ key schedule, ํ‚ค ์Šค์ผ€์ค„์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. ํ•˜๋‚˜์˜ ์ฃผ ์•”ํ˜ธํ™” ํ‚ค๋กœ๋ถ€ํ„ฐ ๋งŽ์€ ๋ผ์šด๋“œ ํ‚ค๋“ค์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค. ์ฃผ ํ‚ค์˜ ๊ธธ์ด์— ๋”ฐ๋ผ ์ด ๋ผ์šด๋“œ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ, ๋งŒ๋“ค์–ด์•ผ ํ•  ๋ผ์šด๋“œ ํ‚ค์˜ ๊ฐฏ์ˆ˜๋„ ๋‹ค๋ฅด๋‹ค. AES-128, 192, 256์— ๋”ฐ๋ผ ๊ฐ๊ฐ 11๊ฐœ, 13๊ฐœ, 15๊ฐœ์˜ ๋ผ์šด๋“œ ํ‚ค๋ฅผ ๋งŒ๋“ ๋‹ค.

Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ผ์šด๋“œ ํ‚ค๋ฅผ ๋งŒ๋“ค ๋•Œ 32๋น„ํŠธ=4๋ฐ”์ดํŠธ=์›Œ๋“œ์”ฉ, ์—ฐ์†์ ์œผ๋กœ ๋งŒ๋“ ๋‹ค. AES๋Š” ์„ธ ๋ฒ„์ „ ๋ชจ๋‘ 128๋น„ํŠธ์˜ ๋ธ”๋ก ์‚ฌ์ด์ฆˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ํ•˜๋‚˜์˜ ๋ผ์šด๋“œ ํ‚ค๋Š” ์ด 4๋ฐ”์ดํŠธ ์›Œ๋“œ๋ฅผ ๋„ค ๊ฐœ ๋ญ‰์ณ์„œ ๋งŒ๋“ ๋‹ค.[3] ๊ทธ๋Ÿฌ๋ฏ€๋กœ AES-128, 192, 256 ๋ฒ„์ „์€ ๊ฐ๊ฐ 44, 52, 60๊ฐœ์˜ 4๋ฐ”์ดํŠธ ์›Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

4.2.1. ๊ฐœ๊ด€[ํŽธ์ง‘]

์ฃผ ํ‚ค์˜ ๊ธธ์ด๋ฅผ 32๋น„ํŠธ๋กœ ๋‚˜๋ˆˆ ๊ฒƒ์„ N์ด๋ผ ํ•˜์ž. ์ฆ‰ ์ฃผ ํ‚ค๊ฐ€ N์›Œ๋“œ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด AES-192๋ผ๋ฉด N=6์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•„์š”ํ•œ ์ด 4R๊ฐœ์˜ ์›Œ๋“œ ์ค‘ i๋ฒˆ์งธ, W(i)๋ฅผ ์ƒ๊ฐํ•˜์ž.
๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ€๋Šฅ์„ฑ์€ ๋‘ ๊ฐ€์ง€์ด๋‹ค.
  • i < N : W(i) = N(i)
  • i >=N : W(i) = W(i-N) XOR RotWord(SubWord(W(i-1))) XOR Rcon(i/N)
์ฆ‰ ์ฒซ N๊ฐœ์˜ ์›Œ๋“œ๋Š” ์ฃผ ํ‚ค๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ด๋‹ค. ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์ด์ „ ์›Œ๋“œ์— RotWord, SubWordํ•œ ๊ฒƒ, N์นธ ์ด์ „์˜ ์›Œ๋“œ, Rcon(i/N) 3๊ฐœ๋ฅผ XORํ•œ ๊ฐ’์œผ๋กœ ์ •ํ•ด์ง„๋‹ค.
๋‹ค๋งŒ N > 6, i % N = 4์ธ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์—๋Š” ์œ„์˜ ์‹๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ W(i) = W(N-i) XOR SubWord(W(i-1))๋กœ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค. AES ํ‘œ์ค€์—๋Š” N์ด 6๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ๊ฐ€ N=8์ธ AES-256 ๋ฐ–์— ์—†๋‹ค.

4.2.2. RotWord & SubWord[ํŽธ์ง‘]

RotWord๋Š” 4๋ฐ”์ดํŠธ ์›Œ๋“œ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ํ•œ ์นธ ๋ฏผ(shift/rotate) ๊ฒƒ์ด๋‹ค. ์ฆ‰ RotWord([89 ab cd ef]) = [ab cd ef 89]์ด๋‹ค.
SubWord๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์•„๋ž˜์— ์„œ์ˆ ํ•  SubBytes๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์œ„์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SubWord([ab cd ef 89]) = [62 bd df a7]์ด ๋  ๊ฒƒ์ด๋‹ค.

4.2.3. Rcon, Round Constant[ํŽธ์ง‘]

ํ‚ค๋ฅผ ๋”๋”์šฑ ์•Œ๊ธฐ ์–ด๋ ต๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์„ž์–ด์ฃผ๋Š” ์ƒ์ˆ˜์ด๋‹ค. ์ด๋ฆ„์€ round constant์ด์ง€๋งŒ, ์ด ๋ผ์šด๋“œ๋Š” AES์˜ ํฐ ํ๋ฆ„์—์„œ ๋งํ•˜๋Š” ๋ผ์šด๋“œ์™€ ๋‹ค๋ฅด๋‹ค! ๊ทธ ๋ผ์šด๋“œ๋Š” 4๊ฐœ์˜ ์›Œ๋“œ๋ฅผ ๋งŒ๋“ค๋•Œ๋งˆ๋‹ค(์ฆ‰ 128๋น„ํŠธ๋งˆ๋‹ค) ๋ฐ”๋€Œ์ง€๋งŒ, ์ด round constant๋Š” N๊ฐœ์˜ ์›Œ๋“œ๋ฅผ ๋งŒ๋“ค๋•Œ๋งˆ๋‹ค ๋‹ค์Œ ๊ฐ’์œผ๋กœ ๋ฐ”๋€๋‹ค. ์ฆ‰ W(i)๋ฅผ ๊ตฌํ•  ๋•Œ์—๋Š” rcon(i/N)์„ ์“ด๋‹ค. ์—ญ์‹œ 4๋ฐ”์ดํŠธ ์›Œ๋“œ์ด๋ฉฐ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค.
  • rcon(k) = [rc(k) 00 00 00]
  • rc(1) = 0x01
  • If rc(k-1) < 0x80 : rc(k) = rc(k-1) * 2
  • If rc(k-1) >= 0x80 : rc(k) = (rc(k-1) * 2) XOR 0x11B

์ฆ‰ ์•„๋žซ์ชฝ 3๋ฐ”์ดํŠธ๋Š” ํ•ญ์ƒ 0์ด๋ฉฐ, ์ฒซ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” 2๋ฐฐ ํ•˜๊ฑฐ๋‚˜ 2๋ฐฐ ํ•œ ์ดํ›„ 0x11B์™€ XORํ•œ ๊ฒƒ์ด๋‹ค. ๊ณ„์‚ฐํ•ด๋ณด๋ฉด ์ฒซ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋Š” 0x01, 02, 04, 08, 10, 20, 40, 80, 1B, 36, ... ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.
Rcon์€ N๊ฐœ์˜ ์›Œ๋“œ๋ฅผ ๋งŒ๋“ค๋•Œ๋งˆ๋‹ค ๋ฐ”๋€Œ๋ฏ€๋กœ, ํ•„์š”ํ•œ ๋ผ์šด๋“œ ํ‚ค์˜ ๊ฐฏ์ˆ˜์™€๋Š” ๋‹ค๋ฅด๋‹ค. ํ•„์š”ํ•œ ์›Œ๋“œ ์ˆ˜๊ฐ€ ๊ฐ๊ฐ 44, 52, 60์ธ AES-128, 192, 256์€ ๊ฐ๊ฐ 4, 6, 8๋กœ ๋‚˜๋ˆ„์–ด๋ณด๋ฉด 10, 8, 7๋ฒˆ์งธ๊นŒ์ง€์˜ Rcon์ด ํ•„์š”ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. AES-128์˜ ๊ฒฝ์šฐ 44๋ผ์šด๋“œ๊ฐ€ ํ•„์š”ํ•œ๋ฐ 10๊ฐœ์˜ Rcon๋งŒ ์“ฐ์ด๋Š” ์ด์œ ๋Š” ์ฒซ N๊ฐœ์˜ ์›Œ๋“œ๋Š” ์ฃผ ํ‚ค๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

4.3. SubBytes[ํŽธ์ง‘]

SubBytes ๋‹จ๊ณ„์—์„œ๋Š” 128๋น„ํŠธ๋ธ”๋Ÿญ ์•ˆ์˜ 16๋ฐ”์ดํŠธ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ, ๊ฐ ๋ฐ”์ดํŠธ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋‚ด์šฉ์œผ๋กœ ์น˜ํ™˜ํ•œ๋‹ค. ์ด๋•Œ ๋ฏธ๋ฆฌ ์ฃผ์–ด์ง„ Rijndael S-Box (Substitution Box)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜์˜ ํ‘œ๊ฐ€ S-Box์ด๋‹ค.
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
00
63
7C
77
7B
F2
6B
6F
C5
30
01
67
2B
FE
D7
AB
76
10
CA
82
C9
7D
FA
59
47
F0
AD
D4
A2
AF
9C
A4
72
C0
20
B7
FD
93
26
36
3F
F7
CC
34
A5
E5
F1
71
D8
31
15
30
04
C7
23
C3
18
96
05
9A
07
12
80
E2
EB
27
B2
75
40
09
83
2C
1A
1B
6E
5A
A0
52
3B
D6
B3
29
E3
2F
84
50
53
D1
00
ED
20
FC
B1
5B
6A
CB
BE
39
4A
4C
58
CF
60
D0
EF
AA
FB
43
4D
33
85
45
F9
02
7F
50
3C
9F
A8
70
51
A3
40
8F
92
9D
38
F5
BC
B6
DA
21
10
FF
F3
D2
80
CD
0C
13
EC
5F
97
44
17
C4
A7
7E
3D
64
5D
19
73
90
60
81
4F
DC
22
2A
90
88
46
EE
B8
14
DE
5E
0B
DB
A0
E0
32
3A
0A
49
06
24
5C
C2
d3
AC
62
91
95
E4
79
B0
E7
C8
37
6D
8D
D5
4E
A9
6C
56
F4
EA
65
7A
AE
08
C0
BA
78
25
2E
1C
A6
B4
C6
E8
dD
74
1F
4B
BD
8B
8A
D0
70
3E
B5
66
48
03
F6
0E
61
35
57
B9
86
C1
1D
9E
E0
E1
F8
98
11
69
D9
8E
94
9B
1E
87
E9
CE
55
28
DF
F0
8C
A1
89
0D
BF
E6
42
68
41
99
2D
0F
B0
54
BB
16

๋งจ ์™ผ์ชฝ ์—ด์ด ๋†’์€ 4๋น„ํŠธ, ๋งจ ์œ—์ชฝ ํ–‰์ด ๋‚ฎ์€ 4๋น„ํŠธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 0x4C๋Š” 40๊ณผ 0C๊ฐ€ ๋งŒ๋‚˜๋Š” ์นธ์˜ 0x29๊ฐ€ ๋œ๋‹ค.

4.3.1. InvSubBytes[ํŽธ์ง‘]

Inverse SubBytes. SubBytes์™€ ๊ฐ™์ง€๋งŒ ๋ณตํ˜ธํ™”๋ฅผ ํ•  ๋•Œ์˜ ๋‹จ๊ณ„์ด๋‹ค. ๋‹น์—ฐํžˆ S-Box๋ฅผ ๋’ค์ง‘์€ Inv S-Box๋ฅผ ์“ด๋‹ค.
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
00
52
09
6A
D5
30
36
A5
38
BF
40
A3
9E
81
F3
D7
FB
10
7C
E3
39
82
9B
2F
FF
87
34
8E
43
44
C4
DE
E9
CB
20
54
7B
94
32
A6
C2
23
3D
EE
4C
95
0B
42
FA
C3
4E
30
08
2E
A1
66
28
D9
24
B2
76
5B
A2
49
6D
8B
D1
25
40
72
F8
F6
64
86
68
98
16
D4
A4
5C
CC
5D
65
B6
92
50
6C
70
48
50
FD
ED
B9
DA
5E
15
46
57
A7
8D
9D
84
60
90
D8
AB
00
8C
BC
D3
0A
F7
E4
58
05
B8
B3
45
06
70
D0
2C
1E
8F
CA
3F
0F
02
C1
AF
BD
03
01
13
8A
6B
80
3A
91
11
41
4F
67
DC
EA
97
F2
CF
CE
F0
B4
E6
73
90
96
AC
74
22
E7
AD
35
85
E2
F9
37
E8
1C
75
DF
6E
A0
47
F1
1A
71
1D
29
C5
89
6F
B7
62
0E
AA
18
BE
1B
B0
FC
56
3E
4B
C6
D2
79
20
9A
DB
C0
FE
78
CD
5A
F4
C0
1F
DD
A8
33
88
07
C7
31
B1
12
10
59
27
80
EC
5F
D0
60
51
7F
A9
19
B5
4A
0D
2D
E5
7A
9F
93
C9
9C
EF
E0
A0
E0
3B
4D
AE
2A
F5
B0
C8
EB
BB
3C
83
53
99
61
F0
17
2B
04
7E
BA
77
D6
26
E1
69
14
63
55
21
0C
7D

SubBytes์—์„œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, 0x29๋ฅผ ๋ณตํ˜ธํ™” ํ•˜๋ฉด 0x4C๊ฐ€ ๋œ๋‹ค.

4.4. ShiftRows[ํŽธ์ง‘]

ShiftRows ๋‹จ๊ณ„์—์„œ๋Š” 128๋น„ํŠธ=16๋ฐ”์ดํŠธ ๋ธ”๋Ÿญ์„ 4x4 ๋ฐ”์ดํŠธ ํ–‰๋ ฌ๋กœ ๋ณด๊ณ  ๊ฐ ํ–‰๋งˆ๋‹ค ์™ผ์ชฝ์œผ๋กœ ๋ฏผ(shift/rotate)๋‹ค. ShiftRows์ฒ˜๋Ÿผ ์—ด์„ ์„œ๋กœ ์„ž์–ด์ฃผ๋Š” ๋‹จ๊ณ„๊ฐ€ ์—†๋‹ค๋ฉด ๊ฐ๊ฐ์˜ ์—ด์ด ์„œ๋กœ ๋”ฐ๋กœ ๋”ฐ๋กœ ์•”ํ˜ธํ™”๋˜์–ด, 4๊ฐœ์˜ ๋ธ”๋Ÿญ ์•”ํ˜ธํ™”๋ฅผ ์‹คํ–‰ํ•œ ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๊ฐ€ ๋˜์–ด ์ข‹์ง€ ์•Š๋‹ค.
16๋ฐ”์ดํŠธ๋ฅผ ํ–‰ ์šฐ์„ ์œผ๋กœ ์•„๋ž˜์˜ ํ‘œ์ฒ˜๋Ÿผ ๋ฐฐ์—ดํ•œ ๋‹ค์Œ, ๋‘๋ฒˆ์งธ ์ค„์€ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ, ์„ธ๋ฒˆ์งธ ์ค„์€ ๋‘ ์นธ, ๋„ค๋ฒˆ์งธ ์ค„์€ ์„ธ ์นธ ๋งŒํผ ๋ฏผ๋‹ค. ์ฒซ๋ฒˆ์งธ ์ค„์€ ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค.
์ฆ‰ ์•„๋ž˜์˜ 128๋น„ํŠธ ๋ธ”๋Ÿญ์€
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
0x09
0x0A
0x0B
0x0C
0x0D
0x0E
0x0F

SubBytes๋ฅผ ์‹คํ–‰ํ•œ ํ›„์—๋Š” ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.
0x00
0x01
0x02
0x03
0x05
0x06
0x07
0x04
0x0A
0x0B
0x08
0x09
0x0F
0x0C
0x0D
0x0E

AES์˜ ๊ฒฝ์šฐ๋Š” 128๋น„ํŠธ ๋ธ”๋Ÿญ๋งŒ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋” ํฐ ๋ธ”๋Ÿญ์„ ๊ฐ–๋Š” Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ์—ด์˜ ์ˆ˜๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉฐ ๋ฏธ๋Š” ๋ฐ”์ดํŠธ์˜ ์ˆ˜๋„ ๋‹ฌ๋ผ์ง„๋‹ค.

4.4.1. InvShiftRows[ํŽธ์ง‘]

Inverse Shift Rows. ์—ญ์‹œ ๋ณตํ˜ธํ™” ํ•  ๋•Œ ํ•„์š”ํ•œ ๋‹จ๊ณ„์ด๋‹ค.
4x4 ํ–‰๋ ฌ์„ ๋งŒ๋“  ํ›„ ๋‘ ๋ฒˆ์งธ ์ค„์€ ์™ผ์ชฝ์œผ๋กœ 3๋ฒˆ, ์„ธ ๋ฒˆ์งธ ์ค„์€ 2๋ฒˆ, ๋„ค ๋ฒˆ์งธ ์ค„์€ 1๋ฒˆ ๋ฏผ๋‹ค.

4.5. MixColumns[ํŽธ์ง‘]

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 4x4 ํ–‰๋ ฌ์„ ๋งŒ๋“  ๋’ค, ์ด๋ฒˆ์—๋Š” ์—ด ๋‹จ์œ„์—์„œ ์„ž์–ด์ฃผ๋Š” ๋‹จ๊ณ„์ด๋‹ค. ์‹์€ ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ๋‹ค์Œ์ฒ˜๋Ÿผ ํ–‰๋ ฌ๋กœ ์ฃผ์–ด์ง„๋‹ค.

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).

๋‹ค๋งŒ ์ด๋•Œ ๋ง์…ˆ์€ ํ‰๋ฒ”ํ•œ ๋ง์…ˆ์ด ์•„๋‹ˆ๋ฉฐ, XOR์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณฑ์…ˆ๋„ ๋ง์…ˆ์ด XOR์ธ ๊ฒƒ์— ๋งž๊ฒŒ ๊ณ„์‚ฐํ•ด ์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋งŒ์•ฝ ๋”ํ•˜๋‹ค๊ฐ€ OverFlow๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด 0x1b์™€ XOR์„ ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค
C์–ธ์–ด๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.
typedef unsigned char byte;
void rijndael_mixcolumn (byte * data, size_t data_len) {
	if ((data_len % 4) != 0)
		return;

	for (size_t i = 0 ; i < data_len ; i += 4) {
		byte copy_arr [4], res [4];

		memcpy (copy_arr, data + i, 4);

		res [0] = (data [0 + i] << 1) ^ (0x1B & ((byte) ((signed char) data [0 + i] >> 7)));
		res [1] = (data [1 + i] << 1) ^ (0x1B & ((byte) ((signed char) data [1 + i] >> 7)));
		res [2] = (data [2 + i] << 1) ^ (0x1B & ((byte) ((signed char) data [2 + i] >> 7)));
		res [3] = (data [3 + i] << 1) ^ (0x1B & ((byte) ((signed char) data [3 + i] >> 7)));

		data [0 + i] = res [0] ^ copy_arr [3] ^ copy_arr [2] ^ res [1] ^ copy_arr [1];
		data [1 + i] = res [1] ^ copy_arr [0] ^ copy_arr [3] ^ res [2] ^ copy_arr [2];
		data [2 + i] = res [2] ^ copy_arr [1] ^ copy_arr [0] ^ res [3] ^ copy_arr [3];
		data [3 + i] = res [3] ^ copy_arr [2] ^ copy_arr [1] ^ res [0] ^ copy_arr [0];
	}
}


์ด ๊ณผ์ •์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด์„œ Table-lookup์— ์ €์žฅํ•ด ๋†“๊ณ  ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  AES ์ตœ์ ํ™”์—๋Š” ์ด๋Ÿฌํ•œ Table-lookup๋ฐฉ์‹์„ ์ ์šฉํ•œ๋‹ค.[4]

๋งˆ์ง€๋ง‰ ๋ผ์šด๋“œ์—์„œ๋Š” MixColumns๊ฐ€ ์—†๋‹ค๋Š” ๊ฑธ ์žŠ์ง€ ๋ง์ž.

4.5.1. InvMixColumns[ํŽธ์ง‘]

Inverse Mix Columns. ์—ญ์‹œ ๋ณตํ˜ธํ™” ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

a0 * [14 11 13 9] = r0
a1 * [9 14 11 13] = r1
a2 * [13 9 14 11] = r2
a3 * [11 13 9 14] = r3

4.6. AddRoundKey[ํŽธ์ง‘]

๋“œ๋””์–ด KeyExpansion ๋‹จ๊ณ„์—์„œ ๋งŒ๋“  ๋ผ์šด๋“œ ํ‚ค๋ฅผ ์“ธ ๋•Œ๊ฐ€ ๋˜์—ˆ๋‹ค.
128๋น„ํŠธ ๋ธ”๋Ÿญ์— 128๋น„ํŠธ ๋ผ์šด๋“œ ํ‚ค(๋„ค ์›Œ๋“œ๋ฅผ ์ด์–ด๋ถ™์—ฌ ๋งŒ๋“ )๋ฅผ XORํ•œ๋‹ค.
XOR์˜ ํŠน์„ฑ ๋•Œ๋ฌธ์—, AddRoundKey ๋‹จ๊ณ„๋Š” ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋ฐ ๊ตณ์ด ๋ณ„๋„์˜ ์—ญ ๊ณต์‹์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ , ๊ฐ™์€ ๋ผ์šด๋“œ ํ‚ค๋กœ XOR์„ ํ•œ ๋ฒˆ ๋” ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ณตํ˜ธํ™”๊ฐ€ ๋œ๋‹ค.

AddRoundKey๋Š” 0๋ผ์šด๋“œ, 1~(9,11,13), (10,12,14) ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๋ฏ€๋กœ, ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ ์ด (11, 13, 15)๊ฐœ์˜ ๋ผ์šด๋“œ ํ‚ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

4.7. ์ด ์™ธ[ํŽธ์ง‘]

4.7.1. BASE64 ์ธ์ฝ”๋”ฉ[ํŽธ์ง‘]

BASE64๋Š” ๋ฐ”์ดํŠธ ์—ด์„ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ์‹์˜ ํ•˜๋‚˜์ผ ๋ฟ์ด๋ฏ€๋กœ ๋ณธ๋ž˜ AES ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋Š” ๊ด€๋ จ์ด ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ AES ์•”ํ˜ธํ™”์˜ ๊ฒฐ๊ณผ๋Š” NULL ๋ฐ”์ดํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ์ด์ง„ ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, C๋ฅผ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ์–ธ์–ด์—์„œ๋Š” ์•”ํ˜ธํ™”์˜ ๊ฒฐ๊ณผ์— BASE64 ์ธ์ฝ”๋”ฉ์„ ํ•ด์„œ ๋‚˜์˜จ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋” ํŽธํ•  ์ˆ˜ ์žˆ๋‹ค.

4.7.2. PKCS#7 ํŒจ๋”ฉ[ํŽธ์ง‘]

AES๊ฐ€ ๋ธ”๋Ÿญ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ๋งŒํผ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ธ”๋Ÿญ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ฒ˜๋Ÿผ ํŒจ๋”ฉ(padding)ํ•˜์—ฌ ๋ธ”๋Ÿญ์˜ ๋นˆ ์ž๋ฆฌ๋ฅผ ์ฑ„์šธ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ PKCS#5์™€ PKCS#7์— ์ •์˜๋œ ํŒจ๋”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค.
PKCS#7 ํŒจ๋”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ธ”๋Ÿญ์˜ ํฌ๊ธฐ๊ฐ€ k๋ฐ”์ดํŠธ(k๋Š” 1~255)์ผ ๋•Œ ํŒจ๋”ฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฐ”์ดํŠธ ๋‹จ์œ„ ๊ธธ์ด๊ฐ€ k์˜ ๋ฐฐ์ˆ˜๊ฐ€ ๋˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋‚˜๋จธ์ง€ ๋ฐ”์ดํŠธ ๊ฐœ์ˆ˜๋ฅผ n์ด๋ผ ํ•˜๋ฉด n์ด๋ผ๋Š” ๊ฐ’์„ n๊ฐœ ๋ง๋ถ™์ธ๋‹ค. ๋‹จ, ๋ฐ”์ดํŠธ ๋‹จ์œ„ ๊ธธ์ด๊ฐ€ ๋”ฑ k์˜ ๋ฐฐ์ˆ˜์ด๋”๋ผ๋„ k๋ผ๋Š” ๊ฐ’์„ k๊ฐœ ๋ง๋ถ™์ธ๋‹ค.[5]

์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
const k = /* 1 ~ 255 */; // blockSize
const n = k - baseDataLen % k; // padSize == padValue

์˜ˆ๋ฅผ ๋“ค์–ด ์›๋ฌธ์ด ์•„๋ž˜์™€ ๊ฐ™๊ณ , ๋ธ”๋Ÿญ์˜ ํฌ๊ธฐ๊ฐ€ 128๋น„ํŠธ(16๋ฐ”์ดํŠธ)๋ผ ํ•˜๋ฉด,
01 02 03 04 05 06 07 08 01 02 04 08 10 20 40 80 00 11 22 33 44 55 66 77 88 99 AA
์ด 27๋ฐ”์ดํŠธ์ด๋ฏ€๋กœ 16์˜ ๋ฐฐ์ˆ˜์ธ 32๋ฐ”์ดํŠธ๊ฐ€ ๋˜๋ ค๋ฉด 5๋ฐ”์ดํŠธ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค.
01 02 03 04 05 06 07 08 01 02 04 08 10 20 40 80
00 11 22 33 44 55 66 77 88 99 AA
๋”ฐ๋ผ์„œ ๋ฐ”์ดํŠธ 0x05๋ฅผ 5๊ฐœ๋งŒํผ ๋’ค์— ๋ง๋ถ™์—ฌ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ๋ธ”๋Ÿญ์„ ๋งŒ๋“ ๋‹ค.
01 02 03 04 05 06 07 08 01 02 04 08 10 20 40 80
00 11 22 33 44 55 66 77 88 99 AA 05 05 05 05 05

PKCS#5 ํŒจ๋”ฉ์€ PKCS#7 ํŒจ๋”ฉ๊ณผ ๊ตฌํ˜„ ๋ฐฉ์‹์ด ๊ฐ™์ง€๋งŒ ๋ธ”๋Ÿญ์˜ ํฌ๊ธฐ๊ฐ€ 8๋ฐ”์ดํŠธ๋กœ ๊ณ ์ •๋œ ๊ฒƒ์ด๋‹ค. AES๋Š” 128๋น„ํŠธ(16๋ฐ”์ดํŠธ) ๋ธ”๋Ÿญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค PKCS#5 ํŒจ๋”ฉ์„ ์“ธ ์ผ์ด ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ PKCS#7 ํŒจ๋”ฉ๊ณผ ๊ตฌํ˜„ ๋ฐฉ์‹์ด ๊ฐ™์•„ ๋ณดํ†ต ๊ฐ™์€ ๊ตฌํ˜„์„ ๋Œ๋ ค์“ฐ๋Š”๋ฐ๋‹ค, Java์—์„œ 'AES/CBC/PKCS5Padding' ํ‘œ๊ธฐ๋ฒ•๋งŒ ํ—ˆ์šฉํ•˜๊ณ  'AES/CBC/PKCS7Padding' ํ‘œ๊ธฐ๋ฒ•์€ ์ง€์›ํ•˜์ง€ ์•Š๋‹ค๋ณด๋‹ˆ ์˜คํžˆ๋ ค AES์— PKCS#5 ํŒจ๋”ฉ์„ ์“ฐ๋Š” ๊ฒƒ์ด ๋งž๋Š” ์ค„ ์•„๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

5. ์•ˆ์ „์„ฑ[ํŽธ์ง‘]

๋ฏธ๊ตญ ์ •๋ถ€๊ฐ€ ์ฑ„ํƒํ•˜์—ฌ ๊ธฐ๋ฐ€๋ฌธ์„œ๋ฅผ ์•”ํ˜ธํ™”๋ฅผ ํ–ˆ๋‹ค. ์ฆ‰, ์ •๋ถ€๊ฐ€ ๋ฏฟ์„ ์ •๋„๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ผ๋‹จ ์•„์ง์€ AES๊ฐ€ ์ตœ๊ฐ•์˜ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ณ , ํ‚ค์—†์ด ํ•ด๋…ํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ฏฟ์–ด์ง€๊ณ  ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ๋‹ค๋ฅธ ์ตœ์‹  cipher์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, known-plaintext ํ•ดํ‚น๊ธฐ์ˆ ๋กœ๋„ ํ•ด๋…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

์†Œ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์•”ํ˜ธํ™”, ECDLP(Elliptic Curve Discrete Logarithm Problem)์˜ ํŠน์„ฑ์„ ์ด์šฉํ•œ ๊ณต๊ฐœํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹ ๋“ฑ์ด ์–‘์ž์ปดํ“จํ„ฐ์— ์ทจ์•ฝํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด์ด์ง€๋งŒ, SPN(Substitution Permutation Network)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” AES์˜ ํŠน์„ฑ์ƒ ์ƒ๋Œ€์ ์œผ๋กœ ์–‘์ž์ปดํ“จํ„ฐ์— ์•ˆ์ „ํ•˜๋‹ค.

์ปดํ“จํŒ… ๊ธฐ์ˆ ์˜ ๊ธ‰์†ํ•œ ๋ฐœ์ „์— ๋”ฐ๋ผ ํ˜„์žฌ ๊ถŒ์žฅ๋˜๋Š” ์•”ํ˜ธํ™” ์ˆ˜์ค€์€ 192๋น„ํŠธ ์ด์ƒ์ด๋ฉฐ ๋Œ€๋‹ค์ˆ˜์˜ ๊ธˆ์œต๊ธฐ๊ด€์ด๋‚˜ ์›น์‚ฌ์ดํŠธ๋“ค์€ 256๋น„ํŠธ ์ด์ƒ์˜ ์•”ํ˜ธํ™” ์ฒด๊ณ„๋กœ ์ „ํ™˜ํ–ˆ๋‹ค.

6. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด API[ํŽธ์ง‘]

์ž๋ฐ” API์— java.security ํŒจํ‚ค์ง€์™€, javax.crypto ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AES ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค ๋ญ, ์ž๋ฐ”๋Š” API์ž์ฒด ํฌ๊ธฐ๊ฐ€ ํฌ๊ณ  ์•„๋ฆ„๋‹ค์šฐ๋‹ˆ. [6]. ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

C/C++๋Š” ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—†๋‹ค.[7]. ์„œ๋“œ ํŒŒํ‹ฐ ์†Œํ”„ํŠธ์›จ์–ด๋‚˜, ๋‹ค๋ฅธ API๋Š” ๊ตฌ๊ธ€์— ๊ฒ€์ƒ‰๋งŒ ํ•ด๋„ ๋‹ค ๋‚˜์˜ค๋‹ˆ ํ•„์š”ํ•˜๋ฉด ๊ฒ€์ƒ‰ํ•ด ๋ณด์ž.

PHP ์–ธ์–ด๋„ ์ง€์›ํ•œ๋‹ค. ์ž๋ฐ”์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

C#์€ ์ง€์›ํ•œ๋‹ค. System.Security.Cryptography ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ System.Security.Cryptography.Aes ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์„ค๋ช…์€ ์ด๊ณณ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

Python์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ง€์›ํ•œ๋‹ค. Crypto ๋ชจ๋“ˆ์—์„œ ์ง€์›ํ•œ๋‹ค. ์ด ๊ณณ์„ ์ฐธ๊ณ ํ•˜์ž. ์•ฝ๊ฐ„ ๊ฐœ๋Ÿ‰๋œ ํ˜•ํƒœ์˜ pycryptodome ๋ชจ๋“ˆ ๋˜ํ•œ ์ง€์›ํ•œ๋‹ค.

Go ์–ธ์–ด๋Š” ์ง€์›ํ•œ๋‹ค. "crypto/aes" ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

Node.js์—์„œ๋Š” crypto ๋ชจ๋“ˆ์„ ์ง€์›ํ•œ๋‹ค. crypto.createCipher ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Assembly ์–ธ์–ด์˜ ๊ฒฝ์šฐ x86์—์„œ๋Š” AES-NI๋ผ๋Š”, AES ์•”ํ˜ธํ™” ๋ณตํ˜ธํ™” ์—ฐ์‚ฐ์„ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†ํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ ๋ช…๋ น์–ด์…‹์„ ์ง€์›ํ•œ๋‹ค. ์ธํ…”์˜ ๊ฒฝ์šฐ ์›จ์ŠคํŠธ๋ฏธ์–ด์—์„œ ์ฒ˜์Œ ์ง€์›ํ–ˆ์œผ๋‚˜ ์„œ๋ฒ„์šฉ Xeon๊ณผ Core i5 ์ด์ƒ์— ํ•œ์ •๋˜์—ˆ์œผ๋ฉฐ, ํ•˜์Šค์›ฐ๋ถ€ํ„ฐ๋Š” Core i3 ์ด์ƒ, ์Šค์นด์ด๋ ˆ์ดํฌ๋ถ€ํ„ฐ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์„œ์—์„œ ์ง€์›ํ•œ๋‹ค. AMD์˜ ๊ฒฝ์šฐ ๋ถˆ๋„์ € ์ดํ›„์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์„œ์—์„œ ์ง€์›ํ•œ๋‹ค.

๋˜ํ•œ x86 ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์•”ํ˜ธํ™” ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‚ฌ์šฉ์ค‘์ผ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ AES-NI ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์‚ฌ์šฉํ•ด์„œ AES๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด OpenSSL์˜ ๊ฒฝ์šฐ x86 ๋Œ€์ƒ์ธ ๊ฒฝ์šฐ AES-NI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AES๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

7. ๊ธฐํƒ€[ํŽธ์ง‘]

Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ด๋ฆ„์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งŒ๋“  ๋‘ ๋ฒจ๊ธฐ์— ์•”ํ˜ธํ•™์ž ๋นˆ์„ผํŠธ ๋ ˆ์ด๋จผ(Vincent Rijmen)๊ณผ ์กฐ์•ค ๋Œ€๋จผ(Joan Daemen)์˜ ์ด๋ฆ„์—์„œ ๋”ฐ์˜จ ๊ฒƒ์ด๋‹ค.
AES์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ๋Š” ๋งŒํ™”. ๋ฌผ๋ก  ์˜์–ด๋‹ค.

8. ๊ด€๋ จ ๋ฌธ์„œ[ํŽธ์ง‘]

[1] 90๋…„๋Œ€ ๋‹น์‹œ์˜ ๋ช‡๋ช‡ ์Šˆํผ ์ปดํ“จํ„ฐ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋ฃจ ์ •๋„์˜ ์‹œ๊ฐ„์„ ์“ฐ๋ฉด DES ์•”ํ˜ธ๋ฅผ ์ถฉ๋ถ„ํžˆ ํ’€์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ ํ˜„์žฌ์˜ ์ธํ…” 9900k ๊ธฐ์ค€์œผ๋กœ ๋Œ€๋žต ๋ฐ˜๋‚˜์ ˆ์ด๋ฉด ํ’€์ˆ˜์žˆ๋‹ค. ๊ณ„์‚ฐ๋ฒ•์€ ๋‹น์‹œ ์‹ฑ๊ธ€ 400MHz CPU 128๊ฐœ ๋ณ‘๋ ฌ์—ฐ์‚ฐ ๊ธฐ์ค€์œผ๋กœ 25.4์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ธฐ์— 9900K 8์ฝ”์–ด 16์Šค๋ ˆ๋“œ๋ฅผ 10์ฝ”์–ด๋กœ ๊ณ„์‚ฐํ• ๊ฒฝ์šฐ ๋Œ€๋žต ๋ฐ˜๋‚˜์ ˆ์ด ๋‚˜์˜จ๋‹ค.
[2] ์˜ 128๋น„ํŠธ ๋ธ”๋ก, 128, 192, 256๋น„ํŠธ ํ‚ค ๋ฒ„์ „
[3] Rijndael ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์“ฐ์ง€๋งŒ ๋ธ”๋ก ์‚ฌ์ด์ฆˆ๊ฐ€ 128๋น„ํŠธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•œ ์›Œ๋“œ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค.
[4] ์ด๋Š” ๋‹น์—ฐํžˆ ์†Œํ”„ํŠธ์›จ์–ด์ ์ธ ์ตœ์ ํ™”๋กœ, ํ•˜๋“œ์›จ์–ด์—์„œ์˜ ์ตœ์ ํ™” ๋ฐฉ์‹๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ตœ์ ํ™”์—์„œ ์ž…๋ ฅ๊ฐ’์— ๋”ฐ๋ผ ์ถœ๋ ฅ๊ฐ’์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ…Œ์ด๋ธ”์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
[5] ๋งˆ์ง€๋ง‰์— 01์ด๋‚˜ 02 02 ๋“ฑ padding์œผ๋กœ ์˜ค์ธ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด ๋ถ™๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
[6] JSP๋Š” ์›น์„œ๋ฒ„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋ฐ”์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ์ง€์›ํ•œ๋‹ค.
[7] C/C++ ์–ธ์–ด์˜ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ธฐ์ดˆ์ ์ธ ๊ฒƒ๋งŒ ์žˆ์œผ๋ฉฐ ๊ทธ ์ด์ƒ์ด ์žˆ๋Š” ๊ฑด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.