面是来自维基的关于DES的说明: 数据加密标准( DES )是一种加密演算法(一种加密信息的方法), 1976年被美国联邦政府的联邦信息处理标准(FIPS)所选中,随后既在国际上广泛流传开来。这个演算法因为包含一些机密设计元素,相关的短密钥长度以及被怀疑内含国家安全局(NSA)的后门而在开始是有争议的,DES因此收到强烈的学院派式的审查,并以此推动了现代的分组密码及其密码分析。这个演算法因为包含一些机密设计元素,相关的短密钥长度以及被怀疑内含国家安全局(NSA)的后门而在开始是有争议的,DES因此收到强烈的学院派式的审查,并以此推动了现代的分组密码及其密码分析。
DES现在已经不被视为一种安全的加密演算法,因为它使用的56位秘钥过短,以现代计算能力,24小时内极可能被破解。 也有一些分析报告提出了该演算法的理论上的弱点,虽然实际情况未必出现。该标准在最近已经被高级加密标准(AES)所取代。
虽然是一种被取代了的算法,不过通过理解和研究这种算法的实现,还是可以带给我们不少启示的。下面是实现的C#代码:
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Text; using System.IO; using System.Security.Cryptography; private void menuItem13_Click( object sender, System.EventArgs e) { //对应加密函数DSACrypData(string strcrypto) string strcrypto=richTextBox1.Text; DSACrypData(strcrypto); } public static void DSACrypData(string strcrypto) { //先要将字符串转换为字节数组,这与编码有关。 string str = "this is a test."; byte[] bytes = Encoding.ASCII.GetBytes(str); //选择签名方式,有RSA和DSA DSACryptoServiceProvider dsac = new DSACryptoServiceProvider(); byte[] sign = dsac.SignData(bytes); //sign便是出来的签名结果。 //下面是认证了 DSACryptoServiceProvider dsac2 = new DSACryptoServiceProvider(); dsac2.FromXmlString(dsac.ToXmlString(false)); bool ver = dsac2.VerifyData(bytes, sign); if (ver) { MessageBox.Show("通过"); } else { MessageBox.Show("不能通过"); } } private void menuItem17_Click( object sender, System.EventArgs e) { //对应加密函数DSACrypData(string strcrypto) string strData=richTextBox1.Text; richTextBox2.Text=DESEncodeData(strData); } public static string DESEncodeData(string data) { string KEY_64 = "VavicApp"; string IV_64 = "VavicApp"; byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); int i = cryptoProvider.KeySize; MemoryStream ms = new MemoryStream(); CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey,byIV), CryptoStreamMode.Write); StreamWriter sw = new StreamWriter(cst); sw.Write(data); sw.Flush(); cst.FlushFinalBlock(); sw.Flush(); return Convert.ToBase64String( ms.GetBuffer(),0,(int)ms.Length); } private void menuItem21_Click( object sender, System.EventArgs e) { //对应加密函数DSACrypData(string strcrypto) string strData=richTextBox1.Text; richTextBox2.Text=DESDecodeData(strData); } public static string DESDecodeData(string data) { string KEY_64 = "VavicApp"; string IV_64 = "VavicApp"; byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); byte[] byEnc; try { byEnc = Convert.FromBase64String(data); } catch { return null; } DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); MemoryStream ms = new MemoryStream(byEnc); CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey,byIV), CryptoStreamMode.Read); StreamReader sr = new StreamReader(cst); return sr.ReadToEnd(); }