現在、自分の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;
}