ShokaX

非对称密码-RSA原理

发布于 字数统计 2.5k 字 阅读时长 9 分钟

非对称密码-RSA原理

发布于 字数统计 2,474 阅读时长 13 分钟

简述

1976 年,美国学者 Dime 和 Henman 为解决信息公开传送和密钥管理问题,提出一种新的密钥交换协议(迪菲-赫尔曼密钥交换协议,简称EDH),允许在不安全的媒体上的通讯双方交换信息,安全地达成一致的密钥,这就是“公开密钥系统”。

公钥(Public Key)与私钥(Private Key)是通过加密算法得到的一个密钥对(即一个公钥和一个私钥,也就是非对称加密方式)。公钥可对会话进行加密、验证数字签名,只有使用对应的私钥才能解密会话数据,从而保证数据传输的安全性。公钥是密钥对外公开的部分,私钥则是非公开的部分,由用户自行保管。

使用密钥对的时候,如果用其中一个密钥加密一段数据,只能使用密钥对中的另一个密钥才能解密数据。例如:用公钥加密的数据必须用对应的私钥才能解密;如果用私钥进行加密也必须使用对应的公钥才能解密,否则将无法成功解密。

RSA算法

在公私钥加密体系中,常见的加密算法有RSA、 Cramer-Shoup、 Elgamal、以及椭圆曲线密码学等等。
而在日常中的SSL证书使用的基本都是RSA 2048bit加密算法。这里只解释RSA算法的数学原理。

概念

RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但这时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥(密钥并非只是乘积,还包括了e)。

素数(质数):指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。如2,3,5,7,11,13,17…

一些数学概念

欧拉函数的定义

思考以下问题:
A:任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?)
Q:计算这个值的方法就叫欧拉函数,以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。

欧拉函数的计算

通式:φ(n)=n*(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…*(1-1/pn),其中p1, p2……pn为n的所有素因数,n是不为0的整数.

欧拉函数的性质

  1. 对于素数p,φ(p)=p−1
  2. 若p为素数,n=p^k,则φ(n)=p^k-p^(k-1)
  3. 若m,n互素,则φ(m∗n)=φ(m)∗φ(n),特殊的,当m=2,n为奇数时,φ(2*n)=φ(n)
  4. 当n>2时,φ(n)是偶数
  5. 小于n的数中,与n互素的数的总和为:φ(n) * n / 2 (n>1)
  6. n=∑d∣n​φ(d),即n的因数(包括1和它自己)的欧拉函数之和等于n

模反元素(e和d)

如果两个正整数e和n互素,那么一定可以找到整数d,使得 ed-1被n整除,或者说ed被n除的余数是1. 这时,d就叫做e对模数n的模反元素。

image-20220401132001422

RSA数学原理

RSA的算法涉及三个参数,n、e、d。其中,n是两个大质数p、q的积,n用二进制表示时就是所占用的位数,就是所谓的密钥长度,即多少bit的加密长度。e和d是一对相关的值(模反元素),e可以任意取,d由于e计算而得

要求e与(p-1)*(q-1)互质(互质是公约数只有1的两个整数,如7和11和13等等)

再选择d,要求(de)mod((p-1)(q-1))=1。

(n,e),(n,d)就是密钥对。其中(n,e)为公钥,(n,d)为私钥。这里不能反过来用,把(n,d)当成公钥发布出去。因为从私钥生成公钥是通过正向的模运算算得的,计算机很快就能产生,但要反过来要计算机从公钥做逆模运算求得私钥,只要位数够长,就几乎是难以算出的。

因此RSA破解的难点就在于大素数n的因式分解上,我们很难对n进行分解得到p和q ,得不到pq自然也得不到e和d 。

RSA加密是对明文的E次方后除以N后求余数的过程。
公钥加密体制中,一般用公钥加密,私钥解密
e和d可以互换使用,即:

A=B^e mod n;

B=A^d mod n;

RSA例子

RSA算法密钥生成过程

• 随意选择两个大的素数p和q,p不等于q,计算n = pq.
• 根据欧拉函数的性质3,求得r=φ(n)=φ(p)φ(q)=(p-1)(q-1).
• 选择一个小于r的整数e,且e与r互素;并求得e关于r的模反元素,命名为d.(模反元素存在,当且仅当e与r互质; 求d令ed≡1(mod r))
• 将p和q的记录销毁
其中(n,e)是公钥,(n,d)是私钥.

• A随机选两个不相等的质数61和53,并计算两数的积n=6153=3233,n的长度就是密钥长度。3233的二进制是110010100001,一共12位,
• 所以这个密钥就是12位. 实际应用中,RSA密钥一般是1024位,重要的场合是2048位.
• 计算n的欧拉函数; φ(n)=(p-1)(q-1)=60
52=3120.
• A在1到3120上随机选择了一个随机数e=17,与3120互素.
• 计算e对φ(n)的模反元素d,即ed-1=kφ(n)。
• 求解:17x+3120y=1.用扩展欧几里得算法求解。可以算出一组解(x,y)=(2753,-15),即d=2753. 公钥(3233, 17),私钥(3233,2753)
至此完成计算.

RSA加密过程

假设A要向B发送加密信息m,他就要用B的公钥(n,e)对m进行加密,但m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n. 所谓加密就是计算下式的c:
m^e ≡ c (mod n)
假设m=65,B的公钥(3233,17),所以等式如下:
65^17≡2790(mod 3233)
所以c等于2790,A就把2790发给B.

RSA解密过程

B收到A发来的2790后,就用自己的私钥(3233,2755)进行解密
c^d ≡ m (mod n)
也就是c的d次方除以n的余数就是m
2790^2753 ≡ 65 (mod 3233)
因此得到原文65.