def__generateRSAParams(self) -> RSAParams: """Generate parameters for RSA Returns: RSAParams: instance of RSAParams """ # 产生两个大素数 from Crypto.Util import number p : int = number.getPrime(10) q : int = number.getPrime(10)
# p 与 q 不能相等 while q == p: q : int = number.getPrime(10)
# N = p x q N : int = p * q
# phi(N) phiN : int = (p - 1) * (q - 1)
# 取公钥参数 e,e 应小于 phi(N) 且与 phi(N) 互质 # 一种简单的思路是找到一个质数 e,只要 phi(N) 不是它的倍数即可 e : int = number.getPrime(16) while phiN % e == 0: e : int = number.getPrime(16)
# 使用扩展欧几里得算法求解 e 的模逆元 d _, d, _ = self.__exgcd(e, phiN)
# 如果计算得到的 d 是负数,则加上 phi(N) 将其转为正数,仍然与 phi(N) 保持同余关系 if d < 0: d = d + phiN
return self.RSAParams(p, q, N, phiN, e, d)
def__exgcd(self, a, b): """扩展欧几里得算法 Args: a (int): a b (int): b Returns: int: (gcd, x, y) """ ri :int = a rj :int = b si :int = 1 sj :int = 0 ti :int = 0 tj :int = 1
while rj != 0: qi = ri // rj
rtemp = rj rj = ri - qi * rj ri = rtemp
stemp = sj sj = si - qi * sj si = stemp
ttemp = tj tj = ti - qi * tj ti = ttemp return ri, si, ti
defencrypt(m, publicKey) -> int: """encrypt message using public key Args: m (int): origin message m publicKey (Tuple[int, int]): (N, e) Returns: int: encrypted message c """ N, e = publicKey c = m ** e % N return c
defdecrypt(c, privateKey) -> int: """decrypt message using private key Args: c (int): encrypted message c privateKey (Tuple[int, int]): (N, d) Returns: int: origin message m """ N, d = privateKey m = c ** d % N return m