純粋なポータブル C で書かれたストリーム暗号の適切な実装を持っている人はいますか? 現時点では暗号の強度についてはそれほど気にしていません。これは概念実証のためだけのものだからです。ただし、速度は重要です。適切なストリーム暗号が見つからない場合は、定数で Xor することを考えました。
7 に答える
編集 (2018): NaClまたはlibsodiumを使用するか、より小さなコード フットプリントを探している場合はTweetNaClを使用します。それらは強力な暗号化を提供し、RC4 よりもはるかに高速です。
RC4は、実装が非常に単純なアルゴリズムです。
Sterling Camden の実装またはAdam Back の実装を調べてください。
ECRYPTeStreamプロジェクトを参照してください。これらは、セキュリティの専門家によって判断された深刻なハードコア暗号化アルゴリズムです。私の知る限り、すべての候補アルゴリズムには、純粋なC(C ++ではない)での実装を含める必要がありました。
編集:そのWebサイトの優れている点は、既知の弱点を含むさまざまなアルゴリズムについて深く掘り下げており、パフォーマンスベンチマークも含まれていることです。
純粋な POC アプリケーションの場合、ROT13 をすばやく配置できます。 http://en.wikipedia.org/wiki/ROT13
ただし、後で置き換えることを意図した単純なPOCコードが頻繁にあるため、提案をするのをためらっています...
ブローフィッシュは問題なく動きました。DES よりも高速であると主張しています。
これは、C でのストリーム暗号の非常に基本的な実装です。これは、決して安全であることを意図したものではありません。必要な基本的な手順を実行する方法を簡単に示しています。
CycleKey
真の魔法は、データの各チャンクが暗号化ストリームを通過するたびに新しいキー値を生成する関数で実行する必要があります。
この例では、一度に 1 つずつ暗号化char
します。暗号化を安全に近づけるためには、概念をより大きなデータのチャンクに拡張する必要があります。繰り返しますが、これは単に基本的な手順を説明するために行ったものです。
プロジェクト頑張ってください!
#include <stdio.h>
char staticKey;
void CycleKey(char data)
{
/* this is where the real magic should occur */
/* this code does *not* do a good job of it. */
staticKey += data;
if (staticKey & 0x80)
{
staticKey ^= 0xD8;
}
else
{
staticKey += 0x8B;
}
}
void ResetCipher(const char * key)
{
staticKey = 0;
while (*key)
{
CycleKey(*key);
key++;
}
}
void Encrypt(const char * plaintext, char * encrypted)
{
while (*plaintext)
{
*encrypted = *plaintext + staticKey;
CycleKey(*encrypted);
encrypted++;
plaintext++;
}
*encrypted = '\0';
}
void Decrypt(char * plaintext, const char * encrypted)
{
while (*encrypted)
{
*plaintext = *encrypted - staticKey;
CycleKey(*encrypted);
plaintext++;
encrypted++;
}
*plaintext = '\0';
}
int main(void)
{
char * key = "123";
char * message = "Hello, World!";
char encrypted[20];
char decrypted[20];
ResetCipher(key);
Encrypt(message, encrypted);
ResetCipher(key);
Decrypt(decrypted, encrypted);
printf("output: %s\n", decrypted);
return 0;
}
OpenSSLを見ましたか?多くの暗号化アルゴリズムとプリミティブが安全に実装されています。ネットワーク関連で使用する必要はありません。ただし、十分に文書化されていないか、習得が容易ではありません。セキュリティを重視する場合 (たとえば、クレジット カードなどのプライベートなユーザー データを保存している場合) は、独自のものを作成するのではなく、OpenSSL またはその他の安全な実装を確実に使用する必要があります。