Hash,一般翻译为散列,但多数是音译过来的:哈希(例如常用的哈希表Hashtable.net))。它把预映射(pre-image)通过散列算法(哈希算法),变换成固定长度的输出,这个输出就叫散列值也就是哈希值。它就是一种将任意长度的消息压缩到某一固定长度的消息(消息摘要)的方法。

 

(一)SHA加密

SHA,就是安全散列算法,Secure Hash Algorithm。它能计算出一个数据消息所对应的固定长度的字串。SHA家族有5个算法,SHA-1SHA-224,SHA-256,SHA-384,SHA-512。其中后4者总称SHA2

SHA1

SHA12005年被咱们国家的王小红等人破译。在263次方计算复杂度内找到碰撞。

 

System.Security.Cryptography下的SHA1类提供了对SHA1的加密算法:

 

ComputeHash(array<Byte>[]()[])  计算指定字节数组的哈希值。

ComputeHash(Stream)  计算指定 Stream 对象的哈希值。

ComputeHash(array<Byte>[]()[], Int32, Int32)  计算指定字节数组的指定区域的哈希值。

 

例如第一个:

public byte[] ComputeHash(byte[] buffer)

 

public void TestSha1()
{

    
string strContent = "123456";
    Encoding _encoding 
= Encoding.Default;
    
byte[] bb=_encoding.GetBytes(strContent);    

    
byte[] result; 

    SHA1 sha 
= new SHA1CryptoServiceProvider();
    result 
= sha.ComputeHash(bb);
    
string strResult=BitConverter.ToString(result);

    Console.WriteLine(strResult);
}

 

它的值为:7C4A8D09CA3762AF61E59520943DC26494F8941B

 

SHA1类是个抽象类,看它的派生关系:

System.Security.Cryptography.HA1

System.Security.Cryptography.SHA1CryptoServiceProvider

System.Security.Cryptography.SHA1Managed

System.Security.Cryptography.SHA1Cng

 

1SHA1CryptoServiceProvider

使用加密服务提供程序 (CSP) 提供的实现计算输入数据的 SHA1 哈希值

2SHA1Managed

使用托管库计算输入数据的 SHA1 哈希值

3SHA1Cng

提供安全哈希算法 (SHA) 的下一代加密技术 (CNG) 实现。

 

SHA2

SHA-224,SHA-256,SHA-384,SHA-512

同样在这个名字空间,提供了对应的类。以sha384为例子:

它的派生关系为:

System.Security.Cryptography.SHA384

System.Security.Cryptography.SHA384Managed

System.Security.Cryptography.SHA384Cng

System.Security.Cryptography.SHA384CryptoServiceProvider

 

以第一个为例:

public void TestSha384()
{
    
string strContent = "123456";
    Encoding _encoding 
= Encoding.Default;
    
byte[] bb = _encoding.GetBytes(strContent); 

    
byte[] result;
    SHA384 sha 
= new SHA384Managed();
    result 
= sha.ComputeHash(bb);
    
string strResult = BitConverter.ToString(result);

    Console.WriteLine(strResult);
}

 

0A989EBC4A77B56A6E2BB7B19D995D185CE44090C13E

2984B7ECC6D446D4B61EA9991B76A4C2F04B1B4D244841449454

 

(二)MD5

MD5就是消息摘要算法第5版,Message Digest Algorithm。它主要用于提供消息的完整性保护。例如电驴下载的文件的md5验证。MD5也是可以破解的,但这种影响很少。也是王小云等破解的)。

 

.net中,md5类也在这个名字空间内:

System.Security.Cryptography.MD5

    System.Security.Cryptography.MD5CryptoServiceProvider

    System.Security.Cryptography.MD5Cng

 

public void TestMD5()
{
    
string strContent = "123456";
    Encoding _encoding 
= Encoding.Default;
    
byte[] bb = _encoding.GetBytes(strContent); 

    
byte[] result; 

    MD5 md 
= new MD5CryptoServiceProvider();
    result 
= md.ComputeHash(bb);
    
string strResult = BitConverter.ToString(result);
    Console.WriteLine(strResult);
}

 

E10ADC3949BA59ABBE56E057F20F883E

 

(三)HMAC

HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。输出的哈希值长度为 160 位(这里说明一下:160位就是20个字节。对于sha1来说是160位的,也就是20个字节,但打印的是40个字符,这里的40个是16进制数,2个为一字节即20个字节。)

计算hmac,先要一个hash值,然后一个密钥key

其中hash值的字符串长用L表示,数据块长度用B表示。密钥key长度小于等于B,如果长度大于数据块长度,则通过hash函数对key进行散列转换,结果就是一个L长的key

然后创建2B长的不同字串:

str1=长度为B0xa0

str2=长度为B0xb1

 

然后字串strhmac就是

hash(key^str2,hash(key^str1,str)

 

System.Security.Cryptography.HMAC

    System.Security.Cryptography.HMACMD5

    System.Security.Cryptography.HMACRIPEMD160

    System.Security.Cryptography.HMACSHA1

    System.Security.Cryptography.HMACSHA256

    System.Security.Cryptography.HMACSHA384

    System.Security.Cryptography.HMACSHA512

 

(四)MACTripleDES

使用 TripleDES 计算输入数据 CryptoStream 的消息验证代码 (MAC)

在发送方和接收方共享密钥的前提下,MAC 可用于确定通过不安全信道发送的消息是否已被篡改。发送方计算原始数据的 MAC,然后将 MAC 和原始数据作为单个消息发送。接收方重新计算接收到的消息的 MAC,检查计算所得的 MAC 是否与传送的 MAC 匹配。MACTripleDES 使用长度为 16 24 字节的密钥,并产生长度为 8 字节的哈希序列。 

public void TestMactripledes()
{
    
//key
    Encoding _encoding = Encoding.ASCII;
    
string strKey = "selfkey001000000";
    
byte[] key = _encoding.GetBytes(strKey);
 

    
string strContent = "message content";
    
byte[] data = _encoding.GetBytes(strContent); 

    MACTripleDES mac3des 
= new MACTripleDES(key);
    
byte[] result = mac3des.ComputeHash(data);
    Console.WriteLine(BitConverter.ToString(result));
}

 

posted on 2010-04-07 11:20  梅桦  阅读(6255)  评论(0编辑  收藏  举报