0

現在、自分のAMFTcpSocketServerを作成しています。これまでのところ、すべてが正常に機能しており、オブジェクトを送受信でき、シリアル化/逆シリアル化コードを使用しています。今、私は暗号化コードに取り組み始めましたが、私はこのようなものにあまり精通していません。

  • 私はバイトを使用していますが、DES-CBCはこのようなものを暗号化するための良い方法ですか?または、データを送信するためのよりパフォーマンスの高い/安全な方法は他にありますか?パフォーマンスは必須であることに注意してください:)。
  • 復号化機能が指定されたReadAmf3Objectを呼び出すと、Amf3TypeCodeが指定されていない最初のバイトを読み取るときにReadAmf3Object関数によってスローされるInvalidOperationExceptionが発生します(0〜16の範囲であると思います(Bool、String、Int、DateTime、など))。タイプコードは97から254まで変化しますか?何がうまくいかないのか誰もが知っていますか?暗号化の部分と関係があると思います。デシリアライザーは暗号化なしで正常に動作するため。正しいパディング/モード/キーを使用していますか?

私が使用したのは、 http : //code.google.com/p/as3crypto/asas3暗号化/復号化ライブラリです。そして、私はスレッドプールを悪用して非同期TCPサーバーを作成しました;)

とにかくここにいくつかのコード:

C#クリプター初期化コード

System.Security.Cryptography.DESCryptoServiceProvider crypter = new DESCryptoServiceProvider();

crypter.Padding = PaddingMode.Zeros;
crypter.Mode = CipherMode.CBC;
crypter.Key = Encoding.ASCII.GetBytes("TESTTEST");

AS3

private static var _KEY:ByteArray = Hex.toArray(Hex.fromString("TESTTEST"));
private static var _TYPE:String = "des-cbc";

public static function encrypt(array:ByteArray):ByteArray
{
 var pad:IPad = new NullPad;
 var mode:ICipher = Crypto.getCipher(_TYPE, _KEY, pad);

 pad.setBlockSize(mode.getBlockSize());
 mode.encrypt(array);

 return array;
}

public static function decrypt(array:ByteArray):ByteArray
{
 var pad:IPad = new NullPad;
 var mode:ICipher = Crypto.getCipher(_TYPE, _KEY, pad);

 pad.setBlockSize(mode.getBlockSize());
 mode.decrypt(array);

 return array;
}

C#コードの読み取り/逆シリアル化/復号化

public override object Read(int length)
{
    object d;

    using (MemoryStream stream = new MemoryStream())
    {
    stream.Write(this._readBuffer, 0, length);
    stream.Position = 0;

    if (this.Decrypter != null)
    {
        using (CryptoStream c = new CryptoStream(stream, this.Decrypter, CryptoStreamMode.Read))
        using (AmfReader reader = new AmfReader(c))
        {
        d = reader.ReadAmf3Object();
        }
    }
    else
    {
        using (AmfReader reader = new AmfReader(stream))
        {
        d = reader.ReadAmf3Object();
        }
    }           
    }

    return d;
}
4

2 に答える 2

1

「安全」を定義します。

DESはプレーンテキストよりも安全ですが、56ビットのキーサイズであるため、通常は使用されなくなりました。家族やカジュアルなイーズドロッパーからデータを保護している場合は、これで問題ない可能性があります。

最近DESを使用している場合、各データブロックで基本的にDESを3回実行するのはトリプルDESです。

現在、選択されている対称暗号化アルゴリズム(DES)はAESであり、これはDESの精神的な後継者のようなものです。

十分に大きなキーが256(現在は実際には512以上)のAESは、ほとんどのアプリケーションで暗号的に安全です。

AESのいくつかの注意点は次のとおりです。

  1. それはまだ米国の輸出管理に制限されています
  2. NSAは、必要に応じて情報を復号化できます(はい、これはブリキの帽子の考え方です)

エラーについては、最初にAESに切り替えてみて、それでも問題が発生するかどうかを確認してください。

AESについて:

キーの選択は、キーの保護と同様に重要です。

キーの選択

AESを使用してデータを「パスワード」で保護する場合は、パスワードをAESキーに変換する必要があります。これは、多くのアマチュアコンピュータセキュリティ開発者に共通の落とし穴です。アドビは、ユーザーパスワードのMD5ハッシュをキーとして使用することにより、PDF内のAESのすべての保護を本質的に破壊しました。言うまでもなく、あなたはアドビのすべてのエンジニアを合わせたよりも賢いので、その間違いを犯すことはありません。

パスワードからキーを生成する適切な方法は、RFC2898、別名PBKD2(パスワードベースのキー導出関数)を使用することです。.NETには、これを行うメソッドRfc2898DeriveBytes()があります。基本的に、これが行うことは、ユーザーによって何度も提供されたソルト(これについては後で詳しく説明します)を使用して、パスワードを暗号的に安全にハッシュすることです。これにより、パスワードに対するブルートフォース攻撃から保護するためのいくつかのレイヤーが提供されます(キーがブルートフォース攻撃を防ぐのに十分な大きさであると想定しています)。

  1. PBKD2の各反復は、実行にごくわずかな時間を要します。実行するインタラクションが多いほど(推奨数は1000を超えると思います)、コンピュータの時間が長くなります。この時間はまだ人間が認識するよりも短いですが、コンピュータの時間ではそれは一世紀のようです。したがって、正確な反復回数がわからない場合、パスワードをブルートフォース攻撃するのは非常に長いプロセスになります。

  2. 塩。ソルトは、パスワードを直接ハッシュするのではなく、入力パスワードに追加情報を追加して、一意のハッシュを作成します。これにより、ソルト値を保護していると仮定して、レインボーテーブル攻撃を防ぐことができます。

キーストレージ

暗号化のもう1つの側面は、キーストレージです。データをパスワードで保護している場合は、パスワードを安全に保存する必要があります。最も簡単な方法は、OSに組み込まれているセキュリティを使用することです。レジストリでDPAPIを使用しているWindows、およびUnixでは、filepermissions。

セッションキーとしてのAES

安全でないチャネルを介してデータを安全に送信することを検討している場合(またはSSLに独自のセキュリティを追加することも)、セッション暗号化としてAESを使用することを検討することをお勧めします。

基本的に、これは次のように機能する2つのスキームの暗号化システムです。

サーバーのお気に入りの非対称暗号化(RSA!)を使用して、公開鍵と秘密鍵のペアを生成します。信頼できる各クライアントには公開鍵が与えられます。セッション中に、クライアントは256ビット以上の新しいランダムAESキーを生成します。このAESセッションキーは、公開RSAキーを使用して暗号化されます。AESセッションキーを含むこの暗号化されたデータはサーバーに送信されます。サーバーは、RSA秘密鍵を使用してデータを復号化し、AESセッション鍵を保持します。セッションの残りの間、すべてのデータはセッションAESキーで暗号化されます。セッションの終了時に、AESキーは破棄されます。

これにはより多くのハンドシェイクが必要ですが、これにより、露出を制限する保護が強化されます。AESキーはセッションにのみ有効であるため、AESキーが検出された場合、損傷は1つのセッションに限定されます。

于 2010-04-04T20:21:31.977 に答える
0

DESはブロック暗号であるため、一般に、バイトの操作がより面倒になります。AS3は、主にGSM電話システムで使用されるストリーム暗号です。これはストリーム暗号であるため、バイトでうまく機能します。

個人的には、本当にストリーム暗号を使用する必要がある場合は、RC4を使用します。とても速いです。ここに良い実装がありますhttp://dotnet-snippets.com/dns/rc4-encryption-SID577.aspx

ストリーム暗号を使用するときに注意する必要があるいくつかの非常に重要な警告があります。

1)ストリーム暗号で暗号化キーを再利用しないでください。

2)一度に1バイトを暗号化するため、データが改ざんされているかどうかを判断するのは困難です。そのため、ストリームにデジタル署名またはHMACを追加する必要があります。

于 2010-04-04T20:20:21.307 に答える