详解非对称加密算法RSA

非对称加密算法,是指加密秘钥与解密秘钥不同的一类加密算法。目前应用最为广泛的是RSA加密算法。RSA算法运用到的知识比较简单,下文详细介绍RSA加密算法原理。

费马小定理

给定一个素数nn,对于任意的整数q,若(p,n)=1(p,n)=1则有q(n1)=1(modn)q(n−1)=1(modn)

证明费马小定理网上很多,本文就不介绍了,有兴趣的同学可以网上搜索一下。
(p,n)=1(p,n)=1表示p,np,n互素。

引理 1

给定两不同的素数m,nm,n,任意的整数qq,若(m,q)=1(n,q)=1,则有p(n1)(m1)=1(modmn)p(n−1)(m−1)=1(modmn)

证明:根据费马小定理,p(n1)=1modnp(n−1)=1modn
所以有 p(n1)(m1)=(pn1)m1=1(m1)=1(modn)p(n−1)(m−1)=(pn−1)m−1=1(m−1)=1(modn)
得到 (p(n1)(m1)1)|n(p(n−1)(m−1)−1)|n
同理有(p(n1)(m1)1)|m(p(n−1)(m−1)−1)|m,
又因为m,nm,n是两个不同的素数,因此有(p(n1)(m1)1)|mn(p(n−1)(m−1)−1)|mn
因此:有p(n1)(m1)=1(modmn)p(n−1)(m−1)=1(modmn)

RSA加解密及数字签名算法

1、 生成公钥和私钥:
首先:任取两个互不相等的大素数, m,nm,n,令M=nm,N=(n1)(m1)M=nm,N=(n−1)(m−1),假设m>nm>n,最好取m>2nm>2n;否者容易被攻破;
其次:取一整数e,(e,N)=1e<Ne,(e,N)=1,e<N,求得另一整数dd满足ed=1(modN),一定存在某个dd满足d<N
然后:两组数组数字M,eM,e为公钥。可以对外公布,M,dM,d为私钥不可泄露。
最后:不再需要m,n,Nm,n,N,不可以泄露,最好是直接需要消除。

2、加解密算法

加密:任意的文字ww,可以用整数表示,比如Unicode编码。利用公钥计算s=we(modM),ss 便是密文。并可将密文通过公开渠道发送给私密秘钥持有者.
解密: 私密秘钥持有者计算sd=wed=wkN+1=w(wk)N=w(modM) 得到明文ww,完成加密通讯。

3、 数值签名算法:

签名文件:私密秘钥持有者,在签名文件特定位置(可以是任何位置)插入公钥,然后利用私钥加密文件,计算 sig=ed(modM) 并公布加密文件。
身份验证:,公钥持有者对签名文件解密,计算e=sige(modM)e=sige(modM),如果解密签名文件得到公钥ee则认同文件有加密秘钥持有者发出,否者视为伪造文件。

一般而言,你不能直接签名公钥,因为每次签名后是一致的,这样的签名只能使用一次;但是我们可以将公钥插入文档后,然后用不同的分组加密方式加密,这样可以使得每次得到的签名完全不一样,因而可以多次使用。

4、 幂乘算法

为了确保RSA算法的安全,我们必须选择很大的素数m,n,还要选择足够大的e,de,d,加密解密过程都包含幂乘和求余,直接计算wewesdsd几乎是不可能的。一般采用以下算法:

//加密时,x 是明文,e,M是公钥,输出密文
//解密是,x是输入密文,e,M是私钥,输出明文
function(x,e,M){
     out=1,      //输出变量
     temp=x,     //逐步计算幂乘
     flag=e|1    //取e得最低位,e为奇数,则flag=1;否则flag=0;
    while(e!=0){
        if(flag == 1){
            out=(out * temp) % M
        }
         temp= temp^2 % M
         e=e>>1     //e右移一位
         flag=e|1       //取低位值
    }
    if(flag == 1){
        out=(out * temp) % M
    }
    return out
}

可以看出,以上算法对一个文字的加密或解密计算,最多需要做2log2(e)2log2(e)次乘法运算和求余运算。相比直接计算需要e次乘法简化不少,但相比对称机密算法,仍然相当复杂

RSA 加密算法的安全性能

1、 大整数因子分解的困难

公布的公钥中包含M=nmM=n∗m,计算nmn∗m很简单,但是反过来如果能通过MM分解出n,m,则攻击者可以轻易获得私钥,从而可以解密截获的密文。但是就目前所知,在传统计算机上,大整数的因子分解是NP难题,需要的时间是指数级,可以通过采用更大的素数,已达到防御攻击的目的。
不过在量子计算机面前,这是分解不再是困难的,计算复杂度是多项式的,因此RSA在量子计算机面前不堪一击。

2、 功耗分析

根据上面的加解密计算过程,可以通过功耗分析得到解密秘钥d.原因是算法逐步计算私钥d二进制表示的每一位;当该位为1 时,需要更新out,增加了计算量,与该位为零时计算量不一样;因此通过分析硬件功耗,可以得到解密秘钥d.因此上面的算法是有缺陷的。当然我们可以通过改进算法,混淆功耗以避免被攻击,不过在计算性能上要做出牺牲。

3、暴力推算秘钥

任何人可以获得公钥,然后加密任意的大于1的整数xx,获得密文y=xe(modM),然后循环求解z=yi(modM),fori=1..Mz=yi(modM),fori=1..M,如果计算得到z=xz=x,此时i=di=d获得加密秘钥。
幸运的是,如果我们不知道d,需要计算d次乘法和求余运算,计算量比知道秘钥要困难的多,成指数级增加。
同时当传统计算机变得更强大的时候,我们只需要找到更大的两个素数n,mn,m即可,素数有无穷多,取之不尽,用之不绝。
因此在选择秘钥的时候,d是必要足够大。

4、 密文攻击:

假设攻击者截获密文s,想要解密w=sd(modM)w=sd(modM),因为公钥是公开的,他可以采用如下办法:
1)、 随机选取数 r ,同时计算t=r1(modM)t=r−1(modM)计算y=re(modM)y=re(modM)
2)、 计算z=ysz=y∗s,发给私钥持有者,让其进行签名;
3)、 私钥持有者 对z进行签名u=zd(modM)u=zd(modM),然后发送给攻击者;
4)、攻击者收到uu,可进行tu=r1zd=r1ydsd=r1rsd=sd(modM),从而获得明文;
这个过程需要私钥持有实体进行签名,所以对文件签名时应当保持谨慎;不可以对随机文字签名。

5、小密码

为了计算快捷,一般而言公钥越小计算越快,但是当e太小就会有问题;比如若对于明文wwwe<M,则有s=wes=we即是密文;解密不需要通过计算sd(modM)sd(modM)直接计算ses−e即可获得明文。因此在加密的时候,需要注意e>log2Me>log2M,同时对文件编码的时候,不要采用小数字编码;极端情况下,假如明文是1的时候,密文也是1。

6、 其他攻击方法

共模攻击,比如某个公司,用同样的M,生成了两套秘钥(e1,d1,M),(e2,d2,M)(e1,d1,M),(e2,d2,M)则攻击者在不需要知道d1,d2d1,d2的情况下,可以解密截获的密文,因此,不能用相同的M生成多套秘钥。
Wiener攻击,对e/Me/M进行连分数展开,由于e,Me,M都是整数,其连分数数有限的,并且精确覆盖d/Nd/N,因此可以估计到(d,N)(d,N)从而攻破RSA,Wiener是目前相对有效的攻击;防止办法是e/Me/M小数位足够长。
攻击方法无穷无尽,无法一一列举,就此打住。

使用加密通讯需要懂得

1、 目前所知的无法被攻破加密方法只有一种,一次一密,密文完全随机的,秘钥和明文一样长,难以实用;

2、量子加密算法安全性在于能够及时发现入侵者,对于已经产生的加密密文,有可能被攻破。

3、 其他加密方法都无法证明其安全性,只是知道已知的攻击方法能不能有效;永远不知道有没有未知的攻击方法;也许某些机构已经能够破解加密算法,但是出于某些原因没有公布。

4、 通常的加密算法安全性,只是在某一段有限时间内不能被攻破,比如100年,当人们又能力攻破的时候,解密已经没有意义。

5、 大多数加密通讯,攻击发起在加密算法之外;比如加解密过程时的电磁泄露,攻击密码使用者获得密码,或者截获加密前或解密后的明文消息。很多的泄密出自办公室垃圾桶。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值