RSA加密

840 阅读1分钟
  • 取模运算mod 取余运算%

  • 原根:

    • 原根是一种数学符号,设m是正整数,a是整数,若am的阶等于φ(m),则称a为模m的一个原根 (其中φ(m)表示m的欧拉函数)
    • 假设一个数gP的原根,那么g^i mod P的结果两两不同,且有 1<g<P0<i<P,归根到底就是g^(P-1) = 1 (mod P)当且仅当指数为P-1的时候成立 (这里P是素数)
    • 简单来说,g^i mod p ≠ g^j mod p p为素数),其中i≠ji, j介于1(p-1)之间,则gp的原根
    • 例:3^x mod 17 = y,此时3 < 1717为质数,那么x的取值范围为1~16时,结果y的范围也是1~16x != y3即是17的原根
  • 欧拉函数 φ

    • 互质:如果两个正整数,除了1以外,没有其他公约数,那么这两个数就为互质关系
    • 求小于等于n且与n互质的数有多少个的函数,称为欧拉函数,表示为φ(n)
    • 例如φ(8) = 4,即1,3,5,7φ(7) = 6,即1,2,3,4,5,6
  • 欧拉函数特点

    • n是质数的时候,φ(n) = n - 1
    • 如果n可以分解成两个互质的整数之积,如n = A * B,则:φ(A*B) = φ(A) * φ(B)
    • 根据以上两点得到:如果N是两个质数P1P2的乘积,则φ(N) = φ(P1) * φ(P2) = (P1 - 1) * (P2 - 1)
  • 欧拉定理

    • 如果两个正整数mn互为质数,那么mφ(n)次方减1可以被n整除,即m^φ(n) mod n ≡ 1
    • 费马小定理:欧拉定理的特殊情况,如果两个正整数mn互为质数,且n也为质数,那么φ(n)的结果就是n - 1,即m^(n-1) mod n ≡ 1
  • 公式转换

1^k ≡ 1 1 * m ≡ m
∴ m ^ φ(n) mod n ≡ 1
∴ m ^ k * φ(n) mod n ≡ 1
∴ m ^ k * φ(n) + 1 mod n = m (等号左右两边都乘以m)
  • 模反元素

    • 如果两个正整数ex互质,那么一定可以找到整数d,使得ed - 1x整除,那么d就是e对于x的模反元素。
e * d mod x ≡ 1
e * d = kx + 1 (ed是x的倍数加1)
m ^ ed mod n ≡ m
- 最终推导出`m ^ ed mod n = m` (见6.公式转换,此时`e``φ(n)`互质,`d``e`相对于`φ(n)`的模反元素)
- 特性:只要`d``e`相对于`φ(n)`的模反元素,那么`m``n`可以不是互质关系,只要`m < n`,等式即可成立。
  • 迪菲赫尔曼秘钥交换

    • m ^ ed mod n ≡ m公式继续推演(d是e对φ(n)的模反元素)
    • --> m ^ e mod n = C 即加密,e&n是公钥
    • --> C ^ d mod n = m 即解密,d&n是私钥
    • 同理m ^ d mod n = C C ^ e mod n = m,即e & d既可以加密,也可以解密。
  • 终端体验RSA

    • openssl genrsa -out private.pem 1024 生成长度为1024bit的RSA私钥
    • openssl rsa -in private.pem -pubout -out public.pem 从私钥中提取公钥
    • openssl rsa -in private.pem -text -out private.txt 将私钥转成明文进行查看
    • openssl rsautl -encrypt -in msg.txt -inkey public.pem -pubin -out encrypt.txt 用公钥将msg.txt文件加密为enctypt.txt
    • openssl rsautl -decrypt -in encrypt.txt -inkey private.pem -out decrypt.txt 用私钥将encrypt.txt解密为decrypt.txt
  • 生成证书

    • openssl req -new -key private.pem -out rsacert.csr 请求csr证书
    • openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt 用csr请求crt证书
    • openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt 导出p12证书
    • openssl x509 -outform der -in rsacert.crt -out rsacert.der 导出der证书
    • iOS代码实现RSA加密与解密,der证书即为私钥,p12即为公钥