์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
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์ผ๋ก ๋ถ๋ฆฐ๋ค.
<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๋ผ๋ ์ด๋ฆ์ผ๋ก ํ์ค์ผ๋ก ๋ฐํํ์๋ค.
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๋ฅผ ์ฐ์ฐ์ผ๋ก ๊ตฌํด๋ด๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
์ํธํ ํค๋ 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๋นํธ๋ฅผ ํท๊ฐ๋ฆฌ์ง ์๋๋ก ์ฃผ์ํ์.
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๋ฐ์ดํธ ์๋๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
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 ๋ฐ์ ์๋ค.
๋ค๋ง 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]์ด ๋ ๊ฒ์ด๋ค.
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์ด๋ค.
์๋์ ํ๊ฐ 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๋นํธ ๋ธ๋ญ์
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๋ฒ ๋ฏผ๋ค.
4x4 ํ๋ ฌ์ ๋ง๋ ํ ๋ ๋ฒ์งธ ์ค์ ์ผ์ชฝ์ผ๋ก 3๋ฒ, ์ธ ๋ฒ์งธ ์ค์ 2๋ฒ, ๋ค ๋ฒ์งธ ์ค์ 1๋ฒ ๋ฏผ๋ค.
4.5. MixColumns[ํธ์ง]
๋ง์ฐฌ๊ฐ์ง๋ก 4x4 ํ๋ ฌ์ ๋ง๋ ๋ค, ์ด๋ฒ์๋ ์ด ๋จ์์์ ์์ด์ฃผ๋ ๋จ๊ณ์ด๋ค. ์์ ๋ณด๊ธฐ ํธํ๊ฒ ๋ค์์ฒ๋ผ ํ๋ ฌ๋ก ์ฃผ์ด์ง๋ค.
a0 *
a1 *
a2 *
a3 *
์ฌ๊ธฐ์ 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์ ํด ์ฃผ๋ฉด ๋๋ค
a0 *
[2 3 1 1] = r0a1 *
[1 2 3 1] = r1a2 *
[1 1 2 3] = r2a3 *
[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์ธ์ด๋ก ํํํ๋ฉด ์ด๋ ๊ฒ ๋๋ค.
์ด ๊ณผ์ ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํด์ Table-lookup์ ์ ์ฅํด ๋๊ณ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ๋ ์์ผ๋ฉฐ, ๋ชจ๋ AES ์ต์ ํ์๋ ์ด๋ฌํ Table-lookup๋ฐฉ์์ ์ ์ฉํ๋ค.[4]
๋ง์ง๋ง ๋ผ์ด๋์์๋ MixColumns๊ฐ ์๋ค๋ ๊ฑธ ์์ง ๋ง์.
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 *
a1 *
a2 *
a3 *
a0 *
[14 11 13 9] = r0a1 *
[9 14 11 13] = r1a2 *
[13 9 14 11] = r2a3 *
[11 13 9 14] = r34.6. AddRoundKey[ํธ์ง]
๋๋์ด KeyExpansion ๋จ๊ณ์์ ๋ง๋ ๋ผ์ด๋ ํค๋ฅผ ์ธ ๋๊ฐ ๋์๋ค.
128๋นํธ ๋ธ๋ญ์ 128๋นํธ ๋ผ์ด๋ ํค(๋ค ์๋๋ฅผ ์ด์ด๋ถ์ฌ ๋ง๋ )๋ฅผ XORํ๋ค.
XOR์ ํน์ฑ ๋๋ฌธ์, AddRoundKey ๋จ๊ณ๋ ๋ณตํธํํ๋ ๋ฐ ๊ตณ์ด ๋ณ๋์ ์ญ ๊ณต์์ด ํ์ํ์ง ์๊ณ , ๊ฐ์ ๋ผ์ด๋ ํค๋ก XOR์ ํ ๋ฒ ๋ ํ๊ธฐ๋ง ํ๋ฉด ๋ณตํธํ๊ฐ ๋๋ค.
AddRoundKey๋ 0๋ผ์ด๋, 1~(9,11,13), (10,12,14) ๋ผ์ด๋์์ ์คํํ๋ฏ๋ก, ์์์ ์ธ๊ธํ๋ฏ ์ด (11, 13, 15)๊ฐ์ ๋ผ์ด๋ ํค๊ฐ ํ์ํ๋ค.
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]
์ฝ๋๋ก ํํํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์๋ฅผ ๋ค์ด ์๋ฌธ์ด ์๋์ ๊ฐ๊ณ , ๋ธ๋ญ์ ํฌ๊ธฐ๊ฐ 128๋นํธ(16๋ฐ์ดํธ)๋ผ ํ๋ฉด,
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๋นํธ ์ด์์ ์ํธํ ์ฒด๊ณ๋ก ์ ํํ๋ค.
์์๋ฅผ ์ฌ์ฉํ ์ํธํ, 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๋ฅผ ์ฒ๋ฆฌํ๋ค.
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. ๊ธฐํ[ํธ์ง]
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์ผ๋ก ์ค์ธ๋ ์ ์๋ ๊ฐ์ด ๋ถ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฐฉํ๊ธฐ ์ํจ์ด๋ค.