所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密。
但是对于其原理大部分同学应该都是一知半解,今天就来分析下经典的非对称加密算法 - RSA算法。
通过本文的分析,可以更好的理解非对称加密原理,可以让我们更好的使用非对称加密技术。

RSA算法原理

RSA算法的基于这样的数学事实:两个大质数相乘得到的大数难以被因式分解。
如:有很大质数p跟q,很容易算出N,使得 N = p * q,
但给出N, 比较难找p q(没有很好的方式, 只有不停的尝试)

下面来看看数学演算过程

  1. 选取两个大质数p,q,计算N = p q 及 φ ( N ) = φ (p) φ (q) = (p-1) * (q-1)

三个数学概念:
质数(prime numbe):又称素数,为在大于1的自然数中,除了1和它本身以外不再有其他因数。
互质关系:如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。
φ(N):叫做欧拉函数,是指任意给定正整数N,在小于等于N的正整数之中,有多少个与N构成互质关系。

如果n是质数,则 φ(n)=n-1。
如果n可以分解成两个互质的整数之积, φ(n) = φ(p1p2) = φ(p1)φ(p2)。即积的欧拉函数等于各个因子的欧拉函数之积。

    好的,在这里我们实现一下判断质数以及两个数互质的代码实现:

    判断质数:

bool prime(int x)
{
    int k=sqrt(x);
    for(int i=2;i<k+1;i++)
    {
        if(x%i==0)
        {
            return false;
        }
    }
    return true;
}

如何识别rsa加密算法中超大素数 rsa加密算法数学原理_随机数

关于sqrt()的算法我也写过,Leetcode 69. Sqrt(x)开平方 

判断两个数互质,也就是意味着两个数的最大公约数是1

int gcd(int a,int b)
{
    while(y!=0)
        {
            int t=x%y;
            x=y;
            y=t;
        }
        return x;
}
  1. 选择一个大于1 小于φ(N)的数e,使得 e 和 φ(N)互质

e其实是1和φ(N)之间的一个质数

  1. 计算d,使得de=1 mod φ(N) 等价于方程式 ed-1 = k φ(N) 求一组解。

(N, e)封装成公钥,(N, d)封装成私钥。

假设m为明文,加密就是算出密文c:m^e mod N = c (明文m用公钥e加密并和随机数N取余得到密文c)

解密则是:c^d mod N = m (密文c用密钥解密并和随机数N取余得到明文m) 

私钥解密这个是可以证明的,这里不展开了。

加解密步骤

 

声明:本篇博客大部分内容都是参考资料1的,但是又加上了参考文献2

具体还是来看看步骤,举个例子,假设Alice和Bob又要相互通信。

  1. Alice 随机取大质数P1=53,P2=59,那N=53*59=3127,φ(N)=3016
  2. 取一个e=3,计算出d=2011。
  3. 只将N=3127,e=3 作为公钥传给Bob(公钥公开)
  4. 假设Alice需要加密的明文m=89,s = 89^2011 mod 3127=545,于是Alice传回s=545。 (公钥加密过程)
  5. Bob使用s^e mod N = 545^3 mod 3127,就能得到明文m=89。 (私钥解密过程)

假如攻击者能截取到公钥n=3127,e=3及密文s=545,是仍然无法不通过d来进行密文解密的。

安全性分析

那么,有无可能在已知n和e的情况下,推导出d呢?

如何识别rsa加密算法中超大素数 rsa加密算法数学原理_如何识别rsa加密算法中超大素数_02

        如果n可以被因数分解,d就可以算出,因此RSA安全性建立在N的因式分解上。大整数的因数分解,是一件非常困难的事情。只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。

 

下一篇博客介绍的内容就是ECC加密算法