当前编写我自己的AMF TcpSocketServer。到目前为止,一切都很好,我可以发送和接收对象,并使用一些序列化/反序列化代码。现在我开始研究加密代码,并且我对这些东西不太熟悉。字节加密(DES-CBC零点填充)
- 我用字节工作,是DES-CBC加密这个东西的好 办法?或者是 还有其他更高性能/安全的 方式发送我的数据?注意 表演是必须的:)。
- 当我打电话时:ReadAmf3Object与解密指定我得到一个:InvalidOperationException抛出我的ReadAmf3Object函数,当我读出的第一个字节Amf3TypeCode没有指定(他们范围从0到16我相信(布尔,字符串,Int,DateTime等))。我得到的Typecode从97到254不等。任何人都知道最新的错误?我认为这与加密部分有关。由于解串器工作正常W/O加密。我正在使用正确的填充/模式/键?
我用:http://code.google.com/p/as3crypto/ as3加密/解密库。我写与线程池的一些滥用的异步TCP服务器;)
反正这里的一些代码:
C#crypter initalization代码
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;
}
感谢您的广泛答复。当我有更多时间在我的手上时,我会研究这个星期;)奇怪的是,我使用DES-CBC-PKCS#7 +在双方使用相同的密钥来获得随机字节。 – 2010-04-05 17:10:46