MD5加密(2)
1:MD5
以前在asp时代常用的MD5算法好象是从动网流出来的,后来大家都用它,基本上有两种,区别在md5.asp的结尾部分
MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
MD5=LCase(WordToHex(b) & WordToHex(c))
分别对应32位和16位加密方式
在C#中对应的实现为
/// <summary>
/// 16位MD5加密方法,以前的DVBBS所使用
/// </summary>
/// <param name="strSource">待加密字串</param>
/// <returns>加密后的字串</returns>
public string MD5Encrypt(string strSource)
{
return MD5Encrypt(strSource, 16);
}
/// <summary>
/// MD5加密,和动网上的16/32位MD5加密结果相同
/// </summary>
/// <param name="strSource">待加密字串</param>
/// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
/// <returns>加密后的字串</returns>
public string MD5Encrypt(string strSource, int length)
{
byte[] bytes = Encoding.ASCII.GetBytes(strSource);
byte[] hashValue = ((System.Security.Cryptography.HashAlgorithm)System.Security.Cryptography.CryptoConfig.CreateFromName("MD5")).ComputeHash(bytes);
StringBuilder sb = new StringBuilder();
switch (length)
{
case 16:
for (int i = 4; i < 12; i++)
sb.Append(hashValue[i].ToString("x2"));
break;
case 32:
for (int i = 0; i < 16; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
default:
for (int i = 0; i < hashValue.Length; i++)
{
sb.Append(hashValue[i].ToString("x2"));
}
break;
}
同样的其它语言都实现了DES加密与.netframework的des基础实现也不一样,比较郁闷的是我刚开始使用.net framework时还真的改写过perl版的des,后面才发现其实有更简单的办法,因为网上流传的perl/c/java版的des算法都是块加密的,设置CipherMode为ECB就好了,郁闷ing.
源代码如下
public static byte[] DESKey = new byte[] {0x82, 0xBC, 0xA1, 0x6A, 0xF5, 0x87, 0x3B, 0xE6, 0x59, 0x6A, 0x32, 0x64, 0x7F, 0x3A, 0x2A, 0xBB, 0x2B, 0x68, 0xE2, 0x5F, 0x06, 0xFB, 0xB8, 0x2D, 0x67, 0xB3, 0x55, 0x19, 0x4E, 0xB8, 0xBF, 0xDD };
/// <summary>
/// DES加密
/// </summary>
/// <param name="strSource">待加密字串</param>
/// <param name="key">32位Key值</param>
/// <returns>加密后的字符串</returns>
public string DESEncrypt(string strSource) {
return DESEncrypt(strSource, DESKey);
}
public string DESEncrypt(string strSource,byte[] key)
{
SymmetricAlgorithm sa = Rijndael.Create();
sa.Key = key;
sa.Mode= CipherMode.ECB;
sa.Padding = PaddingMode.Zeros;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(), CryptoStreamMode.Write);
byte[] byt = Encoding.Unicode.GetBytes(strSource);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="strSource">待解密的字串</param>
/// <param name="key">32位Key值</param>
/// <returns>解密后的字符串</returns>
public string DESDecrypt(string strSource) {
return DESDecrypt(strSource, DESKey);
}
public string DESDecrypt(string strSource,byte[] key)
{
SymmetricAlgorithm sa = Rijndael.Create();
sa.Key = key;
sa.Mode = CipherMode.ECB;
sa.Padding = PaddingMode.Zeros;
ICryptoTransform ct = sa.CreateDecryptor();
byte[] byt = Convert.FromBase64String(strSource);
MemoryStream ms = new MemoryStream(byt);
CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cs, Encoding.Unicode);
return sr.ReadToEnd();
}
世上MD5解密之最快方法整理
般来说,形如1e4dc79d489e86b2的16位或者32位密码就是经过MD5加密的,(当然也有特殊,比如DVBBS在登陆时候会先产生一个16位的随机密码,当然,这个密码还是和MD5密码的形式有点区别,相同的是都是16位的数字+字母组合 。);
这个一般来说可以用一个叫dv.exe的工具来破解。他可以破解加密前是10位以下的纯数字或者纯字母,破解纯数字的,速度超快,但是纯字母的,就慢了,当然他还有其他功能,但是其他功能没什么特别之处,所以不说。
破解纯数字时候:dv -p a.txt -b num
纯字母: dv -p a.txt -b char
[以上的两a.txt是保存要破解的密码存放的文件,存放格式是每行一组,例如:
1e4dc79d489e86b2 admin
1e4dc79d489e86b3 admin2
注意:在要破解的密码和后面的admin 用户名之间有一个空格。
当然还有很多字典破解 的工具,不建议使用。
还有就是有很多网站提供MD5密码查询,比如:
http://www.md5lookup.com/?category=01-3&searck=on
http://www.milw0rm.com/md5/info.php
http://gdataonline.com/seekhash.php
http://www.plain-text.info/search.php
http://passcracking.com/Good_values_list.asp
http://www.hashchecker.com/index.php?_sls=search_hash
http://uploadpage.net/ap/php/projects/rt/addhash.php
这16位MD5加密和32位MD5加密到底有什么区别?
我发现16位加密和32位加密的密文中的一段一模一样!
"123456" md516位和32位加密后
49ba59abbe56e057
e10adc39 49ba59abbe56e057 f20f883e
看中间
"123456789" md516位和32位加密后
323b453885f5181f
25f9e794 323b453885f5181f 1b624d0b
"abcdefg" md516位和32位加密后
148de9519b8bd264
7ac66c0f 148de9519b8bd264 312c4d64
-------------------------------------------------------------------------------------
那个所谓的16位加密,其实就是从32位里取出16位而已
首先按照补位再经过4轮对链接变量的循环操作算出32位(或更高位),然后按照"规定"从中间取出16位
----------------------------------------------------------------------------------------------
如果真是MD5的话,那出来的结果就是128位(BIT),
转为16进制的话,,那么就是32"位"----这里的位就是你们的位
MD5没有你们说的什么16"位"的,
除非是进行了进一步的处理,,但那样的话,也就不叫MD5了,那就是在MD5的基础上,它是进行了截取中间的16位,实际上,安全性降低了的,只是对于
网站那点少得可怜的资料,
是很难产生碰撞的,
并且用16位也便于存储,
比较吧,
我想这也是只用16位的最主要的原因
所以用16位肯定是降低了安全性,但不用怕。。。。。。。所以就用了
MD5如果要求不规范点的说法的话,可以是加密_____当然是不可逆的的变换
规范点的说法,应该叫散列才对,