这次写的有点偷懒…
import random
class RSA:
"""
RSA,一种非对称加密算法,n大小影响加密长度,res%=n
e,d的生成函数写的很粗糙,效果不太理想,仅适合小规模数据
@author ZJH
2021/10/13
"""
def gcd(self, a: int, b: int) -> int:
"""
求最大公约数
:param a:
:param b:
:return:
"""
return self.gcd(b, a % b) if b else a
def generateE(self, target: int) -> int:
"""
生成互素随机数e
:param target:
:return:
"""
ran = target - random.randint(1, target - 1)
for i in range(ran, target):
if self.gcd(target, i) == 1:
return i
for i in range(ran, 1, -1):
if self.gcd(target, i) == 1:
return i
def generateD(self, e: int, nf: int) -> int:
"""
生成数d
:param e:
:param nf:
:return:
"""
i = 1
while i * e % nf != 1 or i == e:
i += 1
return i
def generateKey(self, p: int, q: int) -> tuple:
"""
生成密钥
:param p:
:param q:
:return:
"""
self.n = p * q
nf = (p - 1) * (q - 1)
self.e = self.generateE(nf)
self.d = self.generateD(self.e, nf)
print(f'公钥:({self.n},{self.e})\t'
f'私钥:{self.d}')
return (self.n, self.e, self.d)
def encode(self, target: int, n: int=None, key: int=None) -> int:
if n==None: n=self.n
if key==None: key=self.e
if target>n:
print('该密钥太小,无法得到正确的加密/解密结果')
res=(target ** key) % n
print(f'加密完成,密文:{res}')
return res
def decode(self, target: int, n: int=None, key: int=None) -> int:
if n==None: n=self.n
if key==None: key=self.d
if target>n:
print('该密钥太小,无法得到正确的加密/解密结果')
res=(target ** key) % n
print(f'解密完成,明文:{res}')
return res
def __init__(self, *args, **kwargs):
if args or kwargs:
self.generateKey(*args, **kwargs)
if __name__ == '__main__':
rsa=RSA()
rsa.generateKey(61,53)
# a,b,c=rsa.generateKey(7,17)
C=rsa.encode(666)
P=rsa.decode(C)
print()
# a,b,c=rsa.generateKey(9613034531358350457419158128061542790930984559499621582258315087964794045505647063849125716018034750312098666606492420191808780667421096063354219926661209,12060191957231446918276794204450896001555925054637033936061798321731482148483764659215389453209175225273226830107120695604602513887145524969000359660045617)
# C = rsa.encode(1907081826081826002619041819,115935041739676149688925098646158875237714573754541447754855261376147885408326350817276878815968325168468849300625485764111250162414552339182927162507656772727460097082714127730434960500556347274566628060099924037102991424472292215772798531727033839381334692684137327622000966676671831831088373420823444370953,35535)
print()