माइक्रोकंट्रोलर्स के लिए सबसे छोटा एईएस कार्यान्वयन?


38

क्या कोई भी माइक्रोकंट्रोलर के लिए एईएस -128 रिजेंडेल के छोटे, मुफ्त कार्यान्वयन की सिफारिश कर सकता है। आदर्श रूप से, PIC18 के लिए, हालांकि C में एक सामान्य कार्यान्वयन उपयोगी होगा।

PIC18 के लिए axTLS कार्यान्वयन को संकलित करने और एक ब्लॉक को एन्क्रिप्ट / डिक्रिप्ट करने के लिए 6KB ROM और 750b RAM की आवश्यकता होती है।

संकलन क्रिप्ट-alg-fst.c PIC18 के लिए और एन्क्रिप्ट करने / एक ब्लॉक decrypting 28KB ROM और 0.5KB रैम की आवश्यकता है।

संकलन ब्रायन Gladman के 8 बिट एईएस PIC18 के लिए और एन्क्रिप्ट करने / एक ब्लॉक decrypting ROM के 19kb और रैम 190 बाइट्स की आवश्यकता है।

क्या बेहतर अनुकूलित PIC विशिष्ट संस्करण उपलब्ध हैं?

(axTLS संस्करण के लिए अद्यतन की गई RAM आवश्यकताएँ)


1
क्या यह बूटलोडर के लिए है?
डेनियल ग्रिलो

नहीं, यह एक नेटवर्क एप्लिकेशन के लिए है
टोबी जाफी

माइक्रोचिप में dsPIC और PIC 24 के लिए एक कार्यान्वयन है, जिसका कोड आकार 3,018 बाइट्स है, लेकिन इसमें केवल एन्क्रिप्शन, कोई डिक्रिप्शन नहीं था। हालांकि यह आप के लिए इसे काट नहीं लगता है।
केलेंज्ब

@Kellenjb दिलचस्प है, लेकिन मैं 8 बिट माइक्रो के लिए कुछ छोटा देख रहा हूँ
टोबी जाफ़े

1
@mikeselectricstuff हाँ, इसे एईएस होना चाहिए। मैं एईएस -128 का उपयोग करके एक मौजूदा प्रणाली के साथ हस्तक्षेप करने की कोशिश कर रहा हूं। मैं किसी भी छोटे एईएस कार्यान्वयन में दिलचस्पी रखता हूं, लेकिन मैं वर्तमान में PIC18 को लक्षित कर रहा हूं। मैं हाईटेक प्रो picc18 कंपाइलर का उपयोग कर रहा हूं।
टॉबी जाफि

जवाबों:


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;

इस संरचना का आकार २ + २ + ४ * १५ * = + १६ = ५०४ है। मुझे नहीं लगता है कि aes.c में कोई वैश्विक चर नहीं है, स्वचालित चर सभी छोटे हैं, इसलिए स्टैक का उपयोग भी उचित है। तो 7.5kB कहाँ जाता है? शायद आप केवल एईएस कार्यान्वयन को निकालने के बजाय पूरे पुस्तकालय का उपयोग करने की कोशिश कर रहे हैं?

वैसे भी, यह कार्यान्वयन बहुत सरल लगता है, मैं इस कोड से चिपकना चाहता हूं और इसे अनुकूलित करने का प्रयास करता हूं। मुझे पता है कि यह मुश्किल हो सकता है, लेकिन एईएस विवरण सीखने से आपको कम से कम पूर्ण न्यूनतम रैम उपयोग का अनुमान लगाने में मदद मिल सकती है।

अपडेट: मैंने सिर्फ IA-32 लिनक्स पर इस लाइब्रेरी को संकलित करने की कोशिश की है और एक साधारण सीबीसी एईएस -128 एन्क्रिप्शन परीक्षण लिखा है। निम्नलिखित परिणाम मिला (पहली संख्या खंड लंबाई हेक्स है):

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

यह सिर्फ 660 बाइट्स का .bs है (मैंने AES_CTX को एक वैश्विक चर के रूप में घोषित किया है)। अधिकांश .data में IV और कुंजी का कब्जा है। मैं यहाँ .text को शामिल नहीं करता, क्योंकि आपको PIC पर पूरी तरह से अलग परिणाम मिलेगा (डेटा अनुभाग दोनों आर्किटेक्चर पर लगभग समान आकार होना चाहिए)।


मैं axTLS संस्करण पर 10 के एक कारक से गलत हूं। आप सही हे। लेकिन, मैं अभी भी एईएस के अधिक कुशल संस्करणों में दिलचस्पी रखता हूं ...
टोबी जाफी

5
आकार या गति के मामले में कुशल? वास्तव में क्या अड़चनें हैं? ध्यान रखें कि छोटे पुस्तकालयों की संभावना धीमी होगी - यदि आप बड़े (कोड अनुभाग के संदर्भ में) पुस्तकालयों के स्रोत कोड को देखते हैं, तो अधिकांश ब्लोट पूर्व-परिकलित निरंतर सरणियों के कारण होता है।
कोड चित्रकार

1
रैम और रॉम पदचिह्न के संदर्भ में। गति कोई समस्या नहीं है, लेकिन मैं एक छोटे से उपकरण में बहुत सारी कार्यक्षमता को समेटना चाह रहा हूं।
टोबी जाफेई

14

मुझे पता है कि यह सवाल थोड़ा पुराना है, लेकिन मैंने अभी हाल ही में इसे खुद शोध किया है क्योंकि मैं एक PIC16 और 8051 पर AES128 को लागू कर रहा हूं, और इसलिए मैं इस प्रश्न के बारे में भी उत्सुक था।

मैंने कुछ इस तरह का उपयोग किया है: http://cs.ucsb.edu/~koc/cs178/projects/JT/aes.c और मेरा RAM उपयोग एक सौ बाइट्स है और बाइनरी आकार 3kb ROM से कम है।

मेरी सबसे अच्छी सलाह यह है कि आप विकिपीडिया पृष्ठ http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation पर पढ़ें और विभिन्न विधाओं को समझें, उदाहरण के लिए कि कैसे OFB मोड में AES बुनियादी भवन खंड की तरह ECB का उपयोग करता है। इसके अलावा XOR'ing (OFB- मोड में) यह एक सममित ऑपरेशन बनाता है, इसलिए एन्क्रिप्ट / डिक्रिप्ट वही फ़ंक्शन है जो अंतरिक्ष को भी बचाता है।

जब मुझे समझ में आया कि एईएस वास्तव में कैसे काम करता है, तो मैं इसे सी में लागू कर सकता हूं और फिर इसे एनआईएसटी विनिर्देश के खिलाफ परीक्षण कर सकता हूं ** (ऐसा करें! ऑनलाइन पाया गया बहुत कोड त्रुटिपूर्ण है) और केवल वही लागू करें जो मुझे बिल्कुल जरूरी था।

मैं यह अनुकूलन और अनुकूलन करके कुछ अन्य 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-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 बाइट्स रैम है।

मुझे याद नहीं है कि 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 कोड और 198bytes RAM।


मुझे आश्चर्य है कि 2001 में मैंने जो क्रियान्वयन किया, वह कैसा होगा। यह एस-बॉक्स उत्पन्न नहीं करता है; वे स्थिर हैं।
काज

6

मैंने हाल ही में axTLS कार्यान्वयन लिया और जितना संभव हो उतना इसे सिकोड़ने पर काम किया। आप आसानी से खुद एस-बॉक्स तैयार कर सकते हैं और अपने आप को कुछ सौ बाइट्स बचा सकते हैं।

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। : डी
एलेक्स

3

मैं सी, एईएस -128 में केवल एमईएस लाइसेंस के साथ एईएस-मिन नामक एक कार्यान्वयन कर रहा हूं । यह छोटे माइक्रोप्रोसेसरों (जैसे 8-बिट) को कम रैम / रोम के साथ लक्षित करता है।

इसमें मेमोरी आवश्यकताओं को कम करने के लिए वैकल्पिक ऑन-द-फ्लाई कुंजी शेड्यूल गणना है (रैम में पूर्ण विस्तारित कुंजी शेड्यूल की आवश्यकता से बचने)।


1

आपको यह कार्यान्वयन दिलचस्प लग सकता है । एक खुले स्रोत AVR क्रिप्टो-लिबरी से इसकी।

आप यहां कोड आकार और प्रदर्शन के बारे में कुछ सामान्य (पुरानी) जानकारी और आंकड़े पा सकते हैं ।

एईएस:

एईएस जानकारी

मैंने केवल उस परिवाद से SHA-1 स्रोत के साथ खेला, इसलिए मैं एईएस पर टिप्पणी नहीं कर सकता।


1

मैं टेक्सास के कार्यान्वयन के लिए उपयोग कर रहा हूँ msp430 एक Freescale माइक्रोकंट्रोलर S08SH8 में 512 रैम और 8k फ्लैश के साथ और साथ ही Arduino में भी बिना किसी कार्य के।

http://www.ti.com/lit/an/slaa547a/slaa547a.pdf

http://www.ti.com/tool/AES-128


0

PIC श्रृंखला के लिए मैंने लिखा सबसे छोटा AES128 900 निर्देशों और 42 बाइट्स रैम में चल सकता है। मैं इसे खुद PIC12 श्रृंखला पर उपयोग करता हूं, लेकिन PIC10F206 भी संभव है :-)।

मैं अपनी कंपनी से कोड का खुलासा नहीं कर सकता, लेकिन मैंने इसे PIC10-12-16 श्रृंखला के लिए asm में लिखा है। एन्क्रिप्शन कोड के 444 बाइट्स लेता है जिसमें 256 बाइट्स की लुकिंग टेबल भी शामिल है, इस कोड में कुंजी लोड फ़ंक्शन भी शामिल है जो कुछ 25 बाइट्स है।

मैं सभी को एईएस पेपर की जांच करने और इसे स्वयं लागू करने की सलाह दूंगा! अधिकांश कार्यान्वयन बहुत खराब हैं और बहुत राम और रोमांस के लिए उपयोग करते हैं।

मैंने dESPIC और PIC24 के लिए AES128 को भी लागू किया और माइक्रोचिप के लिब की तुलना में लगभग 70% कम कोड स्थान का उपयोग किया और मेरा कोड भी थोड़ा तेज है। dsPIC और PIC24 कार्यान्वयन संख्या:

"एन्क्रिप्शन लगभग 2995 चक्र लेता है। 79.10uS @ 40 MIPS, 197.75uS @ 16 MIPS"

"DecKeySetup में लगभग 567 चक्र लगते हैं। 14.20uS @ 40 MIPS, 35.43uS @ MII"

"डिक्रिप्शन में लगभग 3886 चक्र लगते हैं। 97.15uS @ 40 MIPS, 242.88uS @ 16 टिप्स"

"कुल कोड आकार 1050 शब्द incl टेबल है।"

PIC24 कोर के बारे में सुंदरता यह है कि कुछ निर्देश 32 बिट हैं और यह छोटे AES128 कार्यान्वयन के निर्माण के लिए जीवन को अधिक आसान बनाता है, मेरा कोड सभी 32 बिट निर्देशों का उपयोग करता है और पूरी तरह से 32 बिट संचालन में है इसलिए मैं कोड को जल्दी से पोर्ट कर सकता हूं PIC32 या अन्य 32 बिट सीपीयू।

एईएस लागू करने के लिए बहुत सरल है केवल ज्यादातर लोग कोशिश भी नहीं करते हैं!

लिंक देखें: http://www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf


क्या यह खुला स्रोत है? क्या आप कोड पोस्ट कर सकते हैं?
तोबी जाफि

2
@Paul - इलेक्ट्रिकल एंगेजिंग में आपका स्वागत है! आपका जवाब दिलचस्प और उत्साहजनक है, लेकिन यह अधिक विवरण के बिना वास्तव में उपयोगी नहीं है। 900 निर्देश शायद एक कोड ब्लॉक में फिट हो सकते हैं! कृपया इसे सुधारने के उत्तर के नीचे "संपादित करें" लिंक देखें।
केविन वर्मर

@PaulHolland बड़ी खबर, कोड कहां है?
फ्रैंक

2
@Paul - आपको वर्तमान में आपके पास मौजूद डाउनवोट के बजाय अपवॉट्स का ढेर मिल रहा होगा यदि आपने समझाया कि आपने इसे कैसे लिखा है और कोड पोस्ट किया है! यदि आप लाइसेंस कारणों के लिए कोड पोस्ट नहीं कर सकते हैं, तो कम से कम यह बताएं कि आपने इसे कैसे लिखा है और जॉबी आपके काम को कैसे समानांतर कर सकता है।
केविन वर्मियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.