마이크로 컨트롤러를위한 가장 작은 AES 구현?


38

누구나 마이크로 컨트롤러를위한 소규모의 무료 AES-128 Rijndael 구현을 추천 할 수 있습니다. PIC18의 경우 C의 일반적인 구현이 유용하지만 이상적입니다.

PIC18에 대한 axTLS 구현 을 컴파일하고 블록을 암호화 / 복호화하려면 6KB ROM과 750b의 RAM이 필요합니다.

PIC18을위한 rijndael-alg-fst.c 를 컴파일 하고 블록을 암호화 / 복호화하려면 28KB ROM과 0.5KB RAM이 필요합니다.

PIC18 용 Brian Gladman의 8 비트 AES 를 컴파일 하고 블록을 암호화 / 복호화하려면 19KB의 ROM과 190 바이트의 RAM이 필요합니다.

더 나은 최적화 된 PIC 특정 변형이 있습니까?

(xTLS 버전에 대한 업데이트 된 RAM 요구 사항)


1
이것은 부트 로더를위한 것입니까?
Daniel Grillo

아니요, 네트워크 응용 프로그램을위한 것입니다
Toby Jaffey

Microchip은 코드 크기가 3,018 바이트 인 dsPIC 및 PIC 24에 대한 구현을 가지고 있지만 암호화 만 있고 해독은 없었습니다. 이 추측은 당신을 위해 그것을 잘라하지 않습니다.
Kellenjb

@Kellenjb 흥미롭지 만 8 비트 마이크로에 작은 것을 찾고 있습니다
Toby Jaffey

1
@mikeselectricstuff 예, AES 여야합니다. AES-128을 사용하여 기존 시스템과 상호 운용하려고합니다. 소규모 AES 구현에 관심이 있지만 현재 PIC18을 타겟팅하고 있습니다. HiTech Pro picc18 컴파일러를 사용하고 있습니다.
Toby Jaffey

답변:


19

axTLS에서 어떻게 7.5kB의 RAM 사용량을 얻었는지 궁금합니다. 코드를 보면 모든 컨텍스트가이 구조에 저장됩니다.

typedef struct aes_key_st 
{
    uint16_t rounds;
    uint16_t key_size;
    uint32_t ks[(AES_MAXROUNDS+1)*8];
    uint8_t iv[AES_IV_SIZE];
} AES_CTX;

이 구조의 크기는 2 + 2 + 4 * 15 * 8 + 16 = 504입니다. aes.c에 전역 변수가 없으며 자동 변수가 모두 작으므로 스택 사용도 합리적입니다. 7.5kB는 어디로 갑니까? 아마도 AES 구현을 추출하는 대신 전체 라이브러리를 사용하려고합니까?

어쨌든,이 구현은 매우 간단 해 보입니다. 차라리이 코드를 고수하고 최적화하려고합니다. 까다로울 수 있지만 AES 세부 정보를 배우면 최소한 최소 RAM 사용량을 추정하는 데 도움이 될 수 있습니다.

업데이트 : 방금 IA-32 Linux 에서이 라이브러리를 컴파일하고 간단한 CBC AES-128 암호화 테스트를 작성하려고했습니다. 다음 결과를 얻었습니다 (첫 번째 숫자는 섹션 길이 16 진수입니다).

 22 .data         00000028  0804a010  0804a010  00001010  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 23 .bss          00000294  0804a040  0804a040  00001038  2**5
                  ALLOC

그것은 660 바이트의 .bss입니다 (전역 변수로 AES_CTX를 선언했습니다). 대부분의 .data는 IV와 키로 채워집니다. PIC에 대해 완전히 다른 결과를 얻을 수 있으므로 여기에 .text를 포함시키지 않습니다 (데이터 섹션은 두 아키텍처에서 거의 동일한 크기 여야 함).


axTLS 버전에서 10 배로 잘못 읽었습니다. 네가 옳아. 그러나 저는 여전히 더 효율적인 AES 버전에 관심이 있습니다.
Toby Jaffey

5
크기 나 속도면에서 효율적입니까? 실제로 제약 조건은 무엇입니까? 더 작은 라이브러리는 느려질 수 있음을 명심하십시오. 더 큰 (코드 섹션 측면에서) 라이브러리의 소스 코드를 살펴보면 대부분의 팽창은 사전 계산 된 상수 배열 때문입니다.
코드 페인터

1
RAM 및 ROM 풋 프린트 측면에서. 속도는 문제가되지 않지만, 많은 기능을 작은 장치에 넣을 생각입니다.
Toby Jaffey

14

나는이 질문이 약간 오래되었다는 것을 알고 있지만 PIC16과 8051에서 AES128을 구현할 때 최근에 스스로 연구해야 했으므로이 질문에 대해서도 궁금했습니다.

나는 다음과 같은 것을 사용했다 : http://cs.ucsb.edu/~koc/cs178/projects/JT/aes.c 그리고 내 램 사용량은 몇 백 바이트이고 이진 크기는 3kb ROM보다 작습니다.

가장 좋은 조언은 Wikipedia 페이지 ( http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation )를 읽고 다양한 모드를 이해하는 것입니다. 또한 XOR (OFB 모드)은 대칭 작업이므로 암호화 / 암호 해독은 공간을 절약하는 동일한 기능입니다.

AES가 실제로 어떻게 작동하는지 이해하면 C로 구현 한 다음 NIST 사양 ** (이것! 많은 온라인 코드에서 결함이 있음)에 따라 테스트하고 절대적으로 필요한 것만 구현할 수 있습니다.

이 사용자 지정 및 최적화를 수행하여 다른 RF 펌웨어와 함께 8051에 AES128을 맞출 수있었습니다. 전체 시스템에 대한 RAM 사용량은 ~ 2.5kb에서 2kb 바로 아래로 내려갔습니다. 즉, 4kb SRAM을 사용하여 8051로 업그레이드 할 필요는 없지만 저렴한 2kb SRAM 버전을 계속 사용할 수 있습니다.

** 테스트 벡터는 부록 F에 있습니다 : http://csrc.nist.gov/publications/nistpubs/800-38a/addendum-to-nist_sp800-38A.pdf

편집하다:

마지막으로 Github에서 코드를 얻었습니다 : https://github.com/kokke/tiny-AES-c

크기에 맞게 조금 최적화했습니다. ARM 용으로 컴파일 될 때 GCC 크기 출력 :

$ arm-none-eabi-gcc -O2 -c aes.c -o aes.o
$ size aes.o
   text    data     bss     dec     hex filename
   1024       0     204    1228     4cc aes.o

따라서 리소스 사용량은 이제 1KB 코드, 204 바이트 RAM입니다.

PIC를 빌드하는 방법은 기억 나지 않지만 8 비트 AVR Atmel Mega16이 PIC와 같은 경우 리소스 사용량은 다음과 같습니다.

$ avr-gcc -Wall -Wextra -mmcu=atmega16 -O2 -c aes.c -o aes.o
$ avr-size aes.o
   text    data     bss     dec     hex filename
   1553       0     198    1751     6d7 aes.o

따라서 1.5K 코드와 198 바이트 RAM.


2001 년에 제가 구현 한 것이 어떻게 쌓일 지 궁금합니다 . S- 박스를 생성하지 않습니다. 그들은 정적입니다.
Kaz

6

최근에 axTLS 구현을 사용하여 최대한 축소하는 작업을했습니다. S- 박스를 쉽게 생성하고 몇 백 바이트를 절약 할 수 있습니다.

static uint8_t aes_sbox[256];   /** AES S-box  */
static uint8_t aes_isbox[256];  /** AES iS-box */
void AES_generateSBox(void)
{
    uint32_t t[256], i;
    uint32_t x;
    for (i = 0, x = 1; i < 256; i ++)
    {
        t[i] = x;
        x ^= (x << 1) ^ ((x >> 7) * 0x11B);
    }

    aes_sbox[0] = 0x63;
    for (i = 0; i < 255; i ++)
    {
        x = t[255 - i];
        x |= x << 8;
        x ^= (x >> 4) ^ (x >> 5) ^ (x >> 6) ^ (x >> 7);
        aes_sbox[t[i]] = (x ^ 0x63) & 0xFF;
    }
    for (i = 0; i < 256;i++)
    {
         aes_isbox[aes_sbox[i]]=i;
    }
}

http://ccodeblog.wordpress.com/2012/05/25/aes-implementation-in-300-lines-of-code/ 에서 전체 소스를 얻을 수 있습니다 .


당신은 당신의 물건을 알고, 앤드류. 공감. : D
Alex

3

MIT 라이센스를 사용하여 aes-min 이라고하는 AES-128 만 C로 구현했습니다 . RAM / ROM이 거의없는 소형 마이크로 프로세서 (예 : 8 비트)를 대상으로합니다.

메모리 요구 사항을 줄이기 위해 선택적인 즉석 키 일정 계산 기능이 있습니다 (RAM의 전체 확장 키 일정이 필요하지 않음).


1

이 구현이 흥미로울 수 있습니다 . 오픈 소스 AVR 암호화 라이브러리에서 가져온 것입니다.

코드 크기 및 성능에 대한 일반적인 정보 (오래된) 정보 및 통계는 여기에서 찾을 수 있습니다 .

AES :

AES 정보

나는 그 lib의 SHA-1 소스로만 놀았으므로 AES에 대해서는 언급 할 수 없습니다.



0

PIC 시리즈 용으로 작성한 가장 작은 AES128은 900 개의 명령어와 42 바이트의 RAM에서 실행될 수 있습니다. PIC12 시리즈에서 직접 사용하지만 PIC10F206도 가능합니다 :-).

회사에서 코드를 공개하지 못했지만 PIC10-12-16 시리즈에 대해 asm으로 작성했습니다. 암호화에는 256 바이트의 조회 테이블을 포함하여 444 바이트의 코드가 필요하며이 코드에는 약 25 바이트의 키로드 기능도 포함되어 있습니다.

나는 모든 조언을 AES 용지를 확인하고 직접 구현하는 것이 좋습니다!. 대부분의 구현은 매우 나쁘고 램과 롬을 많이 사용합니다.

또한 dsPIC 및 PIC24에 대해 AES128을 구현했으며 마이크로 칩의 lib에 비해 약 70 % 적은 코드 공간을 사용하며 코드도 약간 더 빠릅니다. dsPIC 및 PIC24 구현 번호 :

"암호화에는 약 2995주기가 필요합니다. 79.10uS @ 40 MIPS, 197.75uS @ 16 MIPS"

"DecKeySetup은 약 567 사이클이 필요합니다. 14.20uS @ 40 MIPS, 35.43uS @ 16 MIPS"

"암호 해독에는 약 3886주기가 필요합니다. 97.15uS @ 40 MIPS, 242.88uS @ 16 MIPS"

"테이블의 총 코드 크기는 1050 단어입니다."

PIC24 코어의 장점은 일부 명령어는 32 비트이며 작은 AES128 구현을 구현하기에 훨씬 편리합니다. 내 코드는 모든 32 비트 명령어를 사용할 수 있으며 완전히 32 비트로 작동하므로 코드를 빠르게 포팅 할 수 있습니다. PIC32 또는 기타 32 비트 CPU.

AES는 대부분의 사람들 만 구현하기가 매우 간단합니다!

링크를보십시오 : http://www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf


오픈 소스입니까? 코드를 게시 할 수 있습니까?
Toby Jaffey

2
@Paul-전기 Engingeering에 오신 것을 환영합니다! 귀하의 답변은 흥미롭고 고무적이지만 자세한 내용이 없으면 유용하지 않습니다. 900 개의 명령어가 코드 블록에 적합 할 수 있습니다! 답을 개선하려면 답변 아래의 "수정"링크를 참조하십시오.
케빈 베르메르

@PaulHolland 좋은 소식, 코드는 어디에 있습니까?
Frank

2
@Paul-코드를 작성하고 게시하는 방법을 설명하면 현재 보유하고있는 공감대 대신 공감대 더미를 얻게됩니다! 라이센스 문제로 인해 코드를 게시 할 수없는 경우 최소한 코드 작성 방법과 Joby가 작업을 병렬화 할 수있는 방법을 설명하십시오.
케빈 베르메르
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.