字节加密(DES-CBC零垫)

时间:2010-04-04 19:46:01

标签: c# .net actionscript-3 encryption amf

目前正在编写自己的AMF TcpSocketServer。到目前为止,一切都很好,我可以发送和接收对象,我使用一些序列化/反序列化代码。现在我开始研究加密代码,我对这些东西并不熟悉。

  • 我使用字节,DES-CBC很好 加密这个东西的方法?或者是 还有其他更高效/安全的 发送数据的方式?注意 表现是必须的:)。
  • 当我使用指定的解密器调用: ReadAmf3Object 时,我得到一个:当我读出未指定Amf3TypeCode的第一个字节时,我的ReadAmf3Object函数抛出的InvalidOperationException(它们的范围从0到16 i相信(Bool,String,Int,DateTime等))。我的Typecodes从97到254不等?谁知道什么出错了?我认为它与加密部分有关。由于解串器在没有加密的情况下工作正常。我正在使用正确的填充/模式/密钥?

我使用:http://code.google.com/p/as3crypto/作为加密/解密库。我写了一个Async tcp服务器,滥用了线程池;)

无论如何这里有一些代码:

C#crypter初始化代码

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;
}

2 个答案:

答案 0 :(得分:1)

定义“安全”。

DES比纯文本更安全,但由于它是56位密钥,因此通常不再使用它。如果你正在保护数据不受你的家人的影响,或者是随意的轻松滴管,这可能没问题。

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

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

具有256的足够大的密钥(现在真的是512或更高)的AES在大多数应用程序中都是加密安全的。

AES的几点注意事项是:

  1. 它仍受限于美国出口管制
  2. NSA可以根据需要解密您的信息(是的 这是锡帽的想法)
  3. 关于您的错误,请先尝试切换到AES,然后查看是否仍有问题。

    关于AES:

    密钥选择很重要,还有密钥保护。

    密钥选择

    如果您想使用AES“密码”保护您的数据,则需要将密码转换为AES密钥。这是许多业余计算机安全开发人员常见的陷阱。通过使用用户密码的MD5哈希作为密钥,Adobe基本上破坏了其PDF中的AES的所有保护。毋庸置疑,你比Adobe的所有工程师都聪明,所以你不会犯这个错误。

    从密码生成密钥的正确方法是使用RFC2898又名PBKD2(基于密码的密钥派生函数)。 .NET方便地使用一种方法:Rfc2898DeriveBytes()。基本上它的作用是以加密方式安全地散列您的密码,使用提供的盐(更多内容),多次,由用户提供。这提供了几个层来防止对您的密码的暴力攻击(假设您的密钥足够大,以防止暴力攻击它!)

    1. PBKD2的每次迭代都需要很短的时间才能运行。您运行的交互越多(我认为建议的数字> 1000),计算机所需的时间就越多。这个时间仍然比人类所认识的要少,但在计算机时代,它就像一个世纪。因此,在不知道确切的迭代次数的情况下,它会使暴力破解密码成为一个非常漫长的过程。

    2. 盐。 salt不是直接对密码进行哈希,而是在输入密码中添加额外信息,从而创建唯一的哈希值。假设您保持盐值受到保护,这可以防止彩虹表攻击。

    3. 密钥存储

      密码学的另一面是密钥存储。如果您使用密码保护数据,则需要安全地存储密码。最简单的方法是使用操作系统的内置安全性。在Windows上使用注册表中的DPAPI和Unix,filepermissions。

      AES作为会话密钥

      如果您希望通过非安全通道安全地传输数据(甚至在SSL上添加自己的额外安全性),您可能希望将AES用作会话加密。

      本质上,这是两个方案加密系统,其工作方式如下:

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

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

答案 1 :(得分:0)

DES是一种分组密码,因此通常它使得使用字节更加繁琐。 AS3是一个主要用于GSM电话系统的流密码,因为它是一个流密码,它可以很好地处理字节。

就个人而言,如果真的需要使用流密码,我会使用RC4;这很快。这里有一个很好的实现http://dotnet-snippets.com/dns/rc4-encryption-SID577.aspx

使用流密码时,您应该注意一些非常重要的注意事项:

1)从不使用流密码重新使用加密密钥。

2)因为您一次加密一个字节,所以很难确定数据是否已被篡改,因此您需要向流添加数字签名或HMAC。