RSA加密基础学习笔记

大佬的原文更详细,本人菜鸟记的笔记有瑕疵

一. RSA简介:

RSA是公钥密码体制,是一种使用不同的加密密钥与解密密钥的加密方式,是一种算法,广泛用于现代通讯加密。
RSA涉及三个参数,n,e,d,其中n,d是私钥,n,e是公钥n是两个素数乘积,两个素数一般用p,q表示,e是一个素数,一般选择两个大素数p和q,计算出模数N = p * q,然后计算φ(N) = (p−1) * (q−1) ,即N的欧拉函数,然后选择一个e (1<e<φ(N)),且e和φN互素,取e的模反数为d(逆元)

计算方法: e * d ≡ 1 (mod φ(N))

对明文m进行加密:c=m^e%N  : c = pow(m, e, N),得到的c即为密文 

对密文c进行解密:m=c^d%N : m = pow(c, d, N),得到的m即为明文

私钥d:
  d=gmpy2.invert(e,(p-1)*(q-1))  (python中的gmpy2库)

二. 算法原理

1. 费马小定理:

p为素数,则a^(p-1)=1%p
    dp=d%(p-1)
    dq=d%(q-1)
    d=dp+k(p-1)=dq+k(q-1)

2. 欧拉定理:

a. 欧拉函数:
       任意给定正整数n,计算在小于等于n的正整数之中,有多少个与n构成互质关系?计算这个值         的方法就叫做欧拉函数,以φ(n)表示.
       在RSA算法中,欧拉函数对以下定理成立:
        1.如果n可以分解成两个互质的整数之积,即n=p×q,则有:φ(n)=φ(pq)=φ( p )φ( q );
        2.当p为质数,φ( p )=p-1
        所以有φ(n)=(p-1)(q-1)

b. 欧拉定理与模反元素
    “欧拉定理”指的是:
       如果两个正整数a和n互质,则n的欧拉函数φ(n)可以让下面的等式成立:
        a^φ(n)≡1(modn)
       也就是说,a的φ(n)次方被n除的余数为1

    模反元素的推导过程如下:
      根据欧拉定理,有:
          a^φ(n) = a × a^(φ(n)−1)≡1%n
          令b=a^(φ(n)−1),得:
          ab≡1%n
          b就是a的模反元素
          所以,如果两个正整数a和n互质,那么一定可以找到整数b使得ab-1被n整除,或者说ab被n除的余数是1,所以求私钥d的公式:d*e≡1%(p-1)(q-1),其中{φ(n) = (p-1)(q-1),φ(n) 与e互质,k为正整数}。
推导公式:d*e≡1mod φ(n)
可得:(d*e-1) / φ(n) =k
可化为:d= (k*φ(n)+1)/e

#已知 p,q,dp,dq,c求m的算法:
import gmpy2
I = gmpy2.invert(q,p)
mp = pow(c,dp,p)
mq = pow(c,dq,q)               #求幂取模运算

m = (((mp-mq)*I)%p)*q+mq       #求明文公式

print(hex(m))          #转为十六进制

3. 模运算

    模运算与基本四则运算有些相似,但是除法除外。其规则如下:
     (a + b) % p = (a % p + b % p) % p
     (a - b) % p = (a % p - b % p) % p
     (a * b) % p = (a % p * b % p) % p
     a ^ b % p = ((a % p) ^ b) % p

     结合律 :
     ((a + b) % p + c)%p = (a + (b + c) % p) % p
     ((a * b) % p * c) %p= (a * (b * c) % p) % p

     交换律
     (a + b) % p = (b + a) % p
     (a * b) % p = (b * a) % p

     分配律
     (a + b) % p = (a % p + b % p) % p
     ((a + b) % p * c) % p = ((a * c) % p + (b * c) % p

     重要定理:
     若 a ≡ b (mod p),则对于正整数 c,都有(a**c) ≡ (b**c) (mod p)
     若 a ≡ b (mod p),则对于任意的 c,都有(a + c) ≡ (b + c) (mod p)
     若 a ≡ b (mod p),则对于任意的 c,都有(a * c) ≡ (b * c) (mod p)

     如果ac≡bc (mod m),且c和m互质,则a≡b (mod m)。  '≡'是数论中表示同余的符号  
     同余的定义如下:给定一个正整数m,如果两个整数a和b满足a - b能被m整除,即(a - b)modm=0,
     ps:88 = 12 ·7 + 4   因此88 ≡ 4 mod 12
     那么就称整数a与b对模m同余,记作a ≡ b ( mod m),同时可成立a mod m = b
     [理解:当且仅当c和m互质,c^-1存在,等式左右可同乘模逆。]
     如果a≡b (mod m),a≡b (mod n),且n和m互质,则a≡b (mod mn)


     若 a ≡ b (mod p),c ≡ d (mod p),则
     (a + c) ≡ (b + d) (mod p)
     (a - c) ≡ (b - d) (mod p)
     (a * c) ≡ (b * d) (mod p)
     (a / c) ≡ (b / d) (mod p)

      除法规则:
      在模n意义下,a/b不再仅仅代表这两个数相除,而是指 a+k1*n 和 b+k2*n这两个组数中任意两个相除,使商为整数,因此也就可以理解,除以一个数等价于乘以它的逆
      a/b ≡ c(mod n) <=> a ≡ c*(b^-1) (mod n),其中b模n的逆记作b的负一次方。
      
      逆元:
     a mod p的逆元便是可以使 a * a' mod p = 1 的最小a'

4.拓展欧几里得原理

  对于互素的e1,e2:
     e1*s1+e2*s2=gcd(e1,e2)=1
     m^(e1*s1)*m^(e2*s2)=m^1=(c1^s1)*(c2^s2)

  推导过程:
    式1(加密):c=m^e%N   
    式2(解密):m=c^d%N
    
    式1带入式2:  m=(m^e%N)^d%N
    需要证明 ;m==(m^e%N)^d%N
    => (m^e%N)^d%N => (m^e)^d%N   # 模运算: a ^ b % p = (a % p) ^ d  % p
    => m^(e*d)%N    #幂的乘方,底数不变,指数相乘
    => 将 e * d ≡ 1 (mod φ(N)) 即 e * d = K * φ(N) + 1,K为任意正整数,代入得:(m^(K*φ(N)+1))%N  
    => (m^(K*φ(N)*m^1)%N         # 同底数相乘,指数相加
    => (m^(K*φ(N)*m)%N
    => ((m^φ(N)^K%N*m)%N         # 幂的乘方,底数不变,指数相乘
    => ((m^φ(N)^K%N*m%N)%N         # (a * b) % p = (a % p * b % p) % p
    => ((m^φ(N)%N)^K%N*m%N)%N     # a ^ b % p = ((a % p) ^ b) % p
    => (1^K%N*m%N)%N          # 根据欧拉定理:a^φ(n)≡1 mod n 即 a^φ(n) mod n = 1
    => (m%N)%N             # 1^K%N=1
    => (m%N)%N
    => (m%N)^1%N 
    => (m^1)%N        # a ^ b % p = ((a % p) ^ b) % p 
    => m%N 
    => m    #因为 m < N

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值