Mikrodenetleyiciler için en küçük AES uygulaması?


38

Mikroişlemciler için küçük ve ücretsiz bir AES-128 Rijndael uygulaması önerebilir mi? İdeal olarak, PIC18 için, C'deki genel bir uygulama faydalı olacaktır.

Derleme axTLS uygulama PIC18 ve bir blok / şifre çözme şifreleme 6KB ROM ve RAM 750B gerektirir.

Derleme rijndael-alg-fst.c PIC18 ve bir blok / şifre çözme şifreleme 28 KB ROM ve RAM 0.5KB gerektirir.

Derleme Brian Gladman 8 bit AES PIC18 ve şifreleme / şifre çözme bir blok ROM 19kb ve RAM 190 bayt gerektirir.

Daha iyi optimize edilmiş PIC'e özgü değişkenler mevcut mu?

(axTLS sürümü için güncellenmiş RAM gereksinimleri)


1
Bu bootloader için mi?
Daniel Grillo

Hayır, bir ağ uygulaması için
Toby Jaffey

Microchip, 3.018 byte kod büyüklüğüne sahip dsPIC ve PIC 24 için bir uygulamaya sahiptir, ancak yalnızca şifrelemesi vardı, şifre çözme işlemi yoktu. Bunu tahmin etmek senin için kesin değil.
Kellenjb

@Kellenjb İlginç, ama 8 bitlik mikroskoplar için küçük bir şey arıyorum
Toby Jaffey

1
@mikeselectricstuff Evet, AES olması gerekiyor. AES-128 kullanarak mevcut bir sistemle birlikte çalışmaya çalışıyorum. Herhangi bir küçük AES uygulamasıyla ilgileniyorum, ancak şu anda PIC18'i hedefliyorum. HiTech Pro picc18 derleyicisini kullanıyorum.
Toby Jaffey,

Yanıtlar:


19

AxTLS ile 7.5kB RAM kullanımını nasıl bulduğunuzu merak ediyorum. Koduna bakıldığında, tüm içerik bu yapı içinde saklanır:

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;

Bu yapının boyutu 2 + 2 + 4 * 15 * 8 + 16 = 504'tür. Aes.c'de global değişken göremiyorum, otomatik değişkenlerin hepsi küçük, yığın kullanımı da makul. Peki 7.5kB nereye gidiyor? Belki de yalnızca AES uygulamasını çıkarmak yerine tüm kütüphaneyi kullanmaya çalışıyorsunuzdur?

Neyse, bu uygulama oldukça basit görünüyor, bu koda sadık kalmayı ve onu optimize etmeyi tercih ederim. Zor olabileceğini biliyorum, ancak AES ayrıntılarını öğrenmek, en azından mutlak minimum RAM kullanımını tahmin etmenize yardımcı olabilir.

Güncelleme: Bu kütüphaneyi IA-32 Linux'ta derlemeye çalıştım ve basit bir CBC AES-128 şifreleme testi yazdım. Aşağıdaki sonuçlara ulaştım (ilk sayı onaltılık bölüm uzunluğu):

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

Bu sadece 660 bayt .bss (AES_CTX'i global değişken olarak ilan ettim). Verilerin çoğu IV ve anahtar tarafından işgal edilmiştir. Pte'de farklı sonuçlar alacağınız için buraya .text'i dahil etmiyorum (veri bölümleri her iki mimaride neredeyse aynı boyutta olmalıdır).


AxTLS versiyonunda 10 kat yanlış anladım. Haklısın. Ancak, hala AES'in daha verimli sürümleriyle ilgileniyorum ...
Toby Jaffey

5
Boyut veya hız bakımından verimli misiniz? Aslında kısıtlamalar nelerdir? Daha küçük kütüphanelerin daha yavaş olacağını unutmayın - daha büyük (kod bölümü açısından) kitaplıkların kaynak koduna bakarsanız, şişirmenin çoğu önceden hesaplanmış sabit dizilerden kaynaklanır.
Kod Ressamları

1
RAM ve ROM ayakizi açısından. Hız bir sorun değil, ancak çok fazla işlevselliği küçük bir cihaza sıkıştırmak istiyorum.
Toby Jaffey

14

Bu sorunun biraz eski olduğunu biliyorum, ancak yakın zamanda PIC16 ve 8051 üzerine AES128 uygularken kendim araştırmak zorunda kaldım ve bu soruyu da merak ediyordum.

Bunun gibi bir şey kullandım: http://cs.ucsb.edu/~koc/cs178/projects/JT/aes.c ve ram kullanımım birkaç yüz bayt ve ikili boyut 3kb ROM'dan az.

En iyi tavsiyem http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation Wikipedia sayfasını okumak ve farklı modları anlamak, örneğin OFB modundaki AES'in ECB modunu temel bir yapı taşı olarak nasıl kullandığını anlamak. Ayrıca XOR'ing (OFB modunda) onu simetrik bir işlem yapar, bu yüzden şifrelemek / şifre çözme aynı zamanda yerden tasarruf sağlayan işlevdir.

AES'in gerçekte nasıl çalıştığını anladığımda, onu C'de uygulayabilir ve sonra NIST belirtimine karşı test edebilirim ** (bunu yapın! Çevrimiçi olarak bulunan kodun çoğu hatalı) ve yalnızca kesinlikle ihtiyacım olanı uygular.

Bu özelleştirme ve optimizasyonu yaparak AES128'i 8051 üzerine diğer bazı RF ürün yazılımlarıyla birlikte kullanabildim. RAM kullanımı (tüm sistem için) ~ 2.5kb'dan 2kb'ın altına düşmüştür, yani 4kb SRAM ile 8051'e yükseltmek zorunda değiliz, ancak daha ucuz 2kb SRAM sürümünü kullanmaya devam edebiliriz.

** Test Vektörleri, Ek F'da yer almaktadır: http://csrc.nist.gov/publications/nistpubs/800-38a/addendum-to-nist_sp800-38A.pdf

DÜZENLE:

Sonunda Github kodunu aldım: https://github.com/kokke/tiny-AES-c

Boyutu için biraz optimize ettim. ARM için derlendiğinde GCC boyut çıktısı:

$ 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

Yani kaynak kullanımı şimdi 1KB kod, 204 bayt RAM.

PIC için nasıl oluşturulacağını hatırlamıyorum, ancak 8bit AVR Atmel Mega16, PIC gibi bir şeyse, kaynak kullanımı:

$ 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

Yani 1.5K kodu ve 198 bayt RAM.


2001'de yaptığım bir uygulamanın nasıl birikeceğini merak ediyorum . S-box'ları üretmez; Onlar statik.
Kaz

6

Son zamanlarda axTLS uygulamasını aldım ve elimden geldiğince küçültmeye çalıştım. S-box'ları kendiniz kolayca oluşturabilir ve birkaç yüz bayt kaydedebilirsiniz.

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

Kaynağın tamamını şu adreste bulabilirsiniz: http://ccodeblog.wordpress.com/2012/05/25/aes-implementation-in-300-lines-of-code/


Eşyalarını biliyorsun Andrew. Upvoted. : D
Alex

3

MIT lisansı ile sadece C, AES-128, aes-min adlı bir uygulama yapıyorum . Çok az RAM / ROM içeren küçük mikroişlemcileri (örneğin 8 bit) hedefler.

Bellek gereksinimlerini azaltmak (isteğe bağlı olarak RAM'deki genişletilmiş anahtar programın tümünden kaçınmak için) isteğe bağlı çalışan anahtar zamanlaması hesaplamasına sahiptir.


1

Bu uygulamayı ilginç bulabilirsiniz . Açık kaynak kodlu bir AVR şifreleme kütüphanesinden.

Burada kod boyutu ve performansı hakkında bazı genel (eski) bilgiler ve istatistikler bulabilirsiniz .

AES:

AES bilgisi

Bu kütüphaneden sadece SHA-1 kaynağı ile oynuyordum, bu yüzden AES hakkında yorum yapamam.



0

En küçük AES128 PIC serisi için yazdığım 900 komut ve 42 byte RAM çalıştırabilir. PIC12 serisinde kendim kullanıyorum ancak PIC10F206 da mümkün.

Kodu şirketimden açıklayamam ancak PIC10-12-16 serisi için yazdım. Şifreleme, 256 baytlık arama tablosunu içeren 444 baytlık kod alır, bu kod ayrıca 25 baytlık anahtar yükleme fonksiyonunu da içerir.

AES makalesini kontrol etmek ve kendiniz uygulamak için tüm tavsiyelerde bulunabilirim! Çoğu uygulama çok kötüdür ve çok ram ve rom kullanmanın bir yoludur.

Ayrıca dsPIC ve PIC24 için AES128'i kullandım ve mikroçipin lib'iyle karşılaştırıldığında yaklaşık% 70 daha az kod alanı kullandım ve kodum da biraz daha hızlı. dsPIC ve PIC24 uygulama numaraları:

"Şifreleme yaklaşık 2995 döngü sürer. 79.10uS @ 40 MIPS, 197.75uS @ 16 MIPS"

"DecKeySetup yaklaşık 567 döngü sürüyor. 14.20uS @ 40 MIPS, 35.43uS @ 16 MIPS"

"Şifre çözme yaklaşık 3886 döngü sürer. 97.15uS @ 40 MIPS, 242.88uS @ 16 MIPS"

"Toplam kod büyüklüğü 1050 Word'dür, tablolar dahil."

PIC24 çekirdeği ile ilgili güzellik, bazı talimatların 32 bit olması ve bu, küçük bir AES128 uygulaması oluşturmak için hayatı çok daha kolay hale getiriyor. PIC32 veya diğer 32 bit işlemci.

AES'in uygulanması çok basit, sadece çoğu insan bile denemiyor!

Bağlantıya bakın: http://www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf


Açık kaynak mı? Kodu gönderebilir misin?
Toby Jaffey

2
@Paul - Elektrik mühendisliğine hoş geldiniz! Cevabınız ilginç ve cesaretlendiricidir, ancak daha fazla ayrıntı olmadan gerçekten yararlı değildir. 900 komut muhtemelen bir kod bloğuna sığabilir! Lütfen geliştirmek için cevabın altındaki "düzenle" bağlantısını kullanın.
Kevin Vermeer

@ PaulHolland harika bir haber, kod nerede?
Frank

2
@Paul - Eğer nasıl yazdığınızı açıkladıysanız ve kodu yolladıysanız, şu anda sahip olduğunuz en fazla oy yerine bir yığın artı puan alacaksınız! Kodu lisans nedeniyle gönderemiyorsanız, en azından nasıl yazdığınızı ve Joby'nin çalışmanıza nasıl paralel olabileceğini açıklayın.
Kevin Vermeer,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.