RSA算法

RSA算法定义

(1) 选择两个不同的⼤素数p和q;
(2) 计算乘积 n=pq 和 Φ(n)=lcm(p-1,q-1);注:lcm即最小公倍数
(3) 选择⼤于1⼩于Φ(n)的随机整数e,使得gcd(e,Φ(n))=1;注:gcd即最⼤公约数。
(4) 计算de=1mod Φ(n);注:即d使得de mod Φ(n) =1。
(5) 对每⼀个密钥k=(n,p,q,d,e),定义加密变换为Ek(x)=xe mod n,解密变换为Dk(x)=yd mod n,这⾥x,y∈Zn;
(6) p,q销毁,以{e,n}为公钥,{d,n}为私钥。
(7) RSA密码体制既可以用于加密又可以用于数字签名。下面介绍RSA数字签名的功能。
私钥签名,公钥验签。
1.签名:对于消息m签名为:sign ≡ md mod n
2.验签:对于消息签名对(m,sign),如果m ≡ signe mod n,则sign是m的有效签名

计算实例

步骤1、 假设p = 3、q = 11(p,q都是素数即可。),则n= pq = 33;
r =Φ(n)= (p-1)(q-1) = (3-1)(11-1) = 20;
步骤2、 根据gcd(e,Φ(n))=1,即gcd(e,20)=1,令e=3,则,d = 7。(两个数交换⼀下也可以。)
步骤3、 到此,公钥和密钥已经确定。公钥为(N, e) = (33, 3),密钥为(N, d) = (33, 7)。
步骤4、 加密时,如果明文 x=20 , 密文 Ek(x) = Ek(20) = 203 mod 33 = 14
步骤5、 解密时,密文 y = 14, 明文 Dk(x) = 147 mod 33 = 20

加密与签名的比较

第一个场景:B要给A传递一条消息,内容为某一指令。

RSA的加密过程如下:

(1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。

(2)A传递自己的公钥给B,B用A的公钥对消息进行加密。

(3)A接收到B加密的消息,利用A自己的私钥对消息进行解密。

在这个过程中,只有2次传递过程,第一次是A传递公钥给B,第二次是B传递加密消息给A,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行解密,防止了消息内容的泄露。

第二个场景:A收到B发的消息后,需要进行回复“收到”。

RSA签名的过程如下:

(1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。

(2)A用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给B。

(3)B收到消息后,在获取A的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的。

在这个过程中,只有2次传递过程,第一次是A传递加签的消息和消息本身给B,第二次是B获取A的公钥,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回复给B,防止了消息内容的篡改。

两个场景的比较

  • 第一个场景虽然被截获的消息没有泄露,但是可以利用截获的公钥,将假指令进行加密,然后传递给A。
  • 第二个场景虽然截获的消息不能被篡改,但是消息的内容可以利用公钥验签来获得,并不能防止泄露。

在实际应用中,要根据情况使用,也可以同时使用加密和签名,比如A和B都有一套自己的公钥和私钥,当A要给B发送消息时,先用B的公钥对消息加密,再对加密的消息使用A的私钥加签名,达到既不泄露也不被篡改,更能保证消息的安全性。

参数选择

RSA参数(p和q)的选择

  • p和q要⾜够⼤
  • p和q应为强素数。如p满⾜以下三个条件,即为强素数:
    1. p-1有⼤素数因⼦r
    2. p+1有⼤素数因⼦s
    3. r-1有⼤素数因⼦t
  • p和q的差不能太⼩
  • p-1和q-1的最⼤公因数应很⼩

RSA参数(公钥e)的选择

  • e不能太⼩;
  • 最好选择e为modΦ(n)的阶数,即需要使 i 的值尽量⼤才能使得 e i ≡ (mod Φ(n)) 成⽴。
  • i 等于(p-1)(q-1)/2是最好的。
  • ⼀般建议取e=216+1=65537

RSA的安全性

RSA面临的安全问题

  1. 如果RSA的p,q被成功分解就可以立即获取φ(n),从而可以通过d ≡e-1 mod φ(n) 快速幂求取乘法逆元获取私钥d。
  2. 经过较长时间的发展,如今被破解的最长RSA密钥是768个二进制位,目前密钥长度介于1024~2048比特之间的RSA密钥是安全的
  3. 为保证RSA算法的安全性,对p,q提出以下要求:
    & |p-q|要相对大
    & p-1和q-1都应有大素因子
    & 如果e

对RSA算法的攻击

  1. 穷举攻击:这种⽅法试图穷举所有可能的私钥;
  2. 数学攻击:有多种数学攻击⽅法,它们的实质都是试图分解两个素数的乘积。⼤合数的因⼦分解算法有:试除分解法,连分数分解法,p-1分解法,p+1分解法,⼆次筛选分解法,椭圆曲线分解法,代数域筛选分解法等;
  3. 计时攻击:这类⽅法依赖于解密算法的运⾏时间;
  4. 基于硬件故障的攻击:这种⽅法应⽤产⽣签名过程中处理器发⽣的故障;
  5. 选择密⽂攻击:利⽤RSA的算法性质;
  6. 共模攻击:由于⽬前⽣成⼤素数的速度还是⽐较慢的,造成有的⼈为了加快算法速度⽽选择同样的⼤素数,也就是相同的模数,只是选择不同的密钥。这样做虽然加快了速度,但也给RSA算法带来了安全隐患。

参考链接:

1. https://www.cnblogs.com/wl-blog/p/14898801.html
2. https://blog.csdn.net/qq_37469055/article/details/116381345
3. https://wenku.baidu.com/view/661e61a401d276a20029bd64783e0912a2167c03.html
4. https://wenku.baidu.com/view/a86cedfdd25abe23482fb4daa58da0116d171f40.html?fr=income1-wk_app_search_ctr-search

5. https://blog.csdn.net/sinrier/article/details/118637154

你可能感兴趣的:(DPA,安全)