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 60 61 62
| import math import random def prime_init(max_num): prime_num=[] for i in range(2,max_num): tmp=0 s=int(math.sqrt(i))+1 for j in range(2,s): if i%j==0: tmp=1 break if tmp==0: prime_num.append(i) return prime_num def key_init(): prime_num=prime_init(500) print(prime_num) while True: string=input("选择两个素数: ").split(' ') p,q=[int(x) for x in string] if (p in prime_num) and (q in prime_num): break else: print("输入错误") N=p*q r=(p-1)*(q-1) r_prime=prime_init(r) r_len=len(r_prime) e=r_prime[random.randint(0,r_len-1)] d=0 for n in range(2,r): if(e*n)%r==1: d=n break return (N,e),(N,d)
def encode(pub_key,m): N,e=pub_key return pow(m,e,N)
def decode(pri_key,m): N,d=pri_key return pow(m,d,N)
pub_key,pri_key=key_init() print('公钥:',pub_key,'\n私钥:',pri_key) m='re100dayzhuji' enc=[encode(pub_key,ord(i)) for i in m] print('加密后:') s1=''.join(f'{x:02x}' for x in enc) print(s1) dec=[chr(decode(pri_key,i)) for i in enc] print('解密后:') s2=''.join(dec) print(s2)
|