
C言語による小型ポータブルAES128/192/256
これは、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言語実装の1つですが、もっと小さいもの(またはここのコードの改良案)をご存知でしたら、ぜひご連絡ください。
このコードは、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.
この実装は、以下のデータに対して検証されています:
米国国立標準技術研究所特別出版800-38A 2001年版 付録F:AESの動作モードの例ベクトル。
この文書の他の付録は、パディングやCTRモードでのIV・ノンスの生成など、実装の詳細に関して有用です。
このプロジェクトに貢献してくださった すべてのすばらしい方々 に心からの感謝を申し上げます。
このリポジトリのすべての素材はパブリックドメインにあります。