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

  一,散列运算的特点

           

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);
            }

        }
    }

}

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

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

时间: 2024-12-08 17:35:59

.Net加密与解密——散列运算的相关文章

.Net加密与解密——非对称加密之数字签名

  一,从非对称加密的认证模式说起 由消息的发送方发布公钥,持有私钥.   步骤: 1,发送方公布自己的公钥,任何人都可以获得. 2,发送方使用自己的私钥对消息进行加密,然后发送. 3,接收方使用发送方的公钥对消息进行解密.     缺点: 1,任何截获该消息的第三方都能够使用发送方公钥进行解密: 2,耗时,不适用于大数据   二,数字签名       过程: 1,发送方对想要传递的消息进行散列运算,得到原始消息摘要.(摘要可以代表消息本身,相当于指纹) 2,发送方使用自己的私钥只对消息摘要进行

java加密算法--MD5加密和哈希散列带秘钥加密算法源码_java

java加密算法--MD5加密和哈希散列带秘钥加密算法源码              最近学习加密算法的知识,利用MD5 加密,百度一下网上资料很多,不是很详细,这里就整理下如何实现用MD5加密和 哈希散列带秘钥加密算法,大家可以看下. 实现代码: package com.ompa.common.utils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java

authcode函数使用异或运算进行加密和解密

康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献.包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密. 原理如下,假如: 加密 明文:1010 1001 密匙:1110 0011 密文:0100 1010 得出密文0100 1010,解密之需和密匙异或下就可以了 解密 密文:0100 1010 密匙:1110 0011 明文:1010 1001 并没有什么高深的算法,密匙重要性很高,所以,关键在于怎么生成密匙.

Android数据加密之SHA安全散列算法_Android

前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好奇心,所以趁着晚上没啥事,来学习一下. 其他几种加密方式:  •Android数据加密之Rsa加密  •Android数据加密之Aes加密  •Android数据加密之Des加密  •Android数据加密之MD5加密  •Android数据加密之Base64编码算法 SHA加密算法      SH

Android数据加密之SHA安全散列算法

前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好奇心,所以趁着晚上没啥事,来学习一下. 其他几种加密方式: •Android数据加密之Rsa加密  •Android数据加密之Aes加密  •Android数据加密之Des加密  •Android数据加密之MD5加密  •Android数据加密之Base64编码算法 SHA加密算法 SHA(Secu

关于MD5加密与解密

问题描述 在ASP.NET项目如何将已经加密过的密码解密并且实现用户登陆 解决方案 解决方案二:不用解密.把用户输入的密码加密转换后,同数据库里保存的密码(同一用户名)比较就可以了.解决方案三:直接修改你的登录程序的逻辑,不判断密码直接统统判断验证成功就是了.解决方案四:md5是种单向的加密算法,一旦加密就没有办法解密.只能把用户输入的密码再次加密,看一下密文是不是一样的.解决方案五:为何要解密?正确做法是将用户的输入加密后和去数据库匹配.md5加密的结果解密那是科学家的事.解决方案六:网数据库

Google发布CityHash系列散列算法

Google发布了 CityHash系列字符串散列算法.今天发布的有两种算法:CityHash64 与 CityHash128.它们分别根据字串计算64和128位的散列值.这些算法不适用于加密,但适合用在散列表等处. Google一直在根据其数据中心常用的CPU对算法进行优化,结果发现对大多数个人计算机与笔记本同样有效益.尤其是在64位寄存器.指令集级的并行,以及快速非对其内存存取方面. 该算法的开发受到了前人在散列算法方面的巨大启发,尤其是Austin Appleby的MurmurHash.但

xml的加密和解密

xml|加密|解密 xml加密(XML Encryption)是w3c加密xml的标准.这个加密过程包括加密xml文档的元素及其子元素,通过加密,xml的初始内容将被替换,但其xml格式仍然被完好的保留. 介绍我们有3个加密xml的方法 1.仅仅使用对称加密的方法加密xml这种加密方法只使用一个密钥,也就是说无论是加密xml还是解密xml都使用一个相同的密钥.因为这个密钥不会在被加密的xml中保存,所以我们需要在加密和解密的过程中加载这个密钥并保护它不被窃取. 2.使用对称加密和非对称加密相结合

php使用异或(XOR)加密和解密文件

php 使用异或(XOR)加密/解密文件 原理:将文件每一个字节与key作位异或运算(XOR),解密则再执行一次异或运算. 代码如下: 01.<?php 02.03.$source = 'test.jpg';04.$encrypt_file = 'test_enc.jpg';05.$decrypt_file = 'test_dec.jpg';06.$key = 'D89475D32EA8BBE933DBD299599EEA3E';07.08.echo '<p>source:</p&