密码学-公钥加密算法 RSA

RSA 算法介绍

RSA 算法系统主要包含三个子算法:Gen, Enc, Dec,分别是密钥生成算法、加密算法以及解密算法。

密钥生成

密钥生成的过程如下:

  1. 选取大素数 $p,q$;
  2. 计算 $n=p\cdot q$,此处 $n$ 的位数就是 RSA 密钥的长度,比较稳妥的是2018位;
  3. 计算 $\phi(n)=(p-1) \cdot (q-1)$;
  4. 随机选取 $e$ 使得 $1\le e \le \phi(n)$,并且 $(e, \phi(n))=1$;
  5. 计算$d=e^{-1}\mod \phi(n)$;
  6. 因此,$(e, n)$ 即为 RSA 算法的公钥,$(d, n)$ 即为私钥。

加密

  1. 假设明文为 $m$;
  2. 计算密文 $c=m^e \mod n$。

解密

解密的过程很简单,为:

  1. 给定密文 $c$;
  2. 计算明文 $\hat{m}=c^d \mod n$

算法证明

算法的可行性证明过程如下:

当 $(m,n)=1$ 时,根据欧拉定理很容易知道是对的。如果 $m,n$ 不互质,不妨假设 $m=p\cdot x$,那么有:

再看对于 $q$ 的情况,首先有 $ed-1=h\cdot \phi(n) = h(p-1)(q-1)$

所以就有 $m^{ed} \equiv m \mod n$ 了,因此 RSA 在功能上是正确的。

算法案例

此部分代码在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# @author S.L.

import sympy
import numpy as np


class RSA:
def __init__(self, p=0, q=0, e=0, d=0):
self.__p = p
self.__q = q
self.__n = self.__p * self.__q
self.__phi = (self.__p-1) * (self.__q-1)
self.__e = e
self.__d = d

def generate_key(self, key_bits=10):
# choose p and q, and calculate n and phi
# key_bits = key_bits / 2 # RSA 密钥的位数指的是 n 的位数
self.__p = sympy.ntheory.generate.randprime(2 ** key_bits, 2 ** (key_bits + 1))
self.__q = sympy.ntheory.generate.randprime(2 ** key_bits, 2 ** (key_bits + 1))
self.__n = self.__p * self.__q
self.__phi = (self.__p - 1) * (self.__q - 1)
while True:
# 暴力一点,直接选了一个素数当 e
self.__e = sympy.ntheory.generate.randprime(2, self.__phi)
self.__d = sympy.mod_inverse(self.__e, self.__phi)
if sympy.gcd(self.__e, self.__phi) == 1:
break

def encrypt(self, m):
# todo: 未加速,速度很慢
return m**self.__e % self.__n

def decrypt(self, c):
# todo: 未加速,速度很慢
return c**self.__d % self.__n

def get_public_key(self):
return self.__e, self.__n

def get_private_key(self):
return self.__d, self.__n

def __str__(self):
return "ttt"

def is_validate(self):
# todo: 检测当前参数是否合规
return True


rsa = RSA()
rsa.generate_key()

x = 12
y = rsa.encrypt(x)
print("the encrypted number is: ", y)
x = rsa.decrypt(y)
print("the decrypted result is: ", x)

运行结果为:

1
2
the encrypted number is:  371257
the decrypted result is: 12

本篇内容到这里就结束了,若想知道更多和信息安全有关的技术可在公众号留言。识别以下二维码可以成为本公众号的小粉丝,关注更多前沿技术。

微信公众号

Thanks for rewarding