| 검색 | ?

hwport_aria

  • 개발자
    조재혁(Mminzkn@minzkn.com)

  • 기록사항
    2010년 어느날 : 첫 기초 구현
    2019년 5월 15일 : 첫 공개


1.1. 개요

ARIA는 경량 환경 및 하드웨어 구현을 위해 최적화된, Involutional SPN 구조를 갖는 범용 블록 암호 알고리즘입니다.

ARIA가 사용하는 대부분의 연산은 XOR과 같은 단순한 바이트 단위 연산으로 구성되어 있습니다. ARIA라는 이름은 Academy(학계), Research Institute(연구소), Agency(정부 기관)의 첫 글자들을 딴 것으로, ARIA 개발에 참여한 학·연·관의 공동 노력을 표현하고 있습니다.

이 라이브러리는 ARIA128, ARIA192, ARIA256을 구현하였으며 각각 ECB 운영모드를 구현했습니다.

1.2. 사용권한

hwport_aria library source 는 수정없이 사용하신다면 누구나 그대로 사용하셔도 좋습니다. 단, source를 수정하셔서 사용하시려고 한다면 해당 수정사항에 대한 부분을 저에게 알려주시길 바랍니다.

1.3. 다운로드

1.4. 사용 예제

    /*
        ARIA256-ECB Test vector => ARIA 비킬키 256bits의 전자 코드북(electronic codebook, ECB) 운영모드의 검증 값
        ======================

        Set 1 vector 1
            mode=aria-256
            key=00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff    <= 비밀 키
            plain=11 11 11 11 aa aa aa aa 11 11 11 11 bb bb bb bb    <= 평문
            cipher=58 a8 75 e6 04 4a d7 ff fa 4f 58 42 0f 7f 44 2d   <= 암호문(검증 값)
    */
        #include "hwport_aria.h"

        uint8_t s_key[ def_hwport_aria256_user_key_size ] = { /* 암호 키 */
            0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
            0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
        };
        uint8_t s_data[ /* def_hwport_aria256_block_size * n */ ] = { /* 평문/암호문 버퍼 */
            0x11, 0x11, 0x11, 0x11, 0xaa, 0xaa, 0xaa, 0xaa, 0x11, 0x11, 0x11, 0x11, 0xbb, 0xbb, 0xbb, 0xbb
        };
        const uint8_t s_cipher[ /* def_hwport_aria256_block_size * n */ ] = { /* 평문을 암호화 했을때의 암호문 결과 기대치 값 (검증 값) */
            0x58, 0xa8, 0x75, 0xe6, 0x04, 0x4a, 0xd7, 0xff, 0xfa, 0x4f, 0x58, 0x42, 0x0f, 0x7f, 0x44, 0x2d
        };
        uint8_t s_round_key[ def_hwport_aria256_round_key_size ]; /* 비밀 키 */

        (void)hwport_dump("key", (const void *)(&s_key[0]), sizeof(s_key)); /* 암호 키 덤프 */

        /* 주어진 s_key(User key, Master Key, Password, ...) 를 s_round_key(Round Key, 라운드 키, 비밀 키)로 확장합니다.
           s_key는 def_hwport_ariaX_user_key_size 상수로 고정된 크기입니다.
           s_round_key는 def_hwport_ariaX_encrypt_round_key_size 와 def_hwport_ariaX_decrypt_round_key_size 가 덧 붙여진 def_hwport_aria256_round_key_size 상수로 고정된 크기입니다.
        */
        (void)hwport_make_round_key_aria256((void *)(&s_round_key[0]), (const void *)(&s_key[0]));
        (void)hwport_dump("round_key", (const void *)(&s_round_key[0]), sizeof(s_round_key)); /* 비밀 키 덤프 */

        (void)hwport_dump("plain", (const void *)(&s_data[0]), sizeof(s_data)); /* 평문 덤프 */

        /* 주어진 평문(s_data)을 비밀 키(s_round_key)로 암호화하여 s_data에 암호문을 저장합니다.
           이 때 주어진 s_data는 def_hwport_aria_block_size 상수로 정렬된 크기를 가져야 합니다.
           만약 주어진 크기가 정렬되지 않은 크기라면 def_hwport_aria_block_size 에 정렬된 크기만큼만 암호화 하고 나머지 부분은 그대로 평문으로 유지됩니다.
        */
        (void)hwport_encrypt_aria256_ecb(
            (void *)(&s_data[0]),
            sizeof(s_data),
            (const void *)(&s_round_key[def_hwport_aria256_encrypt_round_key_offset])
        );

        /* 암호문(s_data)가 검증값와 일치하는지 검사하는 부분 */
        (void)fprintf(stdout, "cipher(encrypted) %s:\n",
            (memcmp((const void *)(&s_data[0]), (const void *)(&s_cipher[0]), sizeof(s_data)) == 0) ? "PASSED" : "FAILED"
        );
        (void)hwport_dump("===>", (const void *)(&s_data[0]), sizeof(s_data)); /* 암호문 덤프 */

        /* 주어진 암호문(s_data)을 비밀 키(s_round_key)로 복호화하여 s_data에 평문을 저장합니다.
           이 때 주어진 s_data는 def_hwport_aria_block_size 상수로 정렬된 크기를 가져야 합니다.
           만약 주어진 크기가 정렬되지 않은 크기라면 def_hwport_aria_block_size 에 정렬된 크기만큼만 복호화 하고 나머지 부분은 그대로 암호문으로 유지됩니다.
        */
        (void)hwport_decrypt_aria256_ecb(
            (void *)(&s_data[0]),
            sizeof(s_data),
            (const void *)(&s_round_key[def_hwport_aria256_decrypt_round_key_offset])
        );
        (void)hwport_dump("plain(decrypted)", (const void *)(&s_data[0]), sizeof(s_data)); /* 환원된 평문 덤프 */


Copyright ⓒ MINZKN.COM
All Rights Reserved.