夜深人静写算法(三十五)- RSA 加密解密

博客主页:https://blog.csdn.net/WhereIsHeroFrom
欢迎各位 点赞 ⭐收藏 评论,如有错误请留言指正,非常感谢!
本文由 英雄哪里出来 原创,转载请注明出处,首发于 CSDN
作者的专栏:
  C语言基础专栏《光天化日学C语言》
  算法进阶专栏《夜深人静写算法》
  奇奇怪怪的专栏《学姐教我写代码》

文章目录

  • 一、前言
  • 二、加密算法概述
    • 1、加密与解密
    • 2、明文和密文
    • 3、加密的密钥
    • 4、对称与非对称
  • 三、RSA算法流程
    • 1、算法原理
    • 2、公钥和私钥的生成
    • 3、RSA 加密
    • 4、RSA 解密
  • 四、RSA算法证明
    • 1、私钥解密证明
      • 1)x 和 n 互素
      • 2)x 和 n 不互素
    • 2、安全性证明

一、前言

  如果对 欧拉函数、欧拉定理、逆元都已经理解了,那么 RSA 加密和解密的原理就很简单了。这一章我们就来探讨一下 RSA 算法加密和解密的原理。
  精通 RSA 的实现原理,让面试你的面试官大吃一惊!夜深人静写算法(三十五)- RSA 加密解密_第1张图片

二、加密算法概述

1、加密与解密

  • 加密是以某种特定的算法,改变原有的数据信息,使得未授权的用户即使获得了加密后的数据,但因不知解密的方法(确切的说是不知道密钥),仍然无法了解其信息内容。而解密则是加密的逆过程。

2、明文和密文

  • 我们称尚未加密的数据为明文,通过固定算法加密后的数据为密文。图二-2-1为加密过程,图二-2-2为解密过程。
    图二-2-1

    图二-2-2

3、加密的密钥

  • 密钥是一种参数,它是在明文转换为密文或密文转换为明文时算法的输入参数。可以理解成密码的钥匙。

4、对称与非对称

  • 常见的数字加密方式分为两类:对称加密 和 非对称加密。

对称加密

  • 对称加密算法中,数据发送方将明文和密钥一起经过特殊加密算法处理成密文后,将它发送出去。接收方收到密文后,若想解读原文,则需要使用加密用到的相同密钥及相同算法的逆算法对密文进行解密,才能使其恢复成原文。
  • 它的最大优势是加/解密速度快,适用于大数据量进行加密,缺点是密钥管理困难,最典型的问题就是如何同步这个密钥,同步过程如果在公网上,不进行加密是可以抓包拿到的,那么这里就遇到了要对密钥加密的问题。
  • 常见的对称加密算法有 AESDESBlowfish 等等。
  • 对称加密的核心是只有一把密钥。
    夜深人静写算法(三十五)- RSA 加密解密_第2张图片
图二-4-1

非对称加密

  • 非对称加密算法中,有两个密钥:公钥和私钥。它们是一对,如果用公钥进行加密,只有用对应的私钥才能解密;如果用私钥进行加密,只有用对应的公钥才能解密。
  • 非对称加密算法实现机密信息的交换过程为:甲方生成一对密钥并将其中一个作为公钥向其他方公开;得到该公钥的乙方使用该密钥对机密信息进行加密后发送给甲方;甲方再用自己的另一个专用密钥对加密后的信息进行解密。
  • 最有名的非对称加密算法当属 RSA 了,本文将对 RSA 算法的加/解密过程进行详细剖析。
  • 非对称加密拥有两把密钥。
    图二-4-2

三、RSA算法流程

1、算法原理

  • 算法本身基于一个简单的数论知识:给出两个素数,很容易将它们相乘,然而给出它们的乘积,想得到这两个素数就显得尤为困难。如果能够解决大整数(比如几百位的整数)分解的快速方法,那么 RSA 算法将轻易被破解。

2、公钥和私钥的生成

R S A RSA RSA 算法由两个密钥,即公钥和私钥组成。
  1)准备两个非常大的素数 p p p q q q(转换成二进制后 1024 1024 1024 个二进制位或者更多,位数越多越难破解);
  2)利用字符串模拟计算大素数 p p p q q q 的乘积 n = p q n=pq n=pq
  3)同样方法计算 m = ( p − 1 ) ( q − 1 ) m=(p-1)(q-1) m=(p1)(q1),这里的 m m m n n n 的欧拉函数;
  4)找到一个数 e ( 1 < e < m ) e(1 \lt e \lt m) e(1<e<m),满足 g c d ( m , e ) = 1 gcd(m, e)=1 gcd(m,e)=1(即 e e e m m m 互素);
  5)计算 e e e 在模 m m m 域上的逆元 d d d(即满足 e d   m o d   m = 1 ed \ mod \ m = 1 ed mod m=1);
  6)至此,公钥和私钥生成完毕: ( n , e ) (n, e) (n,e) 为公钥, ( n , d ) (n, d) (n,d) 为私钥;

3、RSA 加密

  • 对于明文 x x x,用公钥 ( n , e ) (n,e) (n,e) x x x 加密的过程,就是将 x x x 转换成数字(字符串的话取其 ASCII码或者 unicode 值),然后通过幂取模计算出 y y y,其中 y y y 就是密文;
  • y = x e   m o d   n y = x^e \ mod \ n y=xe mod n

4、RSA 解密

  • 对于密文 y y y,用私钥 ( n , d ) (n,d) (n,d) y y y 进行解密的过程和加密类似,同样是计算幂取模;
  • x = y d   m o d   n x = y^d \ mod \ n x=yd mod n

四、RSA算法证明

1、私钥解密证明

我们要做的就是证明密文经过私钥的幂取模的结果等于明文,即如下等式成立: x = y d   m o d   n x = y^d \ mod \ n x=yd mod n

证明

  • 根据加密算法得到的密文 y y y,一定满足如下等式:
  • y = x e   m o d   n y = x^e \ mod \ n y=xe mod n

1)x 和 n 互素

  • 这种情况,我们主要用欧拉定理就可以证明,证明过程如下:
  • y d   m o d   n = x e d   m o d   n ( 1 ) = x k m + 1   m o d   n ( 2 ) = ( x m   m o d   n ) k x   m o d   n ( 3 ) = ( x ϕ ( n )   m o d   n ) k x   m o d   n ( 4 ) = x   m o d   n ( 5 ) \begin{aligned} y^d \ mod \ n &= x^{ed} \ mod \ n & (1)\\ &= x^{km+1} \ mod \ n & (2)\\ &= (x^m \ mod \ n)^k x \ mod \ n & (3)\\ &= (x^{\phi(n)} \ mod \ n)^k x \ mod \ n & (4)\\ &= x \ mod \ n & (5) \end{aligned} yd mod n=xed mod n=xkm+1 mod n=(xm mod n)kx mod n=(xϕ(n) mod n)kx mod n=x mod n(1)(2)(3)(4)(5)
  • ( 1 ) (1) (1) 等式两边同时取 d d d 次幂,再取模;
  • ( 2 ) (2) (2) e e e d d d 在模 m m m 的域上互为逆元,所以 e d = k m + 1 ed = km+1 ed=km+1
  • ( 3 ) (3) (3) 乘法取模的结合律;
  • ( 4 ) (4) (4) m m m n n n 的欧拉函数,即 m = ϕ ( n ) = ϕ ( p ) ϕ ( q ) m = \phi(n) = \phi(p)\phi(q) m=ϕ(n)=ϕ(p)ϕ(q)
  • ( 5 ) (5) (5) 由于 x x x n n n 互素,所以根据欧拉定理,有 x ϕ ( n )   m o d   n = 1 x^{\phi(n)} \ mod \ n = 1 xϕ(n) mod n=1,直接代入得证;

2)x 和 n 不互素

  • x x x n n n 不互素时,由于 n = p q n = pq n=pq,所以 x x x 要么是 p p p 的倍数,要么是 q q q 的倍数,但是不可能同时是两者的倍数,因为这样一来, x e   m o d   n = 0 x^e \ mod \ n = 0 xe mod n=0,就无法加密了。
  • 那么,我们假设 x = x ′ p x = x'p x=xp,这里显然 g c d ( x , q ) = 1 gcd(x, q) = 1 gcd(x,q)=1,并且可以得到 q x   m o d   n = 0 qx \ mod \ n = 0 qx mod n=0
  • 根据欧拉定理,有:
  • x ϕ ( q ) ≡ 1 ( m o d   q ) x^{\phi(q)} \equiv 1 (mod \ q) xϕ(q)1(mod q)
  • 由于 e d   m o d   m = 1 ed \ mod \ m = 1 ed mod m=1,所以我们可以令 e d = k m + 1 = k ϕ ( p ) ϕ ( q ) + 1 ed = km + 1 = k\phi(p)\phi(q) + 1 ed=km+1=kϕ(p)ϕ(q)+1
  • 对欧拉定理的同余式两边同时乘上 k ϕ ( p ) k\phi(p) kϕ(p),则有:
  • x k ϕ ( p ) ϕ ( q ) ≡ 1 ( m o d   q ) x^{k\phi(p)\phi(q)} \equiv 1 (mod \ q) xkϕ(p)ϕ(q)1(mod q)
  • 则:
  • x k ϕ ( p ) ϕ ( q ) = i q + 1 x^{k\phi(p)\phi(q)} = iq + 1 xkϕ(p)ϕ(q)=iq+1
  • 于是可以推导出如下等式:
  • y d   m o d   n = x e d   m o d   n ( 1 ) = x k m + 1   m o d   n ( 2 ) = x k ϕ ( p ) ϕ ( q ) x   m o d   n ( 3 ) = ( i q + 1 ) x   m o d   n ( 4 ) = ( i q x + x )   m o d   n ( 5 ) = x   m o d   n ( 6 ) \begin{aligned} y^d \ mod \ n &= x^{ed} \ mod \ n & (1)\\ &= x^{km+1} \ mod \ n & (2)\\ &= x^{k\phi(p)\phi(q)}x \ mod \ n & (3)\\ &= (iq+1)x \ mod \ n & (4)\\ &= (iqx + x) \ mod \ n & (5)\\ &= x \ mod \ n & (6) \end{aligned} yd mod n=xed mod n=xkm+1 mod n=xkϕ(p)ϕ(q)x mod n=(iq+1)x mod n=(iqx+x) mod n=x mod n(1)(2)(3)(4)(5)(6)
  • ( 1 ) (1) (1) ( 2 ) (2) (2) 上文已经做了解释;
  • ( 3 ) (3) (3) m m m n n n 的欧拉函数,即 m = ϕ ( n ) = ϕ ( p ) ϕ ( q ) m = \phi(n) = \phi(p)\phi(q) m=ϕ(n)=ϕ(p)ϕ(q)
  • ( 4 ) (4) (4) 代入上文推出的公式;
  • ( 5 ) (5) (5) 模乘分配率;
  • ( 6 ) (6) (6) 由于 q x   m o d   n = 0 qx \ mod \ n = 0 qx mod n=0,所以 i q x iqx iqx 一定是 n n n 的倍数,可以消去;

2、安全性证明

  • 最后来看下 RSA 算法为何安全,全程六个数字:
  • p 、 q 、 n 、 ϕ ( n ) 、 e 、 d p、q、n、\phi(n)、e、d pqnϕ(n)ed
  • 而对于外界来说,知道的只有公钥 ( n , e ) (n, e) (n,e),如何通过这两个已知数得到明文?
  • 1)首先,明文需要密文的 d d d 次幂模上 n n n 来计算,所以首先要知道 d d d
  • 2) d d d e e e ϕ ( n ) \phi(n) ϕ(n) 的逆元,如果知道 ϕ ( n ) \phi(n) ϕ(n),则能够通过扩展欧几里德算法计算出 d d d
  • 3) ϕ ( n ) = ( p − 1 ) ( q − 1 ) \phi(n)=(p-1)(q-1) ϕ(n)=(p1)(q1),其中 p p p q q q 均为素数,只有得知 p p p q q q 的值才能计算出 ϕ ( n ) \phi(n) ϕ(n)
  • 4) n = p q n=pq n=pq n n n 已知,所以如果能够分解 n n n,则 p p p q q q 就能被计算出来。
  • 综上所述,破解 RSA 的难点在于对 n n n 的因数分解,然而大整数的因数分解暂时没有高效的算法。

  • 关于 RSA 的内容到这里就结束了,如果还有不懂的问题可以留言告诉作者。

你可能感兴趣的:(《夜深人静写算法》,算法,密码学,加密解密,RSA,夜深人静写算法)