การใช้ AES เล็กที่สุดสำหรับไมโครคอนโทรลเลอร์?


38

ทุกคนสามารถแนะนำ AES-128 Rijndael สำหรับการใช้ไมโครคอนโทรลเลอร์ขนาดเล็กได้ฟรี เป็นการดีสำหรับ PIC18 แม้ว่าการใช้งานทั่วไปใน C จะเป็นประโยชน์

การคอมไพล์การใช้งาน axTLSสำหรับ PIC18 และการเข้ารหัส / ถอดรหัสบล็อกต้องใช้ ROM 6KB และ RAM 750b

การคอมไพล์rijndael-alg-fst.cสำหรับ PIC18 และการเข้ารหัส / ถอดรหัสบล็อกต้องใช้ 28KB ROM และ 0.5KB RAM

การคอมไพล์AES 8 บิตของ Brian Gladmanสำหรับ PIC18 และการเข้ารหัส / ถอดรหัสบล็อกต้องใช้ ROM ขนาด 19KB และ RAM 190 ไบต์

มีรูปแบบเฉพาะเจาะจงที่ได้รับการปรับปรุงให้ดีที่สุดหรือไม่

(ข้อกำหนด RAM ที่อัปเดตสำหรับรุ่น axTLS)


1
นี่สำหรับ bootloader หรือไม่
Daniel Grillo

ไม่เป็นแอปพลิเคชันเครือข่าย
Toby Jaffey

Microchip มีการใช้งานสำหรับ dsPIC และ PIC 24 ที่มีขนาดรหัส 3,018 ไบต์ แต่มีการเข้ารหัสเท่านั้นไม่มีการถอดรหัส การคาดเดาสิ่งนี้ไม่ได้ช่วยคุณ
Kellenjb

@ Kellenjb ที่น่าสนใจ แต่ฉันกำลังมองหาสิ่งเล็ก ๆ สำหรับ 8 บิต micros
Toby Jaffey

1
@mikeselectricstuff ใช่มันต้องเป็น AES ฉันกำลังพยายามทำงานร่วมกับระบบที่มีอยู่โดยใช้ AES-128 ฉันสนใจการติดตั้ง AES เล็ก ๆ แต่ตอนนี้ฉันกำลังตั้งเป้าหมายที่ PIC18 ฉันใช้คอมไพเลอร์ HiTech Pro picc18
Toby Jaffey

คำตอบ:


19

ฉันสงสัยว่าคุณได้รับการใช้ RAM 7.5kB ด้วย axTLS อย่างไร ดูที่รหัสบริบททั้งหมดจะถูกเก็บไว้ในโครงสร้างนี้:

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 อย่างง่าย ได้ผลลัพธ์ดังต่อไปนี้ (หมายเลขแรกคือความยาวส่วนหกเหลี่ยม):

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

นั่นเป็นเพียง. 660 ไบต์ของ. bbs (ฉันได้ประกาศว่า AES_CTX เป็นตัวแปรทั่วโลก) .data ส่วนใหญ่ครอบครองโดย IV และรหัส ฉันไม่ได้รวม. text ไว้ที่นี่เนื่องจากคุณจะได้รับผลลัพธ์ที่แตกต่างกันโดยสิ้นเชิงใน PIC (ส่วนข้อมูลควรมีขนาดใกล้เคียงกันในสถาปัตยกรรมทั้งสอง)


ฉันอ่านผิด 10 คะแนนจากรุ่น axTLS คุณถูก. แต่ฉันสนใจยังคงอยู่ในรุ่นที่มีประสิทธิภาพมากขึ้นของ AES ...
Toby Jaffey

5
มีประสิทธิภาพในแง่ของขนาดหรือความเร็วหรือไม่ อะไรคือข้อ จำกัด ที่จริงแล้ว? โปรดจำไว้ว่าไลบรารีขนาดเล็กอาจช้ากว่า - หากคุณดูซอร์สโค้ดของไลบรารีที่ใหญ่กว่า (ในส่วนของโค้ด) ส่วนใหญ่ของ Bloat นั้นเกิดจากอาร์เรย์คงที่ที่คำนวณไว้ล่วงหน้า
รหัสจิตรกร

1
ในแง่ของ RAM และ ROM footprint ความเร็วไม่ใช่ปัญหา แต่ฉันต้องการที่จะอัดฟังก์ชันการทำงานจำนวนมากลงในอุปกรณ์ขนาดเล็ก
Toby Jaffey

14

ฉันรู้ว่าคำถามนี้ค่อนข้างเก่า แต่เมื่อเร็ว ๆ นี้ฉันต้องค้นคว้าด้วยตัวเองเพราะฉันใช้ AES128 กับ PIC16 และ 8051 และฉันก็อยากรู้เกี่ยวกับคำถามนี้เช่นกัน

ฉันใช้สิ่งนี้: http://cs.ucsb.edu/~koc/cs178/projects/JT/aes.c และการใช้หน่วยความจำของฉันคือสองร้อยไบต์และขนาดไบนารีน้อยกว่า 3kb ROM

คำแนะนำที่ดีที่สุดของฉันคืออ่านบนหน้า Wikipedia http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation และทำความเข้าใจกับโหมดต่าง ๆ เช่น AES ในโหมด OFB โหมด sorta ใช้โหมด ECB เป็นโครงสร้างพื้นฐาน นอกจากนี้ XOR'ing (ในโหมด OFB) ทำให้การดำเนินการแบบสมมาตรดังนั้นการเข้ารหัส / ถอดรหัสเป็นฟังก์ชั่นเดียวกันซึ่งยังประหยัดพื้นที่

เมื่อฉันเข้าใจว่า AES ใช้งานได้จริงฉันสามารถนำไปใช้ใน C แล้วทดสอบกับข้อกำหนด NIST ** (ทำสิ่งนี้! รหัสที่พบมากออนไลน์มีข้อบกพร่อง) และใช้สิ่งที่ฉันต้องการเท่านั้น

ฉันสามารถใส่ AES128 บน 8051 ควบคู่กับเฟิร์มแวร์ RF อื่น ๆ ด้วยการปรับแต่งและปรับแต่งนี้ การใช้ RAM (สำหรับทั้งระบบ) ลดลงจาก ~ 2.5kb เหลือเพียง 2kb ซึ่งหมายความว่าเราไม่จำเป็นต้องอัปเกรดเป็น 8051 ด้วย 4kb SRAM แต่สามารถใช้รุ่น SRAM ราคาถูกกว่า 2kb ได้

** เวกเตอร์ทดสอบอยู่ในภาคผนวก F ใน: http://csrc.nist.gov/publications/nistpubs/800-38a/addendum-to-nist_sp800-38A.pdf

แก้ไข:

ในที่สุดก็รับรหัสบน Github: https://github.com/kokke/tiny-AES-c

ฉันปรับขนาดให้เหมาะสมเล็กน้อย ขนาดเอาต์พุต GCC เมื่อรวบรวมสำหรับ 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

ดังนั้นการใช้ทรัพยากรจึงเป็นรหัส 1KB, RAM 204 ไบต์

ฉันจำไม่ได้ว่าจะสร้าง PIC อย่างไร แต่ถ้า 8bit 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 และ RAM 198bytes


ฉันสงสัยว่าการนำไปใช้ในปี 2544จะเป็นอย่างไร มันไม่สร้าง S-boxes พวกเขาคงที่
Kaz

6

ฉันเพิ่งใช้งาน axTLS และพยายามลดขนาดให้มากที่สุดเท่าที่จะทำได้ คุณสามารถสร้าง S-box ได้อย่างง่ายดายด้วยตัวคุณเองและช่วยตัวเองให้รอดชีวิตสักสองสามร้อยไบต์

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/


คุณรู้จักสิ่งของของคุณแอนดรูว์ upvoted : D
อเล็กซ์

3

ฉันได้ทำการติดตั้งใช้งานใน C, AES-128 เท่านั้นเรียกว่าaes-minพร้อมใบอนุญาต MIT กำหนดเป้าหมายไมโครโปรเซสเซอร์ขนาดเล็ก (เช่น 8 บิต) ด้วย RAM / ROM เล็กน้อย

มันมีการคำนวณกำหนดการทางเลือกแบบ on-the-fly เพื่อลดความต้องการของหน่วยความจำ (หลีกเลี่ยงความต้องการตารางคีย์แบบขยายใน RAM)


1

คุณอาจพบว่าการใช้งานนี้น่าสนใจ มันมาจากโอเพนซอร์ส AVR crypto-libary

คุณสามารถค้นหาบางทั่วไป (เก่า) ข้อมูลและสถิติเกี่ยวกับรหัสขนาดและประสิทธิภาพการทำงานที่นี่

AES:

ข้อมูล AES

ฉันเล่นเฉพาะกับแหล่งที่มาของ SHA-1 จาก lib นั้นดังนั้นฉันจึงไม่สามารถออกความเห็นเกี่ยวกับ AES



0

AES128 ที่เล็กที่สุดที่ฉันเขียนสำหรับ PIC ซีรีส์สามารถเรียกใช้ใน 900 คำแนะนำและ RAM 42 ไบต์ ฉันใช้มันด้วยตัวเองในซีรีย์ PIC12 แต่ PIC10F206 ก็เป็นไปได้เช่นกัน :-)

ฉันไม่สามารถเปิดเผยรหัสได้เนื่องจากมาจาก บริษัท ของฉัน แต่ฉันเขียนเป็น asm สำหรับซีรี่ย์ PIC10-12-16 การเข้ารหัสใช้รหัส 444 ไบต์รวมถึงตารางการค้นหา 256 ไบต์รหัสนี้รวมฟังก์ชั่นโหลดคีย์ซึ่งมีขนาด 25 ไบต์

ฉันจะให้คำแนะนำทั้งหมดเพื่อตรวจสอบกระดาษ AES และนำไปใช้ด้วยตัวคุณเอง! การใช้งานส่วนใหญ่ไม่ดีมากและใช้วิธีการ ram และรอมมาก

ฉันยังใช้ AES128 สำหรับ dsPIC และ PIC24 และใช้พื้นที่โค้ดน้อยลงประมาณ 70% เมื่อเทียบกับ lib ของ microchip และโค้ดของฉันก็เร็วขึ้นเช่นกัน หมายเลขการนำไปปฏิบัติ 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"

"ขนาดรหัสทั้งหมดคือ 1,050 คำรวมตาราง"

ความงามของแกน PIC24 คือคำแนะนำบางคำคือ 32 บิตและทำให้ชีวิตง่ายขึ้นสำหรับการสร้าง AES128 ขนาดเล็กรหัสของฉันใช้คำแนะนำทั้งหมด 32 บิตและใช้งานได้อย่างสมบูรณ์ 32 บิตดังนั้นฉันจึงสามารถเปลี่ยนรหัสได้อย่างรวดเร็วเพื่อ PIC32 หรือซีพียู 32 บิตอื่น ๆ

AES นั้นง่ายมากที่จะใช้งานเฉพาะคนส่วนใหญ่ที่ไม่ได้ลอง!

ดูลิงค์: http://www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf


มันเป็นโอเพนซอร์สหรือไม่ คุณสามารถโพสต์รหัสได้หรือไม่
Toby Jaffey

2
@Paul - ยินดีต้อนรับสู่ Engingeering ไฟฟ้า! คำตอบของคุณน่าสนใจและให้กำลังใจ แต่มันไม่มีประโยชน์จริง ๆ หากไม่มีรายละเอียดเพิ่มเติม 900 คำสั่งอาจจะพอดีกับการบล็อกรหัส! โปรดดูลิงก์ "แก้ไข" ด้านล่างคำตอบเพื่อปรับปรุง
Kevin Vermeer

@ PaulHolland ข่าวดีรหัสคืออะไร?
Frank

2
@Paul - คุณจะได้รับกอง upvotes แทนที่จะ downvote คุณมีถ้าคุณอธิบายว่าคุณเขียนและโพสต์รหัส! หากคุณไม่สามารถโพสต์รหัสด้วยเหตุผลด้านลิขสิทธิ์อย่างน้อยก็อธิบายวิธีที่คุณเขียนและวิธีที่ Joby สามารถทำงานของคุณแบบขนานได้
Kevin Vermeer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.