๐Ÿ”’AES์— ๋Œ€ํ•˜์—ฌ

t1mmyt1mยท2022๋…„ 3์›” 9์ผ
2

AES๋ž€?

: ๋Œ€์นญํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ 1997๋…„ NIST(๋ฏธ๊ตญ ๊ตญ๋ฆฝ๊ธฐ์ˆ ํ‘œ์ค€์›)์—์„œ DES๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด Advanced Encryption Standard(AES)๋กœ ๋ถˆ๋ฆฌ๋Š” ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ชจํ•˜์˜€๋‹ค. ์ดํ›„ ๋ ˆ์ธ๋‹ฌ์ด ๊ฐœ๋ฐœํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด AES๋กœ ์ฑ„ํƒ๋˜์—ˆ๊ณ  ๋†’์€ ์•ˆ์ „์„ฑ๊ณผ ํšจ์œจ์„ฑ, ์†๋„ ๋“ฑ์œผ๋กœ ์ธํ•ด DES ๋Œ€์‹  ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

AES์—๋Š” 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ AES-128, AES-192, AES-256์œผ๋กœ ๋ถˆ๋ฆฌ๋ฉฐ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ํ‚ค ํฌ๊ธฐ๊ฐ€ 128, 192, 256 bit์ด๋‹ค.

DES๋Š” Feistel ๋„คํŠธ์›Œํฌ๋ผ๋Š” ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ AES์—์„œ๋Š” SPN ์ด๋ผ๋Š” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.


spn: Subsititution Layer๊ณผ Pernutation์„ ์ด์šฉํ•˜์—ฌ Confusion๊ณผ Diffusion์„ ๋งŒ์กฑ์‹œ์ผœ์ฃผ๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์ด ๊ตฌ์กฐ์˜ ์žฅ์ ์€ Feistal ๊ตฌ์กฐ์™€ ๋ฐ˜๋Œ€๋กœ ๋ณ‘๋ ฌ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ๋‹จ์ ์€ ๋ณตํ˜ธํ™”์‹œ ๋ณ„๋„์˜ ๋ณตํ˜ธํ™” ๋ชจ๋“ˆ์„ ๊ตฌํ˜„ํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

AES ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋™์ž‘๊ณผ์ •

1. SubBytes ๊ณผ์ • (๋ฐ”์ดํŠธ ๋Œ€์ฒด)

: ์•”ํ˜ธ๋ฌธ์ด ๋น„ ์„ ํ˜•์„ฑ์„ ๊ฐ–๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์—ญ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•œ S-box๋ผ๋Š” ํ‘œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ธ”๋ก์„ ๊ตํ™˜ํ•œ๋‹ค.

2. ShiftRows ๊ณผ์ • (ํ–‰ ์ด๋™)

: Shift ์—ฐ์‚ฐ์„ ํ•˜์—ฌ ๋‹จ์ˆœํžˆ ํ–‰๊ณผ ํ–‰์„ ์น˜ํ™˜ํ•˜๋Š”๋ฐ 4๊ฐœ์˜ ํ–‰์€ ๊ฐ๊ฐ ์™ผ์ชฝ์œผ๋กœ Shift๋˜์ง€๋งŒ ์ฒซ๋ฒˆ์งธ ํ–‰์€ ๊ทธ ํ–‰์˜ ๋งจ ์˜ค๋ฅธ์ชฝ ๊ฐ’์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

void ShiftRows()
{
    unsigned char temp;
    // Rotate first row 1 columns to left
    temp = state[1][0];
    state[1][0] = state[1][1];
    state[1][1] = state[1][2];
    state[1][2] = state[1][3];
    state[1][3] = temp;
    // Rotate second row 2 columns to left
    temp = state[2][0];
    state[2][0] = state[2][2];
    state[2][2] = temp;
    temp = state[2][1];
    state[2][1] = state[2][3];
    state[2][3] = temp;
    // Rotate third row 3 columns to left
    temp = state[3][0];
    state[3][0] = state[3][3];
    state[3][3] = state[3][2];
    state[3][2] = state[3][1];
    state[3][1] = temp;
}

3. Mixcolumn ๊ณผ์ • (์—ด ์„ž๊ธฐ)

: ์—ด ๋‹จ์œ„ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์—ด์— ์†ํ•œ ๋ชจ๋“  ๋ฐ”์ดํŠธ๋ฅผ ์ˆœํ™˜ ํ–‰๋ ฌ์„ ์‚ฌ์šฉํ•ด ํ•จ์ˆ˜๋กœ ์—ด์— ์žˆ๋Š” ๊ฐ ๋ฐ”์ดํŠธ๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ๋ณ€ํ™”์‹œํ‚จ๋‹ค. ์ฐธ๊ณ ๋กœ ๋งˆ์ง€๋ง‰ ๋ผ์šด๋“œ๋Š” MixColumn์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค

// xtime is a macro that finds the product of {02} and the argument to xtime modulo {1b}
#define xtime(x)   ((x<<1) ^ (((x>>7) & 1) * 0x1b))
// MixColumns function mixes the columns of the state matrix
// The method used may look complicated, but it is easy if you know the underlying theory.
// Refer the documents specified above.
void MixColumns()
{
    int i;
    unsigned char Tmp, Tm, t;
    for (i = 0; i<4; i++)
    {
        t = state[0][i];
        Tmp = state[0][i] ^ state[1][i] ^ state[2][i] ^ state[3][i];
        Tm = state[0][i] ^ state[1][i]; Tm = xtime(Tm); state[0][i] ^= Tm ^ Tmp;
        Tm = state[1][i] ^ state[2][i]; Tm = xtime(Tm); state[1][i] ^= Tm ^ Tmp;
        Tm = state[2][i] ^ state[3][i]; Tm = xtime(Tm); state[2][i] ^= Tm ^ Tmp;
        Tm = state[3][i] ^ t; Tm = xtime(Tm); state[3][i] ^= Tm ^ Tmp;
    }
}

4. AddRoundKey ๊ณผ์ • (๋ผ์šด๋“œ ํ‚ค ๋”ํ•˜๊ธฐ)

: ๋ผ์šด๋“œ ํ‚ค์™€ ํ˜„์žฌ state ๋ธ”๋ก์„ ๋น„ํŠธ๋ณ„๋กœ XOR ํ•œ๋‹ค.RoundKey๋Š” key expansion schedule์— ๋”ฐ๋ผ key๋กœ๋ถ€ํ„ฐ ์œ ๋„๋˜์–ด์ง„๋‹ค.

// This function adds the round key to state.
// The round key is added to the state by an XOR function.
void AddRoundKey(int round)
{
    int i, j;
    for (i = 0; i<4; i++)
        for (j = 0; j<4; j++)
            state[j][i] ^= RoundKey[round * Nb * 4 + i * Nb + j];
}

5. AES ์•”ํ˜ธํ™”, ๋ณตํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ฐธ๊ณ ) ๋Œ€์นญํ˜• ์•Œ๊ณ ๋ฆฌ์ฆ˜

:์•”ํ˜ธํ™” ํ•  ๋•Œ์˜ key์™€ ๋ณตํ˜ธํ™” ํ•  ๋•Œ์˜ key ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๋Œ€์นญํ‚ค๋ผ๊ณ  ํ•œ๋‹ค. ๋Œ€์นญํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธํ™”๋ฅผ '๋Œ€์นญํ˜• ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜'์ด๋ผ๊ณ  ํ•˜๊ณ  ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” SEED, DES, DES3, AES ๋“ฑ์ด ์žˆ๋‹ค.

๋Œ€์นญ ์•”ํ˜ธํ™” ๋ฐฉ์‹

์ž์‹ ์˜ ํ‚ค๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ์•”ํ˜ธํ™”๋ผ๊ณ  ํ‚ค๋ฅผ ์ˆ˜์‹ ์ž์—๊ฒŒ ๋ณด๋‚ด๋ฉด ํ‚ค๋ฅผ ์ด์šฉํ•ด ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ‚ค๋ฅผ ๊ณต์œ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‚ค๊ฐ€ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜๋ฉด ๋ณด์•ˆ์— ์ทจ์•ฝํ•ด์ง€์ง€๋งŒ ๋น„๋Œ€์นญ ์•”ํ˜ธํ™” ๋ฐฉ์‹์— ๋น„ํ•ด ํ‚ค ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌ์กฐ๊ฐ€ ๊ฐ„๋‹จํ•ด์„œ ์†๋„๊ฐ€ ๋นจ๋ผ ํšจ์œจ์ ์ด๋‹ค.

Reference
https://developer-mac.tistory.com/59
https://www.crocus.co.kr/1230
https://gaeko-security-hack.tistory.com/106

0๊ฐœ์˜ ๋Œ“๊ธ€