以前在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>
/// <s>加密后字串</s>
public MD5Encrypt( strSource)
{
MD5Encrypt(strSource, 16);
}
/// <summary>
/// MD5加密,和动网上16/32位MD5加密结果相同
/// </summary>
/// <param name="strSource">待加密字串</param>
/// <param name="length">16或32值的,其它则采用.net默认MD5加密算法</param>
/// <s>加密后字串</s>
public MD5Encrypt( strSource, length)
{
s = Encoding.ASCII.GetBytes(strSource);
hashValue = ((.Security.Cryptography.HashAlgorithm).Security.Cryptography.CryptoConfig.CreateFromName("MD5")).ComputeHash(s);
StringBuilder sb = StringBuilder;
switch (length)
{
16:
for ( i = 4; i < 12; i)
sb.Append(hashValue[i].("x2"));
;
32:
for ( i = 0; i < 16; i)
{
sb.Append(hashValue[i].("x2"));
}
;
default:
for ( i = 0; i < hashValue.Length; i)
{
sb.Append(hashValue[i].("x2"));
}
;
}
同样其它语言都实现了DES加密和.netframeworkdes基础实现也不样比较郁闷是我刚开始使用.net framework时还真改写过perl版des,后面才发现其实有更简单办法网上流传perl/c/java版des算法都是块加密设置CipherMode为ECB就好了郁闷ing.
源代码如下
public DESKey = {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>
/// <s>加密后串</s>
public DESEncrypt( strSource) {
DESEncrypt(strSource, DESKey);
}
public DESEncrypt( strSource, key)
{
SymmetricAlgorithm sa = Rijndael.Create;
sa.Key = key;
sa.Mode= CipherMode.ECB;
sa.Padding = PaddingMode.Zeros;
MemoryStream ms = MemoryStream;
CryptoStream cs = CryptoStream(ms, sa.CreateEncryptor, CryptoStreamMode.Write);
byt = Encoding.Unicode.GetBytes(strSource);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock;
cs.Close;
Convert.ToBase64String(ms.ToArray);
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="strSource">待解密字串</param>
/// <param name="key">32位Key值</param>
/// <s>解密后串</s>
public DESDecrypt( strSource) {
DESDecrypt(strSource, DESKey);
}
public DESDecrypt( strSource, key)
{
SymmetricAlgorithm sa = Rijndael.Create;
sa.Key = key;
sa.Mode = CipherMode.ECB;
sa.Padding = PaddingMode.Zeros;
ICryptoTransform ct = sa.CreateDecryptor;
byt = Convert.FromBase64String(strSource);
MemoryStream ms = MemoryStream(byt);
CryptoStream cs = CryptoStream(ms, ct, CryptoStreamMode.Read);
StreamReader sr = StreamReader(cs, Encoding.Unicode);
sr.ReadToEnd;
}
最新评论