c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下

对称加密

通过同一密匙进行加密和解密。往往应用在内部数据传输情况下。比如公司a程序 和B程序 。a程序要给B程序发送数据 但是为了防止明文发送 数据被窃取。那么我就定了一个协议传输的数据的byte字节都统一+1  而接收数据的情况下将Byte字节统一-1 然后就能获得正确的 数据(当然这个是一个简单的加密) ,真正应用的加密肯定比这个复杂很多

非对称加密

传输数据的双方有各自的公钥和私钥  公钥对外公开 私钥自己保留,当像B用户发送数据 使用B用户的公钥进行加密 加密的数据只有B用户的私钥可以解密 那么如果在传输过程中 如果消息被截取 那么也破解不了

比如支付操作 a用户输入银行卡 卡号和密码 进行支付 那么在传输过程中 如果别抓包截取数据。是很危险的 。那么统一在客户端将参数信息 通过服务器提供的公钥进行加密。如果在传输过程中被截取

我们都知道https请求在传输过程中数据是安全的

https请求客户端需要安装证书 证书就类似公钥和私钥 客户端发起请求获得服务器的公钥 并将自己的公钥发送给服务器。  在传输过程中都使用双方的公钥进行加密传输 保证了数据的安全性

https请求与普通请求的区别是 https是长连接 同时增加了 双方公钥交换的握手

列子

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;

namespace SecureTranferTest
{
    class Program
    {
        /// <summary>
        /// 安妮的私匙
        /// </summary>
        public static System.Security.Cryptography.CngKey anlikey = null;

        //安妮的公钥
        public static byte[] anlipulicKey = null;
        //鲍勃的私匙
        public static System.Security.Cryptography.CngKey bobkey = null;
        public static byte[] bobpulicKey = null;

        static void Main(string[] args)
        {
            CreateKey();
            AnliSendMessage("今天天气很好");//安妮开始向bob发送消息
            AnliSendMessage("啦啦啦");//安妮开始向bob发送消息
            Console.ReadKey();
        }

        public static void CreateKey()
        {

            //以ECDsaP256创建私钥
            anlikey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);
            //根据私钥生成公钥
            anlipulicKey = anlikey.Export(CngKeyBlobFormat.EccPublicBlob);
            //以ECDsaP256创建私钥
            bobkey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256);
            //根据公钥获得私钥
            bobpulicKey = bobkey.Export(CngKeyBlobFormat.EccPublicBlob);

        }

        public  static void AnliSendMessage(string message)
        {
            byte[] rowData = Encoding.UTF8.GetBytes(message); //将发送消息转换成二进制格式
            //同annli的私匙生成一个新的随机的密钥对
            using (ECDiffieHellmanCng cng = new ECDiffieHellmanCng(anlikey))
            {
                //通过bob的公钥byte[]获得一个cngKey密钥对象
                using (CngKey bobkey = CngKey.Import(bobpulicKey, CngKeyBlobFormat.EccPublicBlob))
                {
                    //通过anli的密钥对与bob的公钥生成一个对称密钥
                    var sumKey = cng.DeriveKeyMaterial(bobkey);
                    //创建一个对称加密和解密的(AEC)高级算法实现
                    using (var aes = new AesCryptoServiceProvider())
                    {
                        aes.Key = sumKey; //设置对称加密密钥
                        aes.GenerateIV();
                        //生成对称加sh密对象
                        using (ICryptoTransform encryptor = aes.CreateEncryptor())
                        {
                            using (MemoryStream ms = new MemoryStream())
                            {
                                //定义一个加密转换流
                                var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);
                                //写入加密初始化向量(IV)
                                ms.Write(aes.IV, , aes.IV.Length);
                                //写如传递数据
                                cs.Write(rowData,, rowData.Length);
                                cs.Close();//使用完后必须关闭 否则会丢失数据
                               var data= ms.ToArray();
                                //安妮向鲍勃发送加密数据消息 加密数据的二进制数据()
                                Console.WriteLine("安妮向鲍勃发送加密数据消息 加密数据的二进制数据");
                                BobReceivesData(data);
                            }
                            aes.Clear();
                        }
                    }
                }
            }
        }

        //Bob接收信息
        public static void BobReceivesData(byte[] data)
        {
            Console.WriteLine("鲍勃接收到 并开始解密");
            byte[] rowData = null;
            //首先读取未加密的初始化向量(IV) 在data里面
            //1.通过对称加密高级算法实现AesCryptoServiceProvider 获得IV的长度
            using (var aes = new AesCryptoServiceProvider())
            {
                ;//他的操作块二进制长度转换成byte存储的十进制长度
                byte[] ivdata = new byte[ivlength];
                Array.Copy(data, ivdata, ivlength);
                //同bob的私匙生成一个新的随机的密钥对
                using (ECDiffieHellmanCng cng = new ECDiffieHellmanCng(bobkey))
                {
                    //通过anni的公钥byte[]获得一个cngKey密钥对象
                    using (CngKey anikey = CngKey.Import(anlipulicKey, CngKeyBlobFormat.EccPublicBlob))
                    {
                        //通过anli的密钥对与bob的公钥生成一个对称密钥
                        var sumKey = cng.DeriveKeyMaterial(anikey);
                        aes.Key = sumKey; //设置对称加密密钥
                        aes.IV = ivdata;
                        using (ICryptoTransform decryptor = aes.CreateDecryptor())
                        using (MemoryStream me = new MemoryStream())
                        {
                           //定义一个加密转换流
                            var cs = new CryptoStream(me, decryptor, CryptoStreamMode.Write);
                            cs.Write(data, ivlength, data.Length - ivlength);//将加密信息进行解密
                            cs.Close();//一定要关闭 否则将丢失最后一位数据
                            rowData = me.ToArray();
                            Console.WriteLine("解密成功 信息为:");
                            Console.WriteLine(Encoding.UTF8.GetString(rowData));
                        }
                    }
                }
            }

        }

    }
}

散列算法

同样的字符串 通过散列算法 算出唯一的散列值。 比如md5加密

应用场景 接口防止参数被篡改 参数用md5加密将md5散列算出的字符串提交到服务器 如果服务器也通过散列参数的字符串跟提交的一样 那么代表没有呗篡改

个人理解c#对称加密 非对称加密 散列算法的应用场景的更多相关文章

  1. 【Java-加密算法】对称加密、非对称加密、单向散列(转)

    一提到加密,就会联想到数字签名,这两个经常被混淆的概念到底是什么呢? 加密:加密是一种以密码方式发送信息的方法.只有拥有正确密钥的人才能解开这个信息的密码.对于其他人来说,这个信息看起来就像是一系列随 ...

  2. HTTPS加密那点事-对称、非对称加密、数字证书

    转自:[漫画]https 加密那点事 首先,HTTP协议的缺点:没有对数据进行加密,都是明文传输的.如果要改进这种明文传输的协议,该如何做呢? 对称加密: 在每次发送真实数据之前,服务器先生成一把密钥 ...

  3. [svc]对称加密/非对称加密细枝末节-如何做到数据传输的authentication/data integrity/confidentiality(私密)

    对称/非对称/混合加密的冷知识 数据在互联网上传输,要考虑安全性. 讲到安全,要从三方面考虑: 1.authentication 每一个IP包的认证,确保合法源的数据 2.data integrity ...

  4. 第十四章 调试及安全性(In .net4.5) 之 对称及非对称加密

    1. 概述 本章内容包括:对称及非对称加密算法..net中的加密类.使用哈希操作.创建和管理签名认证.代码访问权限 和 加密字符串. 2. 主要内容 2.1 使用对称和非对称加密 ① 对称加密:使用同 ...

  5. Java进阶(八)Java加密技术之对称加密 非对称加密 不可逆加密算法

    对称加密 非对称加密 不可逆加密算法 根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系). 1 对称加密算法 原理 对称加密算法中,数据加密和解密 ...

  6. C#.NET中对称和非对称加密、解密方法汇总--亲测可用

    C#.NET中对称和非对称加密.解密方法汇总--亲测可用   在安全性要求比较高的系统中都会涉及到数据的加密.解密..NET为我们封装了常用的加密算法,例如:MD5,DES,RSA等.有可逆加密,也有 ...

  7. DotNet加密方式解析--散列加密

    没时间扯淡类,赶紧上车吧. 在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念, ...

  8. .NET加密方式解析--散列加密

    在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念,在这里就不说了. 这一次将会 ...

  9. PKI和加密,散列算法

    Day 11-PKI和加密,散列算法 PKI(Public Key Infrastructure公钥基础设施) 1 PKI(Public Key Infrastructure公钥基础设施)回顾学习 - ...

随机推荐

  1. ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...

  2. 物联网框架ServerSuperIO(SSIO)更新、以及增加宿主程序和配置工具,详细介绍

    一.更新内容 1.修改*Server类,以及承继关系.2.增加IRunDevice的IServerProvider接口继承.3.修复增加COM设备驱动可能造成的异常.4.修复网络发送数据可能引发的异常 ...

  3. Node.js之sails框架

    先开一坑,有空更新,记录最近钉钉项目上对node及sails框架的学习记录和理解

  4. css基础

    一. web标准化 (1).内容与样式,行为分离 (2).html用来定义语义内容,以及内容的结构 (xhtml) (3).xhtml标准 a.xhtml 必须强制指定文档类型 DocType,HTM ...

  5. ABAP游标的使用

    在Oracle,SQLServer中游标的使用是经常的,所以在ABAP不懂是不行的......     1.声明游标 OPEN CURSOR [WITH HOLD] <c> FOR SEL ...

  6. Github装(zao)逼(jia)指(da)南(fa)

    Github之于工程师,类似于微博相册之于嫩模,像是个门面. 无论是晋升答辩,还是求职面试,有一个丰富的代码仓库不敢说好处有多大,但总归是有的.并且好处不局限于此,代码开源才会暴露问题才会改正,并且会 ...

  7. ZooKeeper:Java客户端网络处理

    了解ZooKeeper客户端的实现,对于使用ZooKeeper的客户端非常重要. 通过对客户端源码的阅读,了解了如下信息: 创建ZooKeeper对象时,应会创建一个ClientCnxn(代表了客户端 ...

  8. javaweb项目jsp跳转servlet Error instantiating servlet class 问题

    问题: HTTP Status 500 - Error instantiating servlet class RecommenderServlet type Exception report mes ...

  9. JAVA NIO Channel

    Basic:   多数通道都是链接到开发的文件描述符的.Channel类提供维持平台独立性的抽象过程.   通道是一种途径,访问和操作操作系统,缓冲区是数据操作点: Channel类继承结构图: 通过 ...

  10. 不同数据库,查询前n条数据的SQL语句

    不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...