欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.Net加密与解密——散列运算

程序员文章站 2022-03-23 20:34:38
  一,散列运算的特点   1,散列运算是不可逆的,可以将散列运算理解为单向的加密;   2,任何两个不相同的文件,哪怕只有一个字节的细微差...

 

一,散列运算的特点

 

1,散列运算是不可逆的,可以将散列运算理解为单向的加密

 

2,任何两个不相同的文件,哪怕只有一个字节的细微差别,得到的摘要都是完全不同的。这个特点的意义在于,可以用来判断消息是否被篡改,即解决完整性的问题。

 

3,无论原始消息的大小如何,运算得出的摘要的信息是固定长度,摘要的长度根据散列算法的不同而不同。

 

 

 

 

二,利用散列运算判断消息是否被篡改的流程

 

 

1,发送放对消息进行散列运算,得到消息摘要,发送消息和摘要,并说明获得摘要所使用的散列算法。

 

2,接收方获得消息和原始摘要,使用相同的散列算法对收到的消息进行散列运算,重新获得一个摘要。

 

3,对比原始摘要和本地摘要,如果两个相同,则认为消息没有被篡改,否则认为被篡改过了。

 

 

 

 

三,.Net中实现散列运算Demo

 

 

 

namespace 散列运算
{
    //普通散列运算类
    public class HashAlgorithmType {

        public const string SHA1 = "SHA1";
        public const string SHA256 = "SHA256";
        public const string SHA384 = "SHA384";
        public const string SHA512 = "SHA512";
        public const string MD5 = "MD5";
       
    
    }
    class Program
    {
        static void Main(string[] args)
        {
            string plainText = "hello,world";

            //初始化对象
            HashAlgorithm alg = HashAlgorithm.Create(HashAlgorithmType.SHA1); //SHA1Managed ALG = new SHA1Managed();
           

           // KeyedHashAlgorithm ALG = new HMACSHA1(Encoding.Default.GetBytes("secret key data"));//密钥散列运算,多一个密钥参数


            //将字符串转换为字节数组
            byte[] plainData = Encoding.Default.GetBytes(plainText);

            //获得摘要
            byte[] hashData = alg.ComputeHash(plainData);//此处参数为字节数组或者流

            //输出结果
            foreach (byte b in hashData)
            {
                Console.Write("{0:x2}", b);
            }

        }
    }


}

 

 

 

 

四,分析散列运算的安全隐患

 

如果在发送消息的过程中,信息被第三方截获,得到原始消息和消息摘要,此时,更改原始消息,并重新计算消息摘要并发送,接收方就不会发现消息是被篡改过的。并且,在发送消息的过程中,信息是未被加密的,第三方可以看到消息内容,不具备保密性。