各种加密算法与SSL简介

简介

非对称加密

非对称加密:两个密钥,一个公钥,一个私钥,如果用公钥加密的数据只有用私钥才能解密,用私钥加密的数据只有公钥才能解密

特点:算法强度复杂,安全性能高,导致加密速度慢

主要算法:RSA,Elgamal,背包算法,Rabin,D-H,ECC,

对称加密

双方使用同样的密钥加解密,这个是有一个问题的,首先得保证密钥不被泄露,而且需要定期在通信网络的源端和目的端同时修改密钥

密钥越大,加密越强,但加密与解密的过程越慢

主要算法:DES,3DES,IDEA,AES

非对称加密算法介绍

RSA

首先给出两个已知公式

  1. 欧拉函数:表示小于n的正整数中,有多少个与n构成互质关系,其中 表示任何一个大于1的整数都可以写成多个质数次方的积

  2. 欧拉定理:如果a,n互质,则下面公式成立:

RSA的公钥私钥选取过程

  1. 选取两个不相等的质数p和q

  2. 计算乘积n=p*q,其中n转为二进制的长度即为密钥的长度

  3. 计算$\phi(n)$

    因为p和q为质数,不能分解,因此代入欧拉函数得到:

  4. 在{}中选取e

  5. 计算d

    计算出一组满足上式的整数解(d,k)

  6. 将(n,e)封装为公钥,(n,d)封装为私钥

加解密及私钥解密证明

要加密信息为m ,m为整数(转换)且mn,可以将上信息分割为若干个短信息

加密:$m^{e}=c\,\,(mod\,\,n)$

计算出c,作为密文发送出去

解密:$c^{d}=m\,\,(mod\,\,n)$

计算出m,即为明文

证明过程如下:

由加密的式子可得:

将c代入解密的式子,得到:

由$ed\,\,\%\,\,\phi(n)=1$ 即:$ed=h\phi(n)+1$ ,上式变为:

对于上式,如果m和n互质,根据欧拉定理:

如果m和n不互质,即说明m和n存在非1的公因子,由于n=pq,且p,q均为质数,说明n的非1因子是p,q;

那么m必然是p得倍数或者是q得倍数,设$m=kp$

由于m<n,可得k<q,即k与q互质,那么kp和q互质,由欧拉定理得:

RSA算法的可靠性:

公钥开放,也就是说如果知道了d,私钥就泄露了

由上面第一个式子,要想知道d,必须知道$\phi(n)$ ,而$\phi(n)$由第二个式子可知,与p和q相关,由第三个式子知道p和q是n的因式分解

因此如果想破解RSA算法,必须知道满足$pq=n$的所有质数对(p,q),即如果高效解决大整数的因式分解就能快速破解RSA算法

D-H密钥交换

DH

a为Alice的私钥,b为Bob的私钥,公开的时g,p,A,B,密钥为K

原理就是通过自己的私钥运算,并发送公钥给对方,通过运算获取相同的密钥,使用对称加密来加密明文

证明

可靠性

要知道K,需要知道$g^{ab}\,\,mod\,\,p$ ,即需要知道a和b,而a和b分别由下式得到:

上式是离散对数问题,目前没有快速求解离散对数的算法

ElGamal加密算法

实质上就是将D-H算法变为非对称加密算法

密钥生成

选择素数p,两个随机数g和x,满足g,x<p,

计算 y=$g^x\,\, mod \,\,p$

私钥为x

公钥为y,g,p,

加密

随机选择k,满足k与p-1互素

其中M为明文,(a,b)为密文

解密

可靠性

同D-H算法,是离散对数难题

ECC加密算法

椭圆曲线:

  1. 关于X轴对称
  2. 画一条直线跟椭圆曲线相交,它们最多有三个交点

椭圆曲线上的运算:

加法运算:

设椭圆曲线上有两点,A和B,作这两点的直线与该曲线相交于第三点C,将C点关于X轴对称得到D点

记D=A+B

ECC01

当A和B重合时,即作A点的切线,与曲线相交于第二点(B点),然后关于X轴对称得到C点

记 C=A+A

ECC02

乘法运算

转为加法运算

如下图所示:

ECC03

椭圆曲线上点的阶:

P为椭圆曲线上的点,如果nP=无穷远点,n取最小整数,即为P的阶

无穷远点:如果椭圆曲线上的两点A,B的连成的直线不与椭圆曲线交于第3点,则有A+B=无穷远点

椭圆曲线在密码学中的应用

对于实数域上的椭圆曲线,做如下变化:

  1. 实数域中取整数点
  2. 对整数点取模处理

如下,对一椭圆曲线 mod 17的结果

ECC04

对于椭圆曲线中的运算仍然成立,如下图所示,描述C=A+B的过程

ECC05

有限域椭圆曲线上的加解密

用户A作如下处理:

在椭圆曲线上选取一基点G,椭圆曲线$E_{p}(a,b)$ ,选取整数k作为私钥(k小于n,n为G的阶),

计算K=kG

将G,K,$E_{p}(a,b)$ 作为公钥公开

用户B要将明文M传给A,作如下处理:

随机产生一个随机数r,(r<n)

计算点

传给用户A

用户A接收到后作如下处理:

证明:

可靠性

已知K和G,如何求解k的问题:对于椭圆曲线上的kG运算是不可逆的,这是椭圆曲线上的离散对数问题,目前无法找到快速解决该问题的方法。

实际的函数如下:

1
2
3
4
Point result = P;
for (int i = 0; i < k - 1; i++)
result = add(P, result);
sendTo((result, P), others);

有个问题:具体的kG如何计算?,为什么不可逆?
以下只是猜测,并没有找到什么确切的答案
原因:比如k=17,加密的时候因为知道k,作如下运算,由G得到2G,由2G得到4G,由4G得到8G,由8G得到16G,16G再和1G运算得到17G,总共走了5步;而如果破解的话,需要一步一步遍历,如果作倍数运算可能会漏掉k,导致永远找不到,因此只能有1G得2G,由2G得3G,…直到17G,最后的结果是走了17步;而如果k很大,结果会更明显;已知k的运算时间复杂度为O(log n),未知k的时间复杂度为O(n)
更者,如果17G不等于17G(即不同的叠加出现不同的17G),那么就有更多的可能了

背包算法

超递增背包:其中的每一项都大于它之前所有项之和

记超递增背包为{}

选取N满足N与背包中的任何一个数没有公因子

并取一个模数M,满足该模数比背包中的所有数的和都大

对背包中的每个元素作如下运算:

将修改后的背包{}作为公钥,原始的超递增背包{}作为私钥

加密

对于要加密的二进制消息,按照背包个数分组,然后将每组二进制消息中1对应的背包元素相加,将每组最后相加的结果{}作为密文发送出去

解密

计算$N^{-1}$ : 满足$N\,\,N^{-1}\,\,mod\,\,M=1$

对密文做如下运算

最后将在背包中的位置映射到二进制上,即得到了二进制消息

证明

对于一组二进制消息来说,假设第i,j…等位上为1,加解密的运算如下:

前提条件M的选取使得倒数第二行求和的结果和最后一行相等,超递增背包使得最后一个等式唯一

可靠性

公钥为{},M,N,得到密文后,可以将每组的 的和s求出来

由公钥的求解方法,我们可以得到一个矩阵,矩阵的第i行表示私钥中第i个元素所有可能的取值,即私钥一定由下面的矩阵中每一行选取一个值组成:

需要k重for循环进行遍历,每次选取元素时需满足该背包为超递增背包,选取完k个元素后,将得到的背包用于计算密文,如果所有的密文均可以由得到的背包中的元素组成,则该背包为密钥

时间复杂度为$O(m^k)$,m为矩阵的宽

举个例子:

取一个超递增序列{2,3,6,13,27,52},N=31,M=105

公钥为{62,93,81,88,102,37},N=31,M=105

加密过程:

需要传递的明文为011000110101101110,按照背包的大小分为三组:011000 110101 101110

011000 对应 93+81=174

110101 对应 62+93+88+37=280

101110 对应 62+81+88+102=333

密文为{174,280,333}

解密过程:

求解$N^{-1}=61$

对于超递增背包,上面求解的结果都会唯一对应一组背包中的数字

Rabin

选取两个素数p,q,满足同余3模4. 作为私钥,n=pq作为公钥

加密消息M:

解密:

由于n=pq,由中国剩余定理得到$M^2=C\,\,(mod\,\,n)$等价为:

引入符号Legendre$\left [ \frac{a}{p} \right ]$:假设p为一个奇素数,a为一个整数,那么有

对于同余方程式$x^2\equiv a(mod\,\,q)$,如果Legendre符号$\left [ \frac{a}{p} \right ]=1$,且$p\equiv3(mod\,\,4)$

则方程式的解为

由模n二次剩余问题的定理1可以证明$\left [ \frac{C}{p} \right ]=1$,$\left [ \frac{C}{q} \right ]=1$

则4个解分别为:

中选择一个,从中选择一个,有4种组合方式,由之前的等价公式合并,利用中国剩余定理求解M的值

可以得到4个值,其中有一个就是M,需要在消息加密前加入一个已知的标题,以确定M

可靠性

基于求合数n的模平方根难度,解密过程在已知合数为pq的条件下,使用一种数学方法来得到M

对称加密算法

DES

DES是基于组块的加密算法,输入输出均为64位长度

加密过程:

  1. 密钥K转为二进制64位,根据表格PC-1变换为56位,拆为左右两半部分 ,每半边28位

  2. 进行左移,对于前一个来说左移位数按照1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1进行,最后得到 16组子密钥

  3. 拼接,并对应到表格PC-2,得到 为48位,$1\leqslant i \leqslant 16$

  4. 将明文M转为二进制,并按照IP表变换,记为ip,将ip的左半部分32位记为,右半部分32位记为

  5. 使用函数$f$执行16次迭代:

    具体$f$中先将从32位扩展为48位,按照表E;然后进行异或运算:,记为 ;再将进行S运算,即的运算原理是计算中第一位和最后一位的组成的二进制值作为i,中间的二进制值作为j,在中对应的第i行第j列的值转为二进制,最后输出的 再由表P转为32位的输出

  6. 将得到的逆转结合得到一个64位的区块: ;将其按表IP-1输出写为16进制即为明文加密后的结果

DES

解密过程

和加密一样,只是在16轮迭代过程中,调转左右子密钥的位置

破解

如果不知道明文,只知道密文,是否能破解?

明文的组合方式是$2^{64}$种,密钥的组合方式是$2^{56}$ ,从中选取一种明文,一种密文,使得最后加密的结果恰好为密文,总共需要遍历$2^{64}*2^{56}$次

知道少量的明文密文对,是否能唯一确定一个密钥?

3DES

三重DES实质上将暴力破解难度从$2^{56}$变为$2^{168}$

使用3条56位的密钥对 数据进行三次加密。3DES(即Triple DES)是DES向AES过渡的加密算法

其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,P代表明文,C代表密文,这样:

3DES加密过程为:C=Ek3(Dk2(Ek1(P)))

3DES解密过程为:P=Dk1(EK2(Dk3(C)))

假设三个密钥均不相同,则本质上就相当于用一个长为168位的密钥进行加密

AES

分组密码,由于DES的密钥长度只有56位,而且随着计算机处理能力越来越强,DES变得不再安全,AES便出现了,用以取代DES

AES分组的长度有128位,192位,256位,下面是按照128位来讲解

加密

  1. 16字节的明文和扩展密钥异或,i=0
  2. 将上一步的结果映射到S盒,得到变换后的16字节
  3. 将上一步的16字节按照4x4的矩阵排列,对每一行按照0位,8位,16位,24位进行循环移位
  4. 将上一步得到的矩阵左乘指定矩阵A 得到新的矩阵
  5. 通过G函数获取下一个扩展密钥,将上一步的矩阵从新排成一列,与扩展密钥异或,i++
  6. 如果i=10,返回得到的16字节作为密文,否则执行第2步

解密

加密的逆过程

加解密如下图

AES

扩展密钥原理

AES02

关于对称加密

对称加密的安全性基于密钥的长度,如果说一种情况出现:不管密钥的长度变为多长,计算机都能在很短的时间遍历完这所有的可能,该怎么办?

SSL

SSL 简述

HTTP+SSL=HTTPS

SSL在协议模型中的位置

tcpip

ssl

SSL作用:

不使用SSL的HTTP通信,带来三大风险:窃听风险,篡改风险,冒充风险

使用SSL后,所有信息都是加密传播,第三方无法窃听;具有校验机制,被篡改,通信双方会立即发现;配备身份证书,防止被冒充

SSL握手过程

  1. 客户端发送请求:

​ 生成的随机数n1,请求加密的方法…

  1. 服务器返回信息:

​ 生成的随机数n2,确定加密方法,含公钥的数字签名…

  1. 客户端验证,回应:

​ 对生成的随机数n3使用公钥加密,前面内容的hash值供校验

  1. 服务器回应:

​ 前面内容的hash值,供客户端校验

n1,n2,n3用于生成会话密钥

白话数字签名

假设A和B通信,A需要将信息M发送给B这样一个问题:

如果使用对称加密,首先得传密钥吧,那还得使用非对称加密,那非对称加密的公钥开放,谁都可以使用,那A使用B的公钥将信息加密,传给B,而此时C也使用B的公钥将信息加密,传给B,B怎么确定哪个是A发过来的呢?

数字签名的验证功能:

B先随机生成一串数字发送给A,然后A用自己的私钥加密,再发送给B,B使用A的公钥解密得到的结果如果和随机数相等,则表明对方是A,因为A的公钥只能解用A的密钥加密的密文,其他伪造的密文,A的公钥无法解开。

数字签名的防篡改功能:

假设A需要发送一条消息给B,如何防止B篡改呢?

A使用自己的私钥加密消息,将消息发送给B,B使用A的公钥解密消息,只能知道消息的内容,无法修改消息,因为B修改消息后,并不知道A的私钥,无法加密消息

那么有一个很大的文件,需要发送,使用非对称加密太耗时,如何做:

数字签名:摘要算法+非对称加密

文件传输:对称加密+非对称加密

实际对文件进行数字签名:先使用摘要算法将文件生成唯一的散列值,然后用私钥对这个散列值进行加密,再把加密后的结果和明文一起发送到B,B此时在网上下载A的公钥进行解密,B再使用摘要算法将明文文件转为散列值,如果两个值相等,表明签名成功

参考

RSA算法原理

迪菲-赫尔曼密钥交换

ElGamal加密算法

循环群

ECC加密算法入门介绍

离散对数和椭圆曲线加密原理

Bitcoin加密技术之椭圆曲线密码学

Rabin加密算法

中国剩余定理

公钥密码学中的数学问题之二次剩余

RSA数论基础

DES算法实例详解

DES的破解方案

AES简介

加密算法对比

RSA与ECC的对比

白话数字签名

白话HTTPS&SSL/TLS

如果觉得有帮助,给我打赏吧!