非对称加密介绍

2018年9月18日 作者 jacky

公钥加密,也成为非对称加密,有一对秘钥对,一个用做加密(pubkey 公钥),另外一个用作解密(priKey 私钥)
在非对称加密中:

  • 公钥用于加密,私钥用于解密。
  • 私钥做签名,公钥做验签。

DES、AES都有密钥配送问题??

在现实世界中使用对称密码时,一定会遇到密钥配送问题。尽管一开始可能觉得这并不是什么大问题,但这个问题却是很难从根本上得到解决。

场景分析:

Alice给Bob发一封邮件,而且不想让别人知道邮件的内容,因此Alice决定使用对称密码进行加密,这样即便被窃听者Eve窃听到通信内容也没有问题。

Alice将邮件内容进行加密,生成了密文。那么是不是指要将这份密文用邮件发送给Bob就可以了呢?不行,因为这样Bob是无法对密文进行解密的。要使用对称密码进行解密,就必须使用和加密相同的密钥才行。也就是说,只有同时将密钥也发送给Bob,Bob才能完成解密。

那么,将密文和密钥都通过邮件发送给Bob行不行呢?也不行。如果密文和密钥都通过邮件发送,两者就都会被窃听者Eve窃听到。这样一来,同时得到密文和密钥的Eve就能够像Bob一样完成密文的解密并看到明文内容了。也就是说,如果同时发送密钥,则Eve也能够完成解密。

解决方法:

  • 通过事先共享密钥来解决
  • 通过密钥分配中心来解决
  • 通过DH密钥交换来解决
  • 通过公钥密钥来解决

这里介绍公钥密钥解决的方法

在对称密码中,加密密钥和解密密钥是相同的,但公钥系统中,加密密钥和解密密钥却是不同的。只要拥有加密密钥,任何人都可以进行加密,但没有解密密钥是无法解密的。因此,公钥密码的一个重要性质,就是只有拥有解密密钥的人才能够进行解密。接收者事先将加密密钥发送给发送者,这个加密密钥即便被窃听者获取也是没有问题。发送者使用加密密钥对通信内容进行加密并发送给接收者,而只有拥有解密密钥的人才能够进行解密。这样一来,就用不着将解密密钥发送给接收者了,也就是说,对称密码的密钥配送问题,可以通过公钥密码来解决。

制作密钥对


生成 RSA 私钥(传统格式的)

创建私钥
1,openssl genrsa -out rsa_private_key.pem 1024


将传统格式的私钥转换成 PKCS8 格式的(JAVA需要使用的私钥需要经过PKCS8编码,PHP程序不需要,可以直接略过)

2,openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM


生成 RSA 公钥

创建公钥
3,openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

RSA非对称加密内部计算原理

计算RSA非对称加密,的公钥和私钥的产生
质数,也是素数,只能被1和他本身整除的数 例如:5,11,13

  • 1.N = p*q
  • 2.L = lcm(p-1,q-1) L是q-1与p-1的最小公倍数
  • 3.条件1,1 < E < L 条件2,E 和 L的最大公约数必须为1 (互质数)
  • 4.条件1, 1 < D < L 条件2,E*D mod L =1

举例:

  • 1.N = p * q =17 * 19 =323s
  • 2.L = lcm(p-1,q-1) = lcm(16,18)的最小公倍数 = 144
  • 3.1<E<144, E必须于144的最大公约数为1 所以,E=5
  • 4.1<D<144, 5*D mod 144 = 1 D = 29

那么 公钥,E=5,N=323 ,私钥 D=29,N=323

加密函数

解密函数

RSA加密解密例子

什么是数字签名

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名是非对称密钥加密技术与数字摘要技术的应用。

RSA数字签名和验签

RSA数字签名算法的过程为:A对明文m用解密变换作: (公钥用来加密,私钥用来解密,数字签名是用私钥完成的,所以称为解密变换,这与onu sdk中一致)sº Dk (m)=md mod n,其中d,n为A的私人密钥,只有A才知道它;B收到A的签名后,用A的公钥和加密变换得到明文,因: Ek(s)= Ek(Dk (m))= (md)e mod n,又 deº1 mod j(n)即de=lj(n)+1,根据欧拉定理mj(n)=1 mod n,所以Ek(s)=mlj(n)+1=[mj(n)]em=m mod n。若明文m和签名s一起送给用户B,B可以确信信息确实是A发送的。同时A也不能否认送给这个信息,因为除了A本人外,其他任何人都无法由明文m产生s.因此RSA数字签名方案是可行的。

但是RSA数字签名算法存在着因计算方法本身同构造成签名易被伪造和计算时间长的弱点,因此实际对文件签名前,需要对消息做MD5变换。

MD5函数是一种单向散列函数,它将任意长度的消息压缩成128位的消息摘要。应用MD5的单向性(即给定散列值,计算消息很难)和抗碰撞性(即给定消息M,要找到另一消息M’ 并满足两者的散列值很难),可以实现信息的完整性检验。另外该函数的设计不基于任何假设和密码体制而直接构造,执行的速度快,是一种被广泛认可的单向散列算法。

rsa签名验签例子

DSA 数字签名

数字签名原理

1991年8月美国国家标准局(NIST)公布了数字签名标准(Digital Signature Standard, DSS)。

此标准采用的算法称为数字签名算法(Digital Signature Algorithm, DSA),它作为ElGamal和Schnorr签名算法的变种,其安全性基于离散对数难题;并且采用了Schnorr系统中,g为非本原元的做法,以降低其签名文件的长度。

DSA数字签名的原理如下:

  1. 首先生成一个素数p,p满足 2L-1<p<2L

注:关于L的值的范围看到两种不同的说法

a):L是1024、2048、3072三个值中的一个

b):L满足512<=L<=1024 ,且L是64的倍数

  1. 然后再生成q,在此处,假定L=1024,找到一个素数q,q满足 q能整除p-1,即 (p-1)mod q=0,且2159< q <2160;
  2. 然后再生成g,g=hp-1/qmod p, h满足1<h<(p-1),并且g>1
  3. 最后生成用户的私钥x和公钥yx是随机数或者伪随机数,且满足:0< x <q

    y 满足 y=gx mod p

  4. 签名,DSA签名也是由两个整数r、s构成,下面是r、s的获取方式:
    r =(gk mod p) mod q
    s = [k-1(H(M) + xr) ] mod q
    注:M是明文消息,H(M)是明文消息的哈希值,k是临时密钥
  5. 验证,假设收到的明文为M’,收到的签名为s’、r’,则验证方式如下:
    w=(s’)-1mod q
    u1=[H(M’)w] mod q
    u2=(r’)wmod q
    v=[(gu1 · yu2) mod p] mod q
    检验 v=r’ 签名有效,反之则签名无效;

举个例子

ECC && ECDSA

椭圆曲线加密算法,即:Elliptic Curve Cryptography,简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密。

椭圆曲线在密码学中的使用,是1985年由Neal Koblitz和Victor Miller分别独立提出的。

椭圆曲线

原理讲解

使用案例