マイクロコントローラー用の最小のAES実装?


38

誰でも、マイクロコントローラ用のAES-128 Rijndaelの小さな無料実装を推奨できますか 理想的には、PIC18の場合、Cでの一般的な実装が有用でしょう。

PIC18用のaxTLS実装をコンパイルし、ブロックを暗号化/復号化するには、6KB ROMと750bのRAMが必要です。

PIC18用にrijndael-alg-fst.cをコンパイルし、ブロックを暗号化/復号化するには、28KB ROMと0.5KB RAMが必要です。

ブライアングラッドマンの8ビットAESをPIC18用にコンパイルし、ブロックを暗号化/復号化するには、19KBのROMと190バイトのRAMが必要です。

最適化されたPIC固有のバリアントが利用可能ですか?

(axTLSバージョンの更新されたRAM要件)


1
これはブートローダー用ですか?
ダニエルグリロ

いいえ、それはネットワークアプリケーションのためだ
トビーJaffey

Microchipには、コードサイズが3,018バイトのdsPICおよびPIC 24の実装がありますが、暗号化のみがあり、復号化はありません。これを推測することはあなたのためにそれをカットしません。
ケレンブ

@Kellenjb興味深いですが、8ビットマイクロの小さなものを探しています
トビージャフィー

1
@mikeselectricstuffはい、AESである必要があります。AES-128を使用して既存のシステムと相互運用しようとしています。私は小さなAES実装に興味がありますが、現在はPIC18をターゲットにしています。HiTech Pro 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;

この構造のサイズは2 + 2 + 4 * 15 * 8 + 16 = 504です。aes.cにはグローバル変数はありません。自動変数はすべて小さいため、スタックの使用も合理的です。では、7.5kBはどこに行くのでしょうか?おそらく、ライブラリからAES実装を単に抽出するのではなく、ライブラリ全体を使用しようとしていますか?

とにかく、この実装は非常にシンプルに見えるので、このコードに固執して最適化を試みます。難しいこともありますが、AESの詳細を知ることで、少なくとも絶対的な最小RAM使用量を見積もることができます。

更新:このライブラリをIA-32 Linuxでコンパイルし、簡単なCBC AES-128暗号化テストを作成しようとしました。次の結果を得ました(最初の数字はセクションの長さの16進数です):

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

これは、660バイトの.bssです(AES_CTXをグローバル変数として宣言しました)。ほとんどの.dataはIVとキーで占められています。PICではまったく異なる結果が得られるため、ここには.textを含めません(データセクションは両方のアーキテクチャでほぼ同じサイズになります)。


axTLSバージョンで10倍誤読しています。あなたが正しい。しかし、私はまだAESのより効率的なバージョン...に興味がある
トビーJaffey

5
サイズや速度の面で効率的ですか?実際にはどのような制約がありますか?小さいライブラリは遅くなる可能性が高いことに注意してください-大きい(コードセクションの観点から)ライブラリのソースコードを調べると、ほとんどの膨張は事前に計算された定数配列によるものです。
コードペインター

1
RAMとROMのフットプリントに関して。速度は問題ではありませんが、多くの機能を小さなデバイスに詰め込みたいと考えています。
トビージャフィー

14

私はこの質問が少し古いことを知っていますが、PIC16と8051にAES128を実装しているので、最近自分で調査しなければならなかったので、この質問にも興味がありました。

私はこのようなものを使用しました:http : //cs.ucsb.edu/~koc/cs178/projects/JT/aes.c と私のRAMの使用量は数百バイトであり、バイナリサイズは3kb ROM未満です。

私の最善のアドバイスは、Wikipediaページhttp://en.wikipedia.org/wiki/Block_cipher_modes_of_operationを読んで 、さまざまなモード、たとえばOFBモードでのAESが基本的な構成要素としてECBモードを利用する方法を理解することです。また、(OFBモードの)XORにより対称操作になるため、暗号化/復号化は同じ機能であり、スペースも節約できます。

AESが実際にどのように機能するかを理解したら、Cで実装し、NIST仕様に対してテストします**(これを行う!オンラインで見つかった多くのコードに欠陥があります)。

このカスタマイズと最適化を行うことで、他の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用にコンパイルされた場合のGCCサイズ出力:

$ 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バイトRAMになりました。

PIC用のビルド方法は覚えていませんが、8ビット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コードと198バイトのRAM。


2001年に作成した実装がどのように積み重なるのだろうか。Sボックスは生成されません。それらは静的です。
カズ

6

私は最近axTLSの実装を採用し、できる限り縮小することに取り組みました。Sボックスを自分で簡単に生成し、数百バイトを節約できます。

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/で入手できます。


あなたは自分のものを知っています、アンドリュー。賛成。:D
アレックス

3

私はMITライセンスでaes-minと呼ばれるC、AES-128のみで実装を行ってきました。RAM / ROMの少ない小さなマイクロプロセッサ(8ビットなど)を対象としています。

オプションのオンザフライのキースケジュール計算を使用して、メモリ要件を削減します(RAM内の完全に拡張されたキースケジュールの必要性を回避します)。


1

この実装は興味深いかもしれません。そのオープンソースAVR暗号ライブラリから。

ここで、コードサイズとパフォーマンスに関する一般的な(古い)情報と統計を見つけることができます。

AES:

AES情報

私はそのライブラリのSHA-1ソースで遊んだだけなので、AESについてコメントすることはできません。



0

PICシリーズ用に作成した最小のAES128は、900命令と42バイトのRAMで実行できます。PIC12シリーズでは自分で使用していますが、PIC10F206も使用可能です:-)。

会社からのコードなので公開できませんが、PIC10-12-16シリーズ用にasmで記述しました。暗号化には、256バイトのルックアップテーブルを含む444バイトのコードが必要です。このコードには、約25バイトのキーロード機能も含まれていました。

AESペーパーを確認して、自分で実装することをお勧めします。ほとんどの実装は非常に悪く、多くのRAMとROMを使用します。

また、dsPICおよびPIC24にAES128を実装し、マイクロチップのlibと比較して使用するコードスペースが約70%少なくなり、コードも少し高速になりました。dsPICおよびPIC24の実装番号:

「暗号化には約2995サイクルかかります。40MIPSで79.10uS、16 MIPSで197.75uS」

「DecKeySetupには約567サイクルかかります。40MIPSで14.20uS、16 MIPSで35.43uS」

「復号化には約3886サイクルかかります。40MIPSで97.15uS、16 MIPSで242.88uS」

「合計コードサイズは、テーブルを含む1050ワードです。」

PIC24コアの利点は、一部の命令が32ビットであり、これにより小さなAES128実装を構築するのがはるかに簡単になることです。 PIC32または他の32ビットCPU。

AESは実装するのが非常に簡単で、ほとんどの人が!

リンクをご覧くださいhttp : //www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf


オープンソースですか?コードを投稿できますか?
トビージャフィー

2
@ポール-電気工学へようこそ!あなたの答えは興味深く、励みになりますが、それ以上の詳細がなければ本当に役に立ちません。900個の命令がコードブロックに収まる可能性があります。回答を改善するには、回答の下にある[編集]リンクをクリックしてください。
ケビンフェルメール

@PaulHolland素晴らしいニュース、コードはどこにありますか?
フランク

2
@Paul-あなたがそれをどのように書いてコードを投稿したかを説明すると、あなたは現在持っている下票の代わりに上票の山を手に入れるでしょう!ライセンス上の理由でコードを投稿できない場合は、少なくともコードの書き方とJobyがどのように作業を並列化できるかを説明してください。
ケビンフェルメール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.