zoukankan      html  css  js  c++  java
  • 【安全加密技术】非对称加密

       转载请注明出处:http://blog.csdn.net/sk719887916/article/details/46810595


        看过上篇网络互联基系列基础的朋友,对安全产生的原因以及策略度有所了解。当然作为开发人员来讲,网络传输中的安全问题我们不必过多的关心。我们关心的是发送方加密和接收方对数据的解密过程。也就是网络安全中的一面边缘学科,password学中的一种数据加密技术。眼下业界的加密方式主要有对称加密和非堆成加密,那就先来了解下有非对称加密以及所关联的相关名字。

    非对称加密

     非对称加密算法是一种密钥的加密方法。
            非对称加密算法须要两个密钥:公钥(publickey)和私钥(privatekey)。

    公钥与私钥是一对存在。假设用公钥对数据进行加密。仅仅实用相应的私钥才干解密;假设用密钥对数据进行加密,那么仅仅实用相应的公钥才干解密。

    由于加密和解密使用的是两个不同的密钥,所以这样的算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将当中的一把作为公用密钥向其他方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的还有一把专用密钥对加密后的信息进行解密。


    还有一方面。甲方能够使用乙方的公钥对机密信息进行签名后再发送给乙方。乙方再用自己的私匙对数据进行验签。


    甲方仅仅能用其专用密钥解密由其公用密钥加密后的不论什么信息。 非对称加密算法的保密性比較好。它消除了终于用户交换密钥的须要。
    非对称password体制的特点:算法强度复杂、安全性依赖于算法与密钥可是因为其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称password体制中仅仅有一种密钥。而且是非公开的,假设要解密就得让对方知道密钥。

    所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,当中一个是公开的,这样就能够不须要像对称password那样传输对方的密钥了。

    这样安全性就大了非常多。

       列如 :支付宝的加密方式就採用非对称加密方式。支付宝会给客户提供支付宝证书。作为用户验证是否是来自支付宝的数据,防止第三方假冒支付宝。而客户手中持有私钥,用户支付宝发送的数据经过支付宝的公钥进项加密,则支付宝能够採用自己的的私钥进行解密。

       工作过程

    1.A要向B发送信息。A和B都要产生一对用于加密

    2.A的私钥保密,A的公钥告诉B。B的私钥保密。B的公钥告诉A。

    3.A要给B发送信息时。A用B的公钥加密信息,由于A知道B的公钥。

    4.A将这个数据发给B(已经用B的公钥加密消息)。

    5.B收到这个数据后后,B用自己的私钥解密A的消息。

    其它全部收到这个报文的人都无法解密,由于仅仅有B才有B的私钥。

    通俗点能够这么理解:

    浏览器向server发出请求。询问对方支持的对称加密算法和非对称加密算法。server回应自己支持的算法。

    浏览器选择两方都支持的加密算法,并请求server出示自己的证书;server回应自己的证书。 

    浏览器随机产生一个用于本次会话的对称加密的钥匙,并使用server证书中附带的公钥对该钥匙进行加密后传递给server;server为本次会话保持

    该对称加密的钥匙。第三方不知道server的私钥。即使截获了数据也无法解密。非对称加密让不论什么浏览器都能够与server进行加密会话。



    浏览器使用对称加密的钥匙对请求消息加密后传送给server,server使用该对称加密的钥匙进行解密。server使用对称加密的钥匙对响应消息加密后传送给浏览器,浏览器使用该对称加密的钥匙进行解密。第三方不知道对称加密的钥匙。即使截获了数据也无法解密。对称加密提高了加密速度 

          非对称加密(公钥加密):指加密和解密使用不同密钥的加密算法。也称为公私钥加密。如果两个用户要加密交换数据,两方交换公钥,使用时一方用对方的公钥加密,还有一方就可以用自己的私钥解密。如果企业中有n个用户,企业须要生成n对密钥。并分发n个公钥。因为公钥是能够公开的。用户仅仅要保管好自己的私钥就可以,因此加密密钥的分发将变得 十分简单。

    同一时候,因为每一个用户的私钥是唯一的。其它用户除了能够通过信息发送者的公钥来验证信息的来源是否真实。还能够确保发送者无法否认曾发送过该信息。非对称加密的缺点是加解密速度要远远慢于对称加密。在某些极端情况下。甚至能比对称加密慢上1000倍。

    DSACryptoServiceProvider
        RSACryptoServiceProvider
    //加密
    UnicodeEncoding encoding = new UnicodeEncoding();
    byte[] PasswordBytes = encoding.GetBytes(password);//将password转换为字节数组
    RSACryptoServiceProvider crypt=new RSACryptoServiceProvider();//RSA加密算法
    PasswordBytes=crypt.Encrypt(password ,false);//加密字节数组。这是加密后的password值。放入数据库中的表字段中。
    string key=crypt.ToXmlString(true);//输出密钥为XML格式的字符串。且包括私钥。这个字符串要作为数据库表中的一个字段同用户的password放在一起
    //解密
    RSACryptoServiceProvider crypt=new RSACryptoServiceProvider();//已随机生成了一个密钥对
    crypt.Clear();//毁掉当前密钥对
    crypt.FromXmlString(key)//输入密钥对。key是从数据库表字段中读取的那个XML格式的字符串,即密钥字段
    PasswordBytes=crypt.Decrypt(password ,false);//解密字节数组,返回原始password给用户

    上面方法的一个特点是每一个用户相应一个密钥(包括公钥和私钥),它们都是随机生成的,所以各不同样。只是缺点也是非常明显的,就是密钥存储在数据库中,假设数据库被攻破密钥就泄漏了。

    还有另外一个方法就是按照上面方法随机生成一个密钥对(包括公钥和私钥),通过ToXmlString(true)方法导出。然后把这个XML字符串格式的密钥放到你的Web程序的Web.config文件的AppSetting节点里面,然后通过FromXmlString(key)方法读入密钥。这样就意味着全部的用户password都用同一个密钥对加密和解密。

    非对称的优点显而易见,非对称加密体系不要求通信两方事先传递密钥或有不论什么约定就能完毕保密通信,而且密钥管理方便。可实现防止假冒和抵赖,因此,更适合网络通信中的保密通信要求。

    数字证书

    数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式。数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名)。它是由权威机构——CA机构,又称为证书授权(Certificate Authority)中心发行的。人们能够在网上用它来识别对方的身份。

    数字证书绑定了公钥及其持有者的真实身份,它类似于现实生活中的居民身份证,所不同的是数字证书不再是纸质的证照,而是一段含有证书持有者身份信息并经过认证中心审核签发的电子数据。广泛用在电子商务和移动互联网中。。
    通俗讲就是车管所会给每一个车辆进行认证颁发车牌,通过车牌我们能够查到全部车辆和驾驶员的信,二数字证书就辨别唯一身份,支付宝等的数字证书就是公开的。这不是支付宝自己决定,而是由国际组织认证,这样无论是哪个用户首先就能够依据浏览器返回的证书辨别支付宝的真伪。

    数字签名

    数字签名用来,保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。
            数字签名是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。

    接收者仅仅实用发送者的公钥才干解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对照。假设同样,则说明收到的信息是完整的,在传输过程中没有被改动。否则说明信息被改动过,因此数字签名可以验证信息的完整性。

    假设中途数据被纂改或者丢失。

    那么对方就行依据数字签名来辨别是否是来自对方的第一手信息数据。
       数字签名是个加密的过程,数字签名验证是个解密的过程。


    加密算法


           DES(Data Encryption Standard):对称算法。数据加密标准,速度较快,适用于加密大量数据的场合。

           3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高;

           RC2和RC4:对称算法。用变长密钥对大量数据进行加密,比 DES 快;

           IDEA(International Data Encryption Algorithm)国际数据加密算法。使用 128 位密钥提供很强的安全性;

           RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,须要加密的文件块的长度也是可变的,非对称算法。 算法例如以下:
           首先, 找出三个数, p, q, r,当中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数......p, q, r 这三个数便是 private key
           接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1).....这个 m 一定存在, 由于 r 与 (p-1)(q-1) 互质, 用辗转相除法就能够得到了.....
      再来, 计算 n = pq.......
      m, n 这两个数便是 public key
          DSA(Digital Signature Algorithm):数字签名算法。是一种标准的 DSS(数字签名标准)。严格来说不算加密算法;
          AES(Advanced Encryption Standard):高级加密标准。对称算法。是下一代的加密算法标准,速度快,安全级别高。在21世纪AES 标准的一个实现是 Rijndael 算法。

          BLOWFISH,它使用变长的密钥,长度可达448位。执行速度非常快;

          MD5:严格来说不算加密算法,仅仅能说是摘要算法;
          对MD5算法简要的叙述能够为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组。经过了一系列的处理后。算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。在MD5算法中。首先须要对信息进行填充,使其字节长度对512求余的结果等于448。

    因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes)。N为一个正整数。

    填充的方法例如以下。在信息的后面填充一个1和无数个0。直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。

    经过这两步的处理,现在信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
        PKCS:The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥password学标准,当中包含证书申请、证书更新、证书作废表公布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
    SSF33,SSF28。SCB2(SM1):国家password局的隐蔽不公开的商用算法,在国内民用和商用的。除这些都不容许使用外,其它的都能够使用;

    还包含Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
           用的最多的是RSA算法。Elgamal是还有一种经常使用的非对称加密算法。


           Elgamal其基础是DiffieˉHellman密钥交换算法,后者使通信两方能通过公开通信来推导出仅仅有他们知道的秘密密钥值[DiffieˉHellman]。DiffieˉHellman是Whitfield Diffie和Martin Hellman于1976年发明的,被视为第一种 非对称加密算法,DiffieˉHellman 与RSA的不同之处在于。DiffieˉHellman不是加密算法。它仅仅是生成可用作对称密钥的秘密数值。在DiffieˉHellman密钥交换过程中,发送方和接收方分别生成一个秘密的随机数。并依据随机数推导出公开值,然后,两方再交换公开值。DiffieˉHellman算法的基础是具备生成共享密钥的能力。仅仅要交换了公开值,两方就能使用自己的私有数和对方的公开值来生成对称密钥,称为共享密钥,对两方来说,该对称密钥是同样的。能够用于使用对称加密算法加密数据。
    与RSA相比。DiffieˉHellman的优势之中的一个是每次交换密钥时都使用一组新值,而使用RSA算法时,假设攻击者获得了私钥,那么他不仅能解密之前截获的消息,还能解密之后的全部消息。然而。RSA能够通过认证(如使用X.509数字证书)来防止中间人攻击,但Diff ieˉHellman在应对中间人攻击时很脆弱。


    完整的非对称加密过程

    假如如今 你向支付宝 转账(术语数据信息)。为了保证信息传送的保密性、真实性、完整性和不可否认性,须要对传送的信息进行数字加密和签名。其传送过程为:
    1.首先你要确认是否是支付宝的数字证书。假设确觉得支付宝身份后。则对方真实可信。能够向对方传送信息。
    2.你准备好要传送的数字信息(明文)计算要转的多少钱,对方支付宝账号等;
    3.你 对数字信息进行哈希运算,得到一个信息摘要(client主要职责)。
    4.你 用自己的私钥对信息摘要进行加密得到 你 的数字签名。并将其附在数字信息上;
    5.你 随机产生一个加密密钥,并用此password对要发送的信息进行加密(密文);
    6.你用 支付宝的公钥对刚才随机产生的加密密钥进行加密,将加密后的 DES 密钥连同密文一起传送给支付宝。
    7.支付宝收到 你 传送来的密文和加密过的 DES 密钥,先用自己的私钥对加密的 DES 密钥进行解密。得到 你随机产生的加密密钥。
    8.支付宝 然后用随机密钥对收到的密文进行解密,得到明文的数字信息,然后将随机密钥抛弃;
    9.支付宝 用你 的公钥对 你的的数字签名进行解密,得到信息摘要;
    10.支付宝用同样的哈希算法对收到的明文再进行一次哈希运算,得到一个新的信息摘要;
    11.支付宝将收到的信息摘要和新产生的信息摘要进行比較,假设一致。说明收到的信息没有被改动过。
    12 确定收到信息,然后进行向对方进行付款交易,一次非对称密过程结束。

    在这后面的流程就不属于本次非对称加密的范畴。算支付宝个人的自我流程,也就是循环以上过程。

    今天给带来的程序数据加密技术中的非对称加密,下篇继续对称加密技术。谢谢阅读。



  • 相关阅读:
    镜像切换Logreader Agent报错:分发数据库中可能存在不一致的状态(续)
    镜像切换Logreader Agent报错:分发数据库中可能存在不一致的状态
    SQL优化案例—— RowNumber分页
    SQL Server 服务器磁盘测试之SQLIO篇(二)
    SQL Server 服务器磁盘测试之SQLIO篇(一)
    SQL Server内存遭遇操作系统进程压榨案例
    git添加ssh公钥报错
    leetcode_1187. Make Array Strictly Increasing 使数组严格递增_[DP]
    leetcode_1293. Shortest Path in a Grid with Obstacles Elimination_[dp动态规划]
    leetcode_1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold_[二维前缀和]
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6693245.html
Copyright © 2011-2022 走看看