欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 18_01 _加密类型及其相关算法 有大用

TCP/IP:    安全

    A-->> B

        机密性:  明文传输( ftp, http, smtp, telnet )

        完整性:  10    (100)    (数据要保证发送的和收到的是一致的)

        身份验证: (能够保证对方就是他所声称的那个人)


机密性:    plaintext(明文) --> 加密 (转换规则) (转换算法) --> ciphertext (ciphercode)(cipher 密码)(密文)

               ciphertext --> 解密 (转换规则) (转换算法) --> plaintext


    转换算法: 保证数据机密性的最核心的不是算法本身,而是密钥

        (你拿到了ciphertext即使你知道了转换规则,但是没有密钥,还是无法转换成明文)

    转换算法本身是复杂的数学原理实现的,一般来讲,设计密码加密的都是数学家,设计一个算法要好长时间,需要考虑诸多因素,需要经过多方的测试,还要考虑20-50年能不能被破解的可能性,还要考虑到计算机的发展速度(考虑20-50年能不能被破解的可能性)

我们把我们的安全性不完全依赖于算法,而是依赖于密钥来实现,因为换一个密钥,比换一个算法,要简单的太多太多


    abc --> cde  (加密的时候向前两位,解密的时候反向推两位)


    对称加密:  算法+密钥 加密传过去 解密的时候密钥是相同的,算法不一定(一般是不可能的?这句话不太懂?)

                    密钥是相同的,这种加解密方法,叫做对称加密

                    好处:算法计算速度非常快,但是其安全性几乎完全依赖于密钥,因为很多算法是公开的

                    劣处:密钥太多,无法有效管理

通信对象很多的情况下,没办法实现不同的密钥的管理

image.png


数据完整性:    A --> B        (数据不能篡改)

                Eve监听A与B之间的通信,篡改数据 

单向加密算法:提取数据特征码(指纹)

    1),输入一样,输出必然一样

    2),雪崩效应:输入的微小改变,将会引起结果的巨大改变,这是为了防止密码的暴力破解的

    3),定长输出:无论原始数据是多大,结果大小都是相同的

    4),不可逆的:无论根据特征码还原原来的数据


A: plaintext:footprint (footprint 脚印,指纹)提取出来,并附加在明文后面 --> B

                    (使用同样的加密算法,去重复计算这段明文的特征码,并跟原来发过来的

                     特征码进行比较,如果一样,那么数据就说明没有被篡改) 


                plaintext是对的,footprint不对,所以不一样

                plaintext是不对的,footprint对的,所以不一样

                plaintext是不对的,footprint不对,所以不一样

                出现以前三种情况, B 就不接受数据


man-in-middle 中间人攻击

A: plaintext:footprint --> B

E: plaintext2:footprint2  -->B         E截取A-->B数据,修改明文,计算特征码,发给 B



A: plaintext: (footprint) 加密-> B,对加密的 (footprint) 进行解密,只要能解密,就知道,这个数据,没有被篡改过,因为A的密码只有A和B知道,


E: plaintext2:f(footprint2) 加密  -->B         E截取A-->B数据,修改明文,计算特征码,(没法解开加密的特征码,或者说加密使用的密码就不是A与B约定好的密码)发给 B ,B收到后,就知道这段数据被修改过了





协商生成密码: (别人看不懂,只有A和B才能看懂的约定的密码) 密钥交换

双方协商如何生成密钥,但是却能够不让第三方得到这个密钥,密钥交换需要特殊的互联网协议支撑

最早的也是今天被当作密钥交换算法(密钥交换机制)的,叫 Diffie-Hellman 算法( 协议 )

密钥交换 (Internet Key Exchange,IKE) 互联网密钥交换


A --> B

        p(大素数,质数,prime,只能被1和自身整除,但是很大),主要是利用了一种数学原理(离散对数原理) (prime 素数)

        g(generator 生成数 生成器数),为了帮你生成其它数字的

p和g在互联网上传输,任何其它人都可以看到

A: x  x是随机数  A  只知道自己的x,不知道对方的y

B: y  y是随机数  B 只知道自己的y,不知道对方的x

x和y不在互联网上传输的


然后双方开始做计算

A 将 g^x%p (g的x次方,对P取模)--> B

B 将 g^y%p (g的y次方,对P取模)--> A

互联网上只能看到四个数  p g g^x%p g^y%p ,看不到x,也看不到y

普通人 无法推断出 x和y是什么


A:  (g^y%p)^x = g^yx%p

B:  (g^x%p)^y = g^xy%p

g^yx%p = g^xy%p

A和B能够计算出相同的结果,这个结果就是密钥

这就是著名的  Diffie-Hellman 密钥交换算法


可以尝试一下,看结果是不是一样的,结果肯定一样

g=2

p=7

x=2

y=3


A和B从此以后不需要记密码了,只要有一个软件,能够利用 Diffie-Hellman 算法,每一次发送数据,它都重新计算一次,交换一次密钥,就算E把第一次密码破解出来,第二次密码已经换了

image.png



2^x * 2^y   

(2^x)^y


上面只是讲明白它们到底是如何进行的,事实上背后涉及到的原理比这个要复杂得多


因为密码是自动生成的,所以接收方还是无法验证发送方的身份

image.png



公钥加密算法 (非对称加密算法)

    密钥对:

        公钥: p (public key)

        私钥: s (secret key)

公钥不是独立的,公钥是从私钥中提取出来的,为了保证算法的安全性,私钥一般都非常的长,一般768位,(1024,2048,4096,8192)位的都有

用公钥加密的,只能用与之配对的私钥解密,

用私钥签名(加密)的,只能用与之配对的公钥验证(解密),

 


发送方用自己的私钥签名(加密)数据,可以实现身份验证的

发送方用对方的公钥加密数据,可以保证数据的机密性


公钥加密算法(非对称加密算法)其实很少拿来数据加密的,因为速度太慢了,因为它的密钥太长了

公钥加密算法 (非对称加密算法)比 对称加密算法 要慢上3个数量级(1000倍)

公钥加密(非对称加密算法) 通常是用来身份验证,通常不是用来保证机密性的场合


image.png



image.png

指纹(特征码) 和 公钥加密算法结合起来,就能保证了 身份验证和完整性


公钥加密算法 (非对称加密算法)的主要作用也就是身份验证


image.png

image.png


证书要收费,全球认可的证书,一个证书,有可能10万,20万 (一年的使用费)

几千是最便宜的了

image.png

以上只能保证 完整性(指纹作用)和身份验证(公钥作用)


要想实现机密性不要用公钥加密算法(因为它太慢),我们使用对称加密


下图不考虑,因为涉及到IKE,太麻烦

image.png


下面是正常的做法

image.png

image.png



PKI: public Key Infrastructure    公钥基础设施

        PKI的核心就是证书颁发机构 ( CA )和它的彼此间的信任关系


证书丢了怎么办?  声明作废

 我们的这里就是私钥丢了,别人攻破我的服务器,就是丢了

怎么保证私钥丢了,别人却无法用了

(银行U盾又还是需要密码的)

同样,我们的私钥也是需要加密存放的,

私钥加密固然会保护私钥,但是会带来额外的问题:

每次用到私钥加密一段数据,都需要输入密码,

有时我们还需要借助于额外的管理工具,它能够自动输密码的,

既然能自动的,别人攻破了,也就没有意义了



万一工具出了问题,问题就更大了,

比如管理通讯录的软件,人家能拿到你的通讯录

电脑的杀毒软件,有权限扫描电脑,电脑上的数据杀毒公司都可以拿走的,

安全软件才是最大的间谍软件


        

用一些开源的东西,自己生成密钥(是对私钥加密?),自己管理密码(私钥密码),

然后两人通信,别人是获取不到的






普通分类: