2010-04-04 131 views
0

当前编写我自己的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; 
} 

回答

1

定义“安全”。

DES比纯文本更安全,但由于它的56位密钥大小,通常不再使用。如果你正在保护针对你的家人的数据,或者随便使用缓冲器,这可能是好的。

如果现在人们使用DES,那么它就是Triple DES,它基本上在每个数据块上运行三次DES。

现在,对称加密算法(DES)的选择是AES,它就像DES的精神继承者。

对于大多数应用来说,具有足够大的256个密钥(现在真的是512个或更多)的AES是安全的。

AES的一些注意事项是:

  1. 它仍然受限于美国出口管制
  2. 国家安全局可以解密您的信息,如果他们想(是 这是锡帽思维)

关于你的错误,首先尝试切换到AES,并看看你是否仍然有问题。

关于AES:

主要选择是很重要的,以及重点保护。

重点选择

如果你想“密码”保护您的数据,使用AES,那么你就需要你的密码转换成AES密钥。这是许多业余计算机安全开发人员常见的陷阱。通过使用用户密码的MD5散列作为密钥,Adobe基本上销毁了PDF中所有对AES的保护。不用说,你比Adobe的所有工程师都更聪明,所以你不会犯这个错误。

从密码生成密钥的正确方法是使用RFC2898 aka PBKD2(基于密码的密钥导出函数)。 .NET handily有一个方法可以做到这一点:Rfc2898DeriveBytes()。从本质上讲,它所做的就是用密码安全地散列你的密码,用用户提供的salt提供的盐(稍后详细介绍)。这提供了若干层,以防止对密码蛮力攻击(假设你的钥匙是足够大,以防止反对暴力攻击!)

  1. PBKD2的每次迭代花费的时间来运行一个微不足道的金额。你运行得越多(我认为推荐数字> 1000),计算机所花费的时间就越多。这一次还不如人意识到,但在计算机时代就像一个世纪。因此,在不知道确切的迭代次数的情况下,它使暴力攻击密码成为一个非常漫长的过程。

  2. 盐。 salt不是直接对密码进行散列,而是为输入密码添加额外信息,创建独特的散列。这可以防止彩虹表攻击,假设你保持你的盐值。

密钥存储

对方密码学是密钥存储。如果您是密码保护您的数据,那么您需要安全地存储密码。最简单的方法是使用操作系统的内置安全性。在注册表中使用DPAPI的Windows和Unix,文件权限。

AES作为重点

如果你正在寻找安全地传输跨越不安全的通道数据(甚至增加自己的额外的安全性ontop的SSL)的一个会议上,你可能要考虑使用AES作为会话加密。

本质上讲,这是二方案的加密系统,该系统的工作原理如下:

您将使用自己喜欢的不对称加密(RSA!)为您的服务器的公钥/私钥对。 每个可信客户端都被赋予公钥。 在会话期间,客户端会生成256位或更高的新随机AES密钥。 该AES会话密钥使用公共RSA密钥进行加密。 包含AES会话密钥的加密数据被发送到服务器。 服务器使用它的专用RSA密钥解密数据,并保留AES会话密钥。 在会话剩余时间内,所有数据都使用会话AES密钥加密。 在会话结束时,AES密钥被丢弃。

虽然这确实需要更多的握手,但这可以为您提供限制曝光的额外保护。由于AES密钥仅适用于会话,因此如果发现该密钥,损害仅限于一次会话。

+0

感谢您的广泛答复。当我有更多时间在我的手上时,我会研究这个星期;)奇怪的是,我使用DES-CBC-PKCS#7 +在双方使用相同的密钥来获得随机字节。 – 2010-04-05 17:10:46

0

DES是一种分组密码,所以通常它使字节工作更乏味。 AS3是一种主要用于GSM电话系统的流密码,因为它是一种流密码,它可以很好地与字节配合使用。

就个人而言,我会用RC4如果你确实需要使用流密码;它非常快。这里有http://dotnet-snippets.com/dns/rc4-encryption-SID577.aspx

一个很好的实现有你应该知道使用流密码时的一些很重要的注意事项:

1)NEVER再利用与流密码的加密密钥。

2)由于您一次只能加密一个字节,因此很难确定数据是否被篡改,因此您需要在数据流中添加数字签名或HMAC。

+0

AS3在OP指动作脚本3.我认为他是说他有一个C#应用程序交谈的AS3应用。 – Alan 2010-04-04 20:23:02