RSA非对称密码算法学习笔记

学习来源:B站up:DoraHcaks

学习路径:密码学7.1|RSA非对称密码算法_哔哩哔哩_bilibili

1.基础数学知识

1.1欧几里得辗转相除法

假设正整数a≥b,求a和b的最大公因数gcd(a, b) = ?

        (1)如果a mod b = 0, 即余数 r = 0,则gcd(a, b) = b

        (2)否则,令 r = a mod b,gcd(a, b) = gcd(b, r),递归直至 r = 0,满足情况(1)

举例:a = 254, b = 8

        254 = 8 * 31 + 6,r = 6 ≠ 0 => gcd(254, 8) = gcd(8, 6)

            8 = 6 * 1 + 2,  r = 2 ≠ 0 =>     gcd(8, 6) = gcd(6, 2)

            6 = 2 * 3,        r = 0 = 0 => gcd(254, 8) = gcd(8, 6) = gcd(6, 2) = 2

多项式时间内可解的问题(P问题)

已知大合数a,求小于a的大素数b,使得a与b互素,即gcd(a, b) = 1。

该问题能够使用欧几里得辗转相除法快速求解。

        随机选择一个大素数b,如果即gcd(a, b) ≠ b,则gcd(a, b) = 1

        因此,这样的大素数有很多,且很容易找。

1.2 因子分解困难问题

大数的因子分解问题,非常困难!

初始化:随机选择2个不同的大素数p, q,计算n = p * q。

        公开 n,求p, q

举例1:素数p = 5,q = 7,计算n = p * q = 35.

        已知:n = 35,求p, q

        答:暴力搜索,令p, q = 2, 3 ....

举例2:保密数据p, q,公开数据n

        公开 n = 8239121061250502943937 = p * q

for(i >= 2 && i <= √n) {
    for(j >= 2 && j <= √n) {
        if (8239121061250502943937 == i * j) {
            System.out.println(i, j);
        }
    }
}

如果是2048bit的大整数,n = _{}2^{2048}- 110 + 1,则计算机需要100年以上时间破解。不可行。

因子分解是NP问题:求解时,需要for循环,暴力搜索,需要指数时间;但是,一旦已知解,则可以快速验证解的正确性

1.3 费马小定理

若p为素数,a是正整数且不能被p整除,互素(互质),则

3^{7-1}\equiv 1 mod 7

注:证明视频里有,如果有需要可以去视频学习,这里省去

举例3:p = 7, a = 3,3不能被7整除,根据费马小定理

3^{7-1}\equiv 1 mod 7

公式推导:

3^{6}mod 7=(3*3)(3*3)(3*3)mod7 = 9*9*9mod7=729mod7=1

 举例4:p = 11, a = 5,5不能被11整除,根据费马小定理

5^{11-1}\equiv 1 mod 11

公式推导:

5^{10} mod 11=9765625mod11=1

1.4 欧拉函数

小于n,且与n互素的正整数个数,记为\varphi (n),习惯上\varphi (1) = 1

结论:如果n是素数,则\varphi (n)=n-1

推论:如果有两个素数p, q,且p ≠ q,对于n = p * q,有\varphi (n)=\varphi (p)\cdot \varphi (q),则

\varphi (n)=(p-1)\cdot (q-1)

费马小定理: 若p为素数,a是正整数且不能被p整除,互素(互质),则

3^{7-1}\equiv 1 mod 7

欧拉定理:对任意互素的a和n,则有

a^{\varphi (n)}\equiv 1modn

欧拉定理中,n可以是合数,a是素数,或a与n互素也可以。

因此,欧拉定理是费马小定理的扩展一般化

举例5:n = 7, a = 3,互素,则

3^{\varphi (7)}mod7=3^{6}mod7=729mod7=1

3^{\varphi (7)+1}mod7=3^{6+1}mod7=3^{6}*3^{1}mod7=1*3^{1}=3

3^{\varphi (7)+\varphi (7)+1}mod7=3^{6+6+1}mod7=729*729*3mod7=1*1*3=3

一般化:

3^{k\cdot \varphi (7)+1}mod7=3^{1}mod7=3,k=0,1,2...

再一般化:

3^{k\cdot \varphi (7)+r}mod7=3^{r}mod7,k=0,1,2...

关键结论:指数部分超过\varphi (n),则是多余的,所以指数部分能够模\varphi (n)

举例6:n = 7, a = 3,互素,计算3^{601}mod73^{1025}mod7

3^{601}mod7 = 3^{(600+1)}mod7=3^{1}mod7=3

3^{1025}mod7=3^{170*6+5}mod7=3^{5}mod7=243mod7=5

 欧拉定理:对任意互素的a和n,则有

a^{\varphi (n)}\equiv 1modn

 欧拉定理扩展:

a^{k\cdot \varphi (n)}\equiv 1modn

a^{k\cdot \varphi (n)+1}\equiv amodn

1.5 模反元素的存在性

如果大素数a和大合数π,a与π互素,则一定可以找到整数b,使得ab\equiv1mod\pi,则称b是a的模反元素。

证明:使用欧拉定理

a^{\varphi (\pi)}\equiv 1mod\pi

,则

a^{1+\varphi (\pi)-1}\equiv 1mod\pi

,则

a\cdot a^{\varphi (\pi)-1}\equiv 1mod\pi

,则

b= a^{\varphi (\pi)-1}

符号替换:

ab\equiv1mod\pi

sk\cdot pk\equiv1mod\varphi (n)

a = sk,b = pk,π = \varphi (n)\varphi (n)为大合数,sk为大素数,使用欧几里得辗转相除法,可以快速测试sk与大合数\varphi (n)互素。如果不是互素就换一个sk,总能找到一个符合的sk。

模反元素存在性的等价描述

 如果大素数sk和大合数\varphi (n)互素,则一定可以找到整数pk,使得

sk\cdot pk\equiv1mod\varphi (n)

,则称pk是sk的模反元素,则

pk= sk^{\varphi (\varphi (n))-1}

已知p, q,n = p * q,\varphi (n)=(p-1)\cdot (q-1),将合数(p-1)(q-1)因子分解,

        求 \varphi (\varphi (n))=\varphi ((p-1)(q-1))比较简单

因此,已知大素数sk和大合数\varphi (n)互素,可以快速求出pk= sk^{\varphi (\varphi (n))-1}

反之,已知pk和n,不知道因子分解p, q,则无法快速求\varphi (n),从而无法快速计算sk

无法快速计算的理由:pk= sk^{\varphi (\varphi (n))-1}是一个等式,2个未知数\varphi (n)和sk

转化等价:ab\equiv1mod\pi<=> pk\cdot sk\equiv1mod\varphi (n) <=> pk\cdot sk\ = k*\varphi (n) +1

选择随机数m,计算:

(m^{pk})^{sk}=(m^{sk})^{pk}=(m^{pk\cdot sk})modn=m^{k\cdot \varphi (n)+1}modn=m

2 RSA加密与签名

2.1 RSA算法原理(参考《加密解密(第4版)》)

        (1) 选择两大素数p和q,为了获取最高的安全性,设两数的长度一样

        (2) 计算 n = p * q,n 称为模

        (3) 计算欧拉函数:\varphi (n)=(p-1)\cdot (q-1)

        (4) 选取加密密钥e,其与\varphi (n)互素。如果选择的e值合适,RSA加解密的速度将会加快。e的值常为3、17和65537(2^{16}+1)

        (5) 使用扩展欧几里得算法求出e模的\varphi (n)逆元d,即

d\cdot e\equiv1mod\varphi (n)

       (6) 密钥为 e 和 n,私钥为 d和n,p, q可以丢弃,但是必须保密

       (7) 加密消息m时,将其看成一个大整数,并把它分成比n小的数据分组,按下面的式子进行加密:

c_{i}\equiv m_{i}^{e}modn

       (8) 解密密文c时,取每一个加密后的分组c_{i}并计算,即:

m_{i}\equiv c_{i}^{d}modn

应用场景1:RSA公钥加密

(m^{pk})^{sk}=m^{pk\cdot sk}modn=m^{k\cdot \varphi (n)+1}modn=m

已知:Alice拥有公开数据是:pk公钥;保密数据是:sk私钥。

需求:Bob需要将保密数据m发送给Alice。

解决方案:

        步骤1:公钥对数据加密。Bob加密Cm^{pk}modn,将C发送给Alice

        步骤2:私钥对数据解密。接收方Alice解密m←(C)^{sk}modn,从C中计算出保密数据m

公式推导:

              (C)^{sk}modn=(m^{pk}modn)^{sk}modn=m^{pk\cdot sk}modn=m^{k\cdot \varphi (n)+1}modn=m

 应用场景2:RSA数字签名

(m^{sk})^{pk}=m^{pk\cdot sk}modn=m^{k\cdot \varphi (n)+1}modn=m

已知:Alice拥有公开数据是:pk公钥;保密数据是:sk私钥。

需求:Alice需要花费金额m。

解决方案:

        步骤1:Alice签名。\sigma \leftarrow m^{sk}modn公开(m,\sigma ,pk)

        步骤2:任何人均可校验。m==(\sigma)^{pk}modn

公式推导:

               (\sigma)^{pk}modn=(m^{sk}modn)^{pk}modn=m^{pk\cdot sk}modn=m^{k\cdot \varphi (n)+1}modn=m

举例7:选择两个素数p = 17, q = 11,计算 n = p * q = 17 * 11 = 187

        计算欧拉函数\varphi (n)=(p-1)\cdot (q-1) = 16 * 10 = 160

        选择一个随机数e,e小于\varphi (n),且与\varphi (n)互素,gcd(e,\varphi(n))=1

        选择e = 7满足条件,计算模反元素d,满足d\cdot e\equiv1mod\varphi (n),且d小于\varphi (n)

        则模反元素d = 23。因为23 * 7 = 161 mod (160) = 1

        公钥为:(e, n) = (7, 187);私钥为:(d, n) = (23, 187)

        私钥为:(e, n) = (7, 187);公钥为:(d, n) = (23, 187)

对于任意一个消息m = 88的RSA加密:

        加密:c = m^{e}modn=88^{7}mod187=11

        解密:m = c^{d}modn=11^{23}mod187=88

(m^{pk})^{sk}=(m^{sk})^{pk}=(m^{pk\cdot sk})modn=m^{k\cdot \varphi (n)+1}modn=m

计算过程:

                88mod187=88

                88^2{}mod187=7744mod187=77

                88^{4}mod187=77^{2}mod187=132

                88^{7}mod187=(88*77*132)mod187=894432mod187=1

对该消息m = 88的RSA签名:        

        签名:\sigma =m^{d}modn=88^{23}mod187

        验证:m==\sigma ^{e}

你可能感兴趣的:(学习,笔记)