0

バイト配列を生成unsigned * charし、そのデータを fwrite を使用してワイヤレス ストリーム経由で送信するプログラムがあります。

そのバイト配列を圧縮して別のバイト配列に暗号化したいのですが、組み込みシステムでコードを実行しているので、新しいライブラリをロードしたくありません。圧縮関数と暗号化関数を自分で書きたいと思います。

言い換えれば、私のプログラムは次のとおりです。

void send(STREAM* s, unsigned* char byteArr) {
  fwrite(s, byteArr);
}

代わりに、関数を作成したいと思います。

void send(STREAM* s, unsigned* char byteArr) {
    unsgiend* char compressedArr = compressCharArr(byteArr);
    unsigned* char encryptedArr = encryptCharArr(compressedArr)
    fwrite(s, encryptedArr);
}

unsigned* char encryptedArr(unsigned* char byteArr) {
  // make the encrypted byte array (?)
}

unsigned* char compressedArr (unsigned* char byteArr) {
  // make the compressed byte array (?)
}

私の質問は、C でこれを達成するために自分で書き出せる簡単なアルゴリズムは何ですか? 私は、標準の C コードのみを使用し、ライブラリを使用せず、数学、for ループなどのみを使用することを好みます。

暗号化に関しては、暗号化には通信の両端でキー/パスワードが必要であることを理解しています。キーが共有されており、対称暗号化を使用していると仮定しましょう。

zip、7zip、gzip と同じアルゴリズムを使用してもかまいません。これらの圧縮システムには暗号化/パスワード保護も含まれていることは知っています。ライブラリやDLLなどを組み込みシステムに挿入せずに簡単に実装する方法がわかりません。

PS - 私は自分のコードの近くにいないので、私の構文は fwrite() でオフになっている可能性があります。私のコーディング例が私の意図を明確に示していることを願っています。

追加: Cコードは「Atmega168」と呼ばれるチップで実行されていることを言及しておきます...ライブラリを使用することが唯一の確実な方法である場合、このタイプのチップ用に最適化されたライブラリを推奨できますか? http://www.atmel.com/devices/atmega168.aspx

4

2 に答える 2

4

独自の暗号化アルゴリズムを作成することはお勧めできません。たとえあなたがそれをコピーしたとしても。多くのサイドチャネルやその他の予期しない攻撃があり、本当に落胆しています。

代わりに、 AES (ソフトウェアを使用しているため) や3DES (ハードウェア アプローチが必要な場合) などのよく知られた安全なアルゴリズムを使用することをお勧めします。より高速なアルゴリズムが必要なリソースに本当に制約がある場合は、「軽量対称暗号」と呼ばれる非常に高速な対称暗号もありますが、これは新しい分野であり、アプリケーションの範囲を超えている可能性があります。

これらのアルゴリズムを持ち、使用しているデバイス用に最適化されたライブラリを使用することをお勧めします (多くの場合、非常に高速なアセンブリ パーツで設計されています)。それらに対して静的にコンパイルできる場合は、自分でコーディングするよりもオーバーヘッドが発生することはありません。しかし、彼らのコードはおそらくより高速で安全です。

圧縮について: 暗号化する前に圧縮することを念頭に置いてください。この方法で圧縮するには、速度、サイズ、エントロピーなどのさまざまな理由があります。後で暗号化された圧縮データへの攻撃について聞いたことがありますが、今のところ見つかりません。非常に重要なことを行っていない限り、これを問題とは見なしません (一般的なインターネット通信に対する SSL/TLS のような影響を考えてください)。

于 2013-04-14T18:23:00.360 に答える