zoukankan      html  css  js  c++  java
  • SSL握手两大加密算法 : RAS算法 和 DH算法解析

    写下此博客记录心得体会,如有不足之处请指正
     
    先是手稿笔记 : 

     正文:

     
    在Https协议中,Client端和Server端需要三个参数才能生成SessionKey来加密信息。
    三个参数分别是

    Client Random(客户端随机数) 假设是C
    Server Random(服务端随机数) 假设是S
    PreMaster Random(待加密随机数) 假设是P
     
    前两个都是通过明文的方式传输,即C从客户端以明文的方式发送给服务端,S从服务端以明文的发送发送给客户端
     
    而P则是最重要,也是最关键的信息了,默认通过RSA算法对其加密,再传输到服务端,服务端再用私钥对密文进行解密,得到P。
     
    如果被而已的第三方截取了P加密后的密文,是否有P信息泄露的危险呢?
     
    我们知道RSA算法的公钥是对外公开的。假设公钥对(e,n),密钥对(d,n)那么从客户端发送到服务端关于P的密文 M = P^e mod n

    假设密文M被攻击者拦截,如果要求得明文,必须求得

    (log(P)M) mod n = e 的底数P,然而解P是十分复杂的过程,所以攻击者一般无法获得P的值。或者说要获得私钥的话,
     
    ed = k f(n)[f = 欧拉函数] + 1, 而f(n) = f(p*q) = f(p)*f(q) = (p-1)*(q-1),而对n进行大素数分解的计算过程是十分难的。也不能通过M^d mod n 来获得P
     
    RAS是相对来说比较安全的算法,但是用算力大的机器暴力破解,也是可以成功的。一般银行的重要密码需要30秒左右更换一次。
     
    第二种算法是DH算法,假设DH算法的数对为(p,q)
     
    客户端选取【1 ~ q - 1】中的一个随机数RC,通过计算得出一个参数 PC
     
    PC = (p ^ RC)  mod q
     
    服务端同样选取【1 ~ q - 1】中的一个随机数RS,通过计算得出一个参数 PS
     
    PS = (p ^ RS) mod q
     
    客户将自己的PC参数交给服务端

    服务端将自己的PS参数交给客户端
     
    服务端计算 PC ^ RS mod q = A

    客户端计算 PS ^ RC mod q = B
     
    实际上A = B,下面来证明一下,
     
    首先 要用到一个定理

    ((W ^ X)  mod Y) ^  Z mod Y = W ^ (X * Z) mod Y
     
    为什么呢,设 U = (W ^ X)  mod Y , 那么 U + k*Y = W^X (k为正整数)

    即 : U  = W^X - k*Y
     
    (W^X - k*Y)^Z 的中间的项和最后一项都含有Y 而只有第一项W^(X*Y)

    不含有Y 所以

    ((W ^ X)  mod Y) ^  Z mod Y = W^(X*Z) mod Y

    A = PC ^ RS mod q =
    ((p ^ RC)  mod q) ^ RS mod q = p ^ (RC * RS) mod q
     
    B = PS ^ RC mod q =
    ((p ^ RS)  mod q) ^ RC mod q = p ^ (RC * RS) mod q
     
    证明完毕,客户端和服务端交换参数后计算得到的最终数字A 和 B是相等的,聪明的你应该猜到了, A = B 就是服务端和客户端需要达成一致的PreMaster随机数!
     
    可见只要我们知道了 RC * RS 就可以知道PreMaster!
     
    其实两者交换的参数实际上是带有他们各自生成的随机数的信息的,因为,传输的参数公式为 ,参数P = (p ^ 各自随机数) mod q
     
    当 p 和 q是已知的时候,拦截了P的话,要算出各自随机数,则要算出 (log( p)P) mod q = 各自随机数,
    对数运算复杂,我没有实际想办法计算过大数的对数运算,先暂不做解析。
     
    另外就是(p,q)对的选取,

    p^x mod q = L (x = 1, 2 , 3, 4 ......)

    当L从1开始向上逐一递增,L的取值不能周期性变化,

    假设L以6为周期变化

    那么p^1 mod q = p^7 mod q = p^13 mod q = ...
     
    假如我们是攻击者

    假设我们知道了

    PC = (p ^ RC)  mod q 中 PC的值

    PS = (p ^ RS) mod q 中PS的值

    因为p^x mod q = L是呈周期性变化的,通过观察,我们就能轻易找到一个数 O

    让 PS = (p ^ O) mod q
     
    假设周期是6,那么 O 和原来服务端随机数RS的差值就是6*k(k为整数)
     
    那么我们只要计算
    ANS =   PC ^ O mod q = p ^ (RC * O) mod q   =  p ^ (RC * (RS + 6*k)) mod q   =   p ^ (RC * RS + 6 *k *RC )) mod q
     
    因为p^x mod q = L是以6为周期变化的,又因为6 *k *RC是6的整数倍,所以p ^ (RC * RS + 6 *k *RC )) mod q = p ^ (RC * RS) mod q = PreMaster
     
    我们盗取PreMaster成功!无需知道 RS 和 RC 的各自具体值, 直接知道他们的乘积就好了
     
    所以(p,q)对的分布要满足p^x mod q = L,x取【1~ q -1】的时候,L的取值是无序不重复的,这样才能保证一定的安全性
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    [LuoguP1445][LOJ#10202]樱花
    [APIO/CTSC2007]动物园
    [LOJ#10157]皇宫看守
    python3安装crypto出错,及解决方法
    Qt之QuaZip编译-使用教程
    CentOS-NAT模式下(DHCP)联网
    CentOS桌面环境中网卡启动失败
    Linux基础--基础命令
    Linux基础 --1
    python面试题----4
  • 原文地址:https://www.cnblogs.com/lqlqlq/p/12003617.html
Copyright © 2011-2022 走看看