Triển khai AES nhỏ nhất cho vi điều khiển?


38

Bất cứ ai cũng có thể đề xuất một triển khai AES-128 Rijndael nhỏ, miễn phí cho các bộ vi điều khiển. Lý tưởng nhất là đối với PIC18, mặc dù việc triển khai chung trong C sẽ hữu ích.

Biên dịch triển khai axTLS cho PIC18 và mã hóa / giải mã một khối yêu cầu 6KB ROM và 750b RAM.

Biên dịch rijndael-alg-fst.c cho PIC18 và mã hóa / giải mã một khối yêu cầu ROM 28KB và RAM 0,5KB.

Biên dịch AES 8 bit của Brian Gladman cho PIC18 và mã hóa / giải mã một khối đòi hỏi 19KB ROM và 190 byte RAM.

Có các biến thể cụ thể PIC được tối ưu hóa tốt hơn có sẵn?

(yêu cầu RAM cập nhật cho phiên bản axTLS)


1
Đây có phải là cho bootloader?
Daniel Grillo

Không, đó là cho một ứng dụng mạng
Toby Jaffey

Microchip có một triển khai cho DSPIC và PIC 24 có kích thước mã là 3.018 byte, nhưng nó chỉ có mã hóa, không có giải mã. Đoán điều này không cắt nó cho bạn mặc dù.
Kellenjb

@Kellenjb Thú vị, nhưng tôi đang tìm kiếm thứ gì đó nhỏ cho 8 bit micros
Toby Jaffey

1
@mike Electrical ware Có, nó cần phải là AES. Tôi đang cố gắng tương tác với một hệ thống hiện có bằng AES-128. Tôi quan tâm đến bất kỳ triển khai AES nhỏ nào, nhưng hiện tại tôi đang nhắm mục tiêu PIC18. Tôi đang sử dụng trình biên dịch picc18 HiTech Pro.
Toby Jaffey

Câu trả lời:


19

Tôi đang tự hỏi làm thế nào bạn có được 7,5kB sử dụng RAM với axTLS. Nhìn vào mã, tất cả bối cảnh được lưu trữ trong cấu trúc này:

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;

Kích thước của cấu trúc này là 2 + 2 + 4 * 15 * 8 + 16 = 504. Tôi thấy không có biến toàn cục nào trong aes.c, các biến tự động đều nhỏ, vì vậy việc sử dụng ngăn xếp cũng hợp lý. Vậy 7.5kB đi đâu? Có lẽ bạn đang cố gắng sử dụng toàn bộ thư viện thay vì chỉ trích xuất triển khai AES từ nó?

Dù sao, việc thực hiện này có vẻ khá đơn giản, tôi muốn sử dụng mã này và cố gắng tối ưu hóa nó. Tôi biết nó có thể khó, nhưng tìm hiểu các chi tiết AES có thể giúp bạn ít nhất là ước tính mức sử dụng RAM tối thiểu tuyệt đối.

Cập nhật: Tôi vừa thử biên dịch thư viện này trên IA-32 Linux và viết một bài kiểm tra mã hóa CBC AES-128 đơn giản. Có kết quả như sau (số đầu tiên là hex chiều dài phần):

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

Đó chỉ là 660 byte .bss (Tôi đã khai báo AES_CTX là biến toàn cục). Hầu hết các .data được chiếm bởi IV và khóa. Tôi không bao gồm .text ở đây, vì bạn sẽ nhận được kết quả hoàn toàn khác nhau trên PIC (các phần dữ liệu phải có cùng kích thước trên cả hai kiến ​​trúc).


Tôi đã đọc sai bởi hệ số 10 trên phiên bản axTLS. Bạn đúng. Nhưng, tôi vẫn quan tâm đến các phiên bản hiệu quả hơn của AES ...
Toby Jaffey

5
Hiệu quả về kích thước hay tốc độ? Những hạn chế, thực sự là gì? Hãy nhớ rằng các thư viện nhỏ hơn có thể sẽ chậm hơn - nếu bạn xem xét mã nguồn của các thư viện lớn hơn (về phần mã), hầu hết sự phình to là do các mảng không đổi được tính toán trước.
Họa sĩ mã

1
Về mặt RAM và dấu chân ROM. Tốc độ không phải là vấn đề, nhưng tôi đang tìm cách nhồi nhét rất nhiều chức năng vào một thiết bị nhỏ.
Toby Jaffey

14

Tôi biết câu hỏi này hơi cũ, nhưng gần đây tôi đã phải tự nghiên cứu nó khi tôi triển khai AES128 trên PIC16 và 8051, và vì vậy tôi cũng tò mò về câu hỏi này.

Tôi đã sử dụng một cái gì đó như thế này: http://cs.ucsb.edu/~koc/cs178/projects/JT/aes.c và mức sử dụng ram của tôi là vài trăm byte và kích thước nhị phân nhỏ hơn 3kb ROM.

Lời khuyên tốt nhất của tôi là đọc lên trang Wikipedia http://en.wikipedia.org/wiki/Block_codes_modes_of_operation và hiểu các chế độ khác nhau, ví dụ như cách AES trong chế độ OFB sử dụng chế độ ECB làm khối xây dựng cơ bản. Ngoài ra, XOR'ing (ở chế độ OFB) làm cho nó hoạt động đối xứng, vì vậy mã hóa / giải mã là chức năng tương tự cũng giúp tiết kiệm không gian.

Khi tôi hiểu làm thế nào AES thực sự hoạt động, tôi có thể triển khai nó trong C và sau đó kiểm tra nó theo đặc tả của NIST ** (làm điều này! Nhiều mã được tìm thấy trực tuyến là thiếu sót) và chỉ thực hiện những gì tôi thực sự cần.

Tôi đã có thể điều chỉnh AES128 trên 8051 cùng với một số phần mềm RF khác bằng cách thực hiện tùy chỉnh và tối ưu hóa này. Việc sử dụng RAM (cho toàn bộ hệ thống) đã giảm từ ~ 2,5kb xuống dưới 2kb, nghĩa là chúng tôi không phải nâng cấp lên 8051 với SRAM 4kb, nhưng vẫn có thể tiếp tục sử dụng phiên bản SRAM 2kb rẻ hơn.

** Các vectơ kiểm tra có trong Phụ lục F trong: http://csrc.nist.gov/publications/nistpub/800-38a/addendum-to-nist_sp800-38A.pdf

CHỈNH SỬA:

Cuối cùng cũng nhận được mã trên Github: https://github.com/kokke/tiny-AES-c

Tôi đã tối ưu hóa một chút cho kích thước. Đầu ra kích thước GCC khi được biên dịch cho ARM:

$ 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

Vì vậy, việc sử dụng tài nguyên bây giờ là mã 1KB, RAM 204 byte.

Tôi không nhớ cách xây dựng cho PIC, nhưng nếu 8 bit AVR Atmel Mega16 giống như PIC, thì việc sử dụng tài nguyên là:

$ 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

Mã 1,5K và RAM 198byte.


Tôi tự hỏi làm thế nào một triển khai tôi thực hiện vào năm 2001 sẽ chồng chất lên. Nó không tạo ra các hộp S; chúng là tĩnh.
Kaz

6

Gần đây tôi đã thực hiện axTLS và làm việc thu nhỏ nó nhiều nhất có thể. Bạn có thể dễ dàng tự tạo các hộp S và tiết kiệm cho mình vài trăm byte.

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;
    }
}

Bạn có thể lấy nguồn đầy đủ tại: http://ccodeblog.wordpress.com/2012/05/25/aes-im THỰCation-in-300-lines-of-code /


Bạn biết công cụ của bạn, Andrew. Nâng cao. : D
Alex

3

Tôi đã thực hiện triển khai chỉ trong C, AES-128, được gọi là aes-min , với giấy phép MIT. Nó nhắm mục tiêu các bộ vi xử lý nhỏ (ví dụ 8 bit) với ít RAM / ROM.

Nó có tính toán lịch trình khóa nhanh chóng tùy chọn để giảm yêu cầu bộ nhớ (tránh sự cần thiết phải mở rộng lịch trình khóa mở rộng đầy đủ trong RAM).


1

Bạn có thể thấy việc thực hiện này thú vị. Nó từ một loại tiền điện tử mã nguồn mở.

Bạn có thể tìm thấy một số thông tin và thống kê chung (lỗi thời) về kích thước và hiệu suất mã tại đây .

AES:

Thông tin AES

Tôi chỉ chơi xung quanh với nguồn SHA-1 từ lib đó, vì vậy tôi không thể nhận xét về AES.



0

AES128 nhỏ nhất tôi đã viết cho loạt PIC có thể chạy trong 900 hướng dẫn và 42 byte RAM. Tôi sử dụng nó cho dòng PIC12 nhưng PIC10F206 cũng có thể :-).

Tôi không thể tiết lộ mã vì nó từ công ty của tôi nhưng tôi đã viết nó dưới dạng asm cho loạt PIC10-12-16. Mã hóa lấy 444 byte mã bao gồm bảng tra cứu 256 byte, mã này cũng bao gồm chức năng tải khóa là khoảng 25 byte.

Tôi sẽ tư vấn để kiểm tra giấy AES và tự thực hiện! Hầu hết các triển khai là rất xấu và sử dụng cách để nhiều ram và rom.

Tôi cũng đã triển khai AES128 cho DSPIC và PIC24 và sử dụng không gian mã ít hơn khoảng 70% so với lib của microchip và mã của tôi cũng nhanh hơn một chút. số thực hiện của DSPIC và PIC24:

"Mã hóa mất khoảng 2995 chu kỳ. 79.10uS @ 40 MIPS, 197,75uS @ 16 MIPS"

"DecKeysetup mất khoảng 567 chu kỳ. 14,20uS @ 40 MIPS, 35,43uS @ 16 MIPS"

"Quá trình giải mã mất khoảng 3886 chu kỳ. 97,15uS @ 40 MIPS, 242,88uS @ 16 MIPS"

"Tổng kích thước mã là 1050 từ bao gồm các bảng."

Điểm hay của lõi PIC24 là một số hướng dẫn là 32 bit và điều này giúp cho việc xây dựng một triển khai AES128 nhỏ dễ dàng hơn, mã của tôi sử dụng tất cả các hướng dẫn 32 bit có sẵn và hoạt động hoàn toàn 32 bit để tôi có thể chuyển mã nhanh chóng PIC32 hoặc cpu 32 bit khác.

AES rất đơn giản để thực hiện chỉ hầu hết mọi người thậm chí không thử!

Nhìn vào liên kết: http://www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf


Nó có phải là nguồn mở không? Bạn có thể gửi mã?
Toby Jaffey

2
@Paul - Chào mừng bạn đến với Kỹ thuật điện! Câu trả lời của bạn rất thú vị và đáng khích lệ, nhưng nó không thực sự hữu ích nếu không có thêm chi tiết. 900 hướng dẫn có thể phù hợp với một khối mã! Vui lòng se liên kết "chỉnh sửa" bên dưới câu trả lời để cải thiện nó.
Kevin Vermeer

@PaulHolland tin tuyệt vời, mã ở đâu?
Frank

2
@Paul - Bạn sẽ nhận được một đống upvote thay vì downvote mà bạn hiện có nếu bạn giải thích cách bạn viết nó và đăng mã! Nếu bạn không thể đăng mã vì lý do cấp phép, ít nhất hãy giải thích cách bạn đã viết mã và cách thức mà Joby có thể song song với công việc của bạn.
Kevin Vermeer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.