今天帮同学做课程设计,写了一天代码。
题目: 编写一个加密的即时通讯程序(难度系数0.8)
被困扰在加密的算法中,开始想用RSA算法,因为RSA加密算法 是另外一个题目。。可以顺便再帮另外一个同学写一下,,结果搞了半天发现RSA用来加密即使通讯消息不太合适,,
至少以我的能力写不出一个速度很快的加密解密函数,既然是即使通讯工具,速度慢的和蜗牛似的还通讯个P,,
不过其间查了大量资料对RSA算法的特性有了一定的了解,其主要难度在于大数的计算,这个计算真不是一般的麻烦,想到这里觉得自己的数学功底太弱了
搜了那么多资料现在还能记起来的比较实用的一个公式是:NR mod D = ( ( N mod D )R ) mod D
在CSDN某人的博客上看到的,里面还有很多推论地址:http://blog.csdn.net/fireseed/archive/2005/03/23/327444.aspx
后来选择了DEC加密算法,代码来至某博客,。忘记哪里弄来的了。
代码如下:
![](/Images/OutliningIndicators/None.gif)
public string JiaMi(string pToEncrypt,string KeyWord)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //把字符串放到byte数组中
![](/Images/OutliningIndicators/InBlock.gif)
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
//byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);
![](/Images/OutliningIndicators/InBlock.gif)
des.Key = ASCIIEncoding.ASCII.GetBytes(KeyWord); //建立加密对象的密钥和偏移量
des.IV = ASCIIEncoding.ASCII.GetBytes(KeyWord); //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
MemoryStream ms = new MemoryStream(); //使得输入密码必须输入英文文本
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
![](/Images/OutliningIndicators/InBlock.gif)
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
![](/Images/OutliningIndicators/InBlock.gif)
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ret.AppendFormat("{0:X2}", b);
}
//ret.ToString();
return ret.ToString();
}
//DEC 解密过程
public string JieMi(string pToDecrypt,string KeyWord)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
![](/Images/OutliningIndicators/InBlock.gif)
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for (int x = 0; x < pToDecrypt.Length / 2; x++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
![](/Images/OutliningIndicators/InBlock.gif)
des.Key = ASCIIEncoding.ASCII.GetBytes(KeyWord); //建立加密对象的密钥和偏移量,此值重要,不能修改
des.IV = ASCIIEncoding.ASCII.GetBytes(KeyWord);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
![](/Images/OutliningIndicators/InBlock.gif)
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
![](/Images/OutliningIndicators/InBlock.gif)
StringBuilder ret = new StringBuilder(); //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象
![](/Images/OutliningIndicators/InBlock.gif)
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
![](/Images/OutliningIndicators/None.gif)
//传进来的参数就是你要加密的那个字符串和密钥
后来还看了MD5加密算法,主要是想搞一个注册登录,用来加密用户密码。
在查资料的过程中在CSDN某人的博客上看到一条有趣的信息,写的是某MD5破解网站的广告,大概的意思就是,他们那个网站把所有手机号码,生日,以及几位的数字和字母的所有组合的MD5码都计算出来了,总共有256亿条信息好像。。还在不断的增长当中,可怕的信息,。,这样一来如果得到MD5加密码,一般的用户密码都能找出来了。。
看来算法一旦公布就算是铜墙铁壁也有人会拼死去撞,,真可怕
搞了半天自己的课程设计都没有写好,赶紧去搞定~~
posted on 2011-06-22 17:11
mr_chen 阅读(446)
评论(0) 编辑 收藏 引用 所属分类:
加密解密