技术开发 频道

Duwamish密码分析篇(三)

【IT168技术文档】

  通过前面关于《Duwamish密码分析篇, Part 1-2》的POST,可以了解到Duwamish中关于Password的处理方式。Duwamish 7.0范例中的帐户密码通过SHA1散列运算和对散列执行Salt运算后,然后以byte形式存放在Database中,避免明文的方式,以提高系统的安全性。
 
  但是,由于散列是单向操作,使用散列算法对原始密码加密后将无法再恢复。因此,在实际的应用系统中,上述的加密过程有一个小问题:就是当有大量的用户忘记了自己的Password,如何帮助他们恢复自己的Password呢?
 
  因此,对于一般的商业应用,通过.Net的加密/解密类库来同时实现上述目的,既加密Password等重要信息,同时也可以在必要的时候解密这些信息。
 
  加密算法使可以将数据掩盖起来,除了特定人员能够对其解密外,其他人员不大可能通过数学方法读取该数据。但如果希望读取该数据,则可以为其提供一个特定的密钥,使其能够解密并读取数据。.NET Framework 中有多种可用的加密/解密算法。
 
  目前有两种加密方法:
 
  对称算法(或密钥算法)的速度非常快,非常适于加密大型的数据流。这些算法可以加密数据,也可以解密数据。对称加密技术的数据交换两边(即加密方和解密方)必须使用一个保密的私有密钥。
 
  不对称算法(或公钥算法)没有对称算法快,但其代码较难破密。这些算法取决于两个密钥,一个是私钥,另一个是公钥。公钥用来加密消息,私钥是可以解密该消息的唯一密钥。公钥和私钥通过数学方法链接在一起,因此要成功进行加密交换,必须获得这两个密钥。由于可能会影响到计算机性能,因此不对称算法不太适用于加密大量数据。不对称算法的常见用法是将对称密钥和初始化向量加密并传输给对方。然后在双方之间来回发送的消息中使用对称算法加密和解密数据。不对称算法主要有RSA、DSA等,主要用于网络数据的加密。保护HTTP传输安全的SSL就是使用非对称技术。
 
  本文先主要学习.Net中如下对称算法(或密钥算法)类库,包括以下几种:
 
  DES(Data Encryption Standard),TripleDES,RC2,Rijndael
 
  对称算法(或密钥算法)使用一个密钥和一个初始化向量 (Initialization Vector,IV) 来保证数据的安全。加密的功效取决于所用密钥的大小,密钥越长,保密性越强。典型的密钥长度有64位、128位、192位、256位和512位。使用该数据的双方都必须知道这个密钥和初始化向量才能够加密和解密数据。必须确保该密钥的安全,否则其他人将有可能解密该数据并读取该消息。初始化向量只是一个随机生成的字符集,使用它可以确保任何两个文本都不会生成相同的加密数据。然后,在此基础上学习开发一套标准的加密/解密通用类库,供今后开发应用系统时使用。
 
  .Net Framework内置加密/解密算法类库
 
  .NET Framework 为各种最广泛使用的对称加密算法提供了支持。.NET构架从基本的SymmetricAlgorithm类扩展出来四种算法:
 
  ·System.Security.Cryptography.DES
  ·System.Security.Cryptography.TripleDES
  ·System.Security.Cryptography.RC2
  ·System.Security.Cryptography.Rijndael
 
  .NET的对称加密和解密通过CryptoStream类来处理的,它继承自System.IO.Stream,使用 CryptoStream 对象的 Write 方法将数据写入到内存数据流(Memory Stream),这就是进行实际加密/解密的方法。
 
  先以DES算法为例,了解.Net为我们提供的简单加密/解密过程:
 
  (1)DES加密

  Encrypt实例代码:

private void btnEncrypt_Click (object sender, System.EventArgs e) { SymmetricAlgorithm mCSP = new DESCryptoServiceProvider(); ICryptoTransform ct; MemoryStream ms; CryptoStream cs; byte[] byt; byte [] key, iv; key = mCSP.Key; iv = mCSP.IV; ct = mCSP.CreateEncryptor(key, iv); txtKey.Text = Convert.ToBase64String(key); txtIV.Text = Convert.ToBase64String(iv); byt = Encoding.Unicode.GetBytes(txtOriginal.Text.Trim()); ms = new MemoryStream(); cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); txtResults.Text = Convert.ToBase64String(ms.ToArray()); }
  首先创建 DESCryptoServiceProvider 对象,要使用对称算法,必须提供要使用的密钥。每个 CryptoSymmetricAlgorithm 实现都提供一种 GenerateKey 方法。它们实际上使用的是公共语言运行时 (CLR) 类中内置的随机数生成器类。在首次调用DESCryptoServiceProvider 对象的Key属性时,因为该属性为Null,则自动调用GenerateKey 方法来生成随机Key。密钥的大小取决于用来加密的特定提供程序。例如,DES 密钥的大小为 64 位,而 TripleDES 密钥的大小为 192 位。每个 SymmetricAlgorithm 类上都有一个 KeySize 属性,它将返回用于生成密钥的密钥大小。
 
  然后是需要生成初始化向量 (IV),如果IV属性为Null,也是自动调用GenerateIV方法,生成IV。只要使用的 IV 不同,即使密钥相同,同一个数据也会被加密成完全不同的值。当然,你可以自己指定特定的Key和IV,但要注意的不同的加密算法,可能采用不同的Key长度和IV长度。

0
相关文章