
Small portable AES128/192/256 in C
هذا تنفيذ صغير ومحمول لخوارزميات التشفير AES ECB وCTR وCBC المكتوبة بلغة C.
يمكنك تجاوز حجم المفتاح الافتراضي البالغ 128 بت باستخدام 192 أو 256 بت عن طريق تعريف الرمزين AES192 أو AES256 في aes.h.
واجهة البرمجة (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);
ملاحظات مهمة:
يمكنك اختيار استخدام أيٍّ من أوضاع التشغيل أو جميعها، بتعريف الرموز CBC أو CTR أو ECB في aes.h (اقرأ التعليقات للتوضيح).
يجب على مستخدمي C++ استخدام #include مع aes.hpp بدلاً من aes.h
لا يوجد فحص أخطاء مدمج أو حماية من أخطاء الوصول إلى الذاكرة خارج النطاق الناتجة عن إدخال خبيث.
تستهلك الوحدة أقل من 200 بايت من RAM و1-2 كيلوبايت من ROM عند ترجمتها لمعمارية ARM، ولكن قد تختلف النتائج (YMMV) اعتمادًا على الأوضاع المُفعَّلة.
إنها واحدة من أصغر التنفيذات بلغة C التي رأيتها حتى الآن، لكن لا تتردد في التواصل معي إذا كنت تعرف شيئًا أصغر (أو لديك تحسينات للكود هنا).
لقد استخدمت الكود بنجاح على منصات x86 ذات 64 بت، وARM ذات 32 بت، وAVR ذات 8 بت.
مخرجات الحجم من GCC عند ترجمة وضع CTR فقط لمعمارية ARM:
$ 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، ننتهي بحجم كود أقل بكثير من 1 كيلوبايت.
$ 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
أستخدم مترجم ARM GCC من مؤسسة البرمجيات الحرة (Free Software Foundation):
$ 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.
تم التحقق من هذا التنفيذ مقابل البيانات الواردة في:
المنشور الخاص 800-38A من المعهد الوطني للمعايير والتقنية (NIST)، إصدار 2001 الملحق F: متجهات أمثلة لأوضاع تشغيل AES.
الملاحق الأخرى في المستند قيّمة لتفاصيل التنفيذ، مثل الحشو، وتوليد IVs وnonces في وضع CTR، وما إلى ذلك.
شكرًا صادقًا من القلب لـكل الأشخاص الرائعين الذين ساهموا في هذا المشروع.
جميع المواد في هذا المستودع في المجال العام (public domain).