技术开发 频道

Duwamish密码分析篇(三)

  ICryptoTransform 是一个接口。需要此接口才能在任何服务提供程序上调用 CreateEncryptor 方法,服务提供程序将返回定义该接口的实际 encryptor 对象。

  Encoding.Unicode.GetBytes()方法负责将原始字符串转换成字节数组。大多数 .NET 加密算法处理的是字节数组而不是字符串。
 
  现在可以执行实际的加密了。此进程需要创建一个数据流,用于将加密的字节写入到其中。要使用名为 ms 的 MemoryStream 对象、ICryptoTransform 对象(提供给 CryptoStream 类的构造函数)以及说明您希望在何种模式(读、写等)下创建该类的枚举常数。创建 CryptoStream 对象 cs 后,现在使用 CryptoStream 对象的 Write 方法将数据写入到内存数据流。这就是进行实际加密的方法,加密每个数据块时,数据将被写入 MemoryStream 对象。
 
  创建 MemoryStream 后,该代码将在 CryptoStream 对象上执行 FlushFinalBlock 方法,以确保所有数据均被写入 MemoryStream 对象。并调用CryptoStream 对象的Close方法关闭 CryptoStream 对象。
 
  最后,调用 Convert.ToBase64String() 方法,该方法接受字节数组输入并使用 Base64 编码方法将加密结果编码为可读内容,输出到TextBox显示。
 
  (2)DES解密

  Decrypt实例代码:

private void btnDecrypt_Click (object sender, System.EventArgs e) { SymmetricAlgorithm mCSP = new DESCryptoServiceProvider(); ICryptoTransform ct; MemoryStream ms; CryptoStream cs; byte[] byt; mCSP.Key = Convert.FromBase64String(txtKey.Text.Trim()); mCSP.IV = Convert.FromBase64String(txtIV.Text.Trim()); ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV); byt = Convert.FromBase64String(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 = Encoding.Unicode.GetString(ms.ToArray()); }
  Decrypt过程代码与Encrypt过程很相似,只有细微的差别。首先,Decrypt过程不需要重新生成随机的Key和IV,必须使用与上述Encrypt过程中相同的Key和IV,否则无法解密。
 
  另外,ICryptoTransform 是一个接口,这里是在DESCryptoServiceProvider服务提供程序上调用 CreateDecryptor方法,服务提供程序将返回定义该接口的实际decryptor对象。
 
  .Net Framework也支持其他加密/解密算法,如TripleDES,RC2,Rijndael,并且只要简单替换上述代码的DESCryptoServiceProvider服务提供程序对象,就可以切换到对应的加密算法。正是基于这一点,我们可以非常方便地构建一套标准的加密/解密通用类库,请参考Microsoft的《如何创建加密库》,这里不重复了。
 
  根据Microsoft的《如何创建加密库》编写的一个DEMO:
 
  知识点:Base64编码
 
  前面的加密/解密过程中,使用到.Net Framework提供的关于Base64编码的方法:
 
  (1)Convert.ToBase64String() 方法,该方法接受字节数组输入并使用 Base64 编码方法将加密结果编码为可读内容
  (2)Convert.FromBase64String()方法,该方法接受Base64 编码的字符串,输出字节数组。
 
  Base64是MIME邮件中常用的编码方式之一。它的主要思想是将输入的字符串或数据编码成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}这64个可打印字符的串,故称为Base64
 
  Base64编码的方法是,将输入数据流每次取6 bit,不足6bit的补0,用此6 bit的值(0-63)作为索引去查表,输出相应字符。这样,每3个字节将编码为4个字符(3×8 → 4×6)(之后在6位的前面补两个0,形成8位一个字节的形式),不满4个字符的以'='填充。转换后的字符串理论上将要比原来的长1/3。
 
  现在回到前面的DES算法中Key或者IV,Key长度为64位(8个字节),为了让Base64编码是4的倍数,就要补1个等号。

0
相关文章