
Small portable AES128/192/256 in C
यह C में लिखे गए AES ECB, CTR और CBC एन्क्रिप्शन एल्गोरिदम का एक छोटा और पोर्टेबल कार्यान्वयन है।
आप aes.h में AES192 या AES256 प्रतीकों को परिभाषित करके 128 बिट के डिफ़ॉल्ट कुंजी-आकार को 192 या 256 बिट में बदल सकते हैं।
API बहुत सरल है और इस तरह दिखता है (मैं C99 <stdint.h>-शैली के एनोटेटेड प्रकारों का उपयोग कर रहा हूँ):
/* Initialize context calling one of: */
void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key);
void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv);
/* ... or reset IV at random point: */
void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv);
/* Then start encrypting and decrypting with the functions below: */
void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf);
void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf);
void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);
void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);
/* Same function for encrypting as for decrypting in CTR mode */
void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);
महत्वपूर्ण नोट:
आप aes.h में CBC, CTR या ECB प्रतीकों को परिभाषित करके किसी भी या सभी ऑपरेशन-मोड का उपयोग करना चुन सकते हैं (स्पष्टीकरण के लिए टिप्पणियाँ पढ़ें)।
C++ उपयोगकर्ताओं को aes.h के बजाय aes.hpp को #include करना चाहिए।
दुर्भावनापूर्ण इनपुट के परिणामस्वरूप आउट-ऑफ-बाउंड मेमोरी एक्सेस त्रुटियों से कोई अंतर्निहित त्रुटि जाँच या सुरक्षा नहीं है।
ARM के लिए संकलित होने पर यह मॉड्यूल 200 बाइट्स से कम RAM और 1-2K ROM का उपयोग करता है, लेकिन यह इस बात पर निर्भर करता है कि कौन से मोड सक्षम हैं।
यह C में अब तक देखे गए सबसे छोटे कार्यान्वयनों में से एक है, लेकिन यदि आप किसी छोटे कार्यान्वयन के बारे में जानते हैं (या यहाँ कोड में सुधार हैं) तो कृपया मुझसे संपर्क करें।
मैंने इस कोड का उपयोग 64-बिट x86, 32-बिट ARM और 8-बिट AVR प्लेटफार्मों पर सफलतापूर्वक किया है।
जब केवल CTR मोड ARM के लिए संकलित किया जाता है तो GCC आकार आउटपुट:
$ arm-none-eabi-gcc -Os -DCBC=0 -DECB=0 -DCTR=1 -c aes.c
$ size aes.o
text data bss dec hex filename
1171 0 0 1171 493 aes.o
.. और THUMB निर्देश सेट के लिए संकलित करने पर, हम कोड आकार में 1K से काफी नीचे पहुँच जाते हैं।
$ arm-none-eabi-gcc -Os -mthumb -DCBC=0 -DECB=0 -DCTR=1 -c aes.c
$ size aes.o
text data bss dec hex filename
903 0 0 903 387 aes.o
मैं Free Software Foundation, ARM GCC कंपाइलर का उपयोग कर रहा हूँ:
$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (4.8.4-1+11-1) 4.8.4 20141219 (release)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
यह कार्यान्वयन निम्नलिखित डेटा के विरुद्ध सत्यापित है:
National Institute of Standards and Technology Special Publication 800-38A 2001 ED परिशिष्ट F: AES के ऑपरेशन मोड के लिए उदाहरण वेक्टर।
दस्तावेज़ के अन्य परिशिष्ट कार्यान्वयन विवरणों के लिए मूल्यवान हैं, जैसे कि पैडिंग, CTR-मोड में IV और नॉनस का निर्माण आदि।
इस परियोजना में योगदान देने वाले सभी अच्छे लोगों को हार्दिक धन्यवाद।
इस रिपॉजिटरी में सभी सामग्री सार्वजनिक डोमेन में है।