#n=p和q隨機生成
#課本以兩個字母爲一組,此處以每一個字母爲一組,故必須n=p*q>2
#課本以兩個字母爲一組,此處以每一個字母爲一組,故必須n=p*q>2
import math
import random
dict1={'a':0,'b':1,'c':2,'d':3,'e':4,'f':5,'g':6,'h':7,'i':8,'j':9,'k':10,'l':11,'m':12,'n':13,'o':14,'p':15,'q':16,'r':17,'s':18,'t':19,'u':20,'v':21,'w':22,'x':23,'y':24,'z':25}
import random
dict1={'a':0,'b':1,'c':2,'d':3,'e':4,'f':5,'g':6,'h':7,'i':8,'j':9,'k':10,'l':11,'m':12,'n':13,'o':14,'p':15,'q':16,'r':17,'s':18,'t':19,'u':20,'v':21,'w':22,'x':23,'y':24,'z':25}
#字典鍵值轉換
dict2 = dict(zip(dict1.values(),dict1))
dict2 = dict(zip(dict1.values(),dict1))
#生成100以內的素數數組
def prime_array():
array = []
for i in range(2,1000):
x = prime(i,2)
if x :
array.append(i)
return array
#判斷素數
def prime(n,div):
if math.sqrt(n) < div:
return True
if n % div == 0:
return False
else :
return prime(n,div + 1)
#求最大公約數
def gcd(a,b):
if b == 0:
return a
else :
return gcd(b,a%b)
def gcd(a,b):
if b == 0:
return a
else :
return gcd(b,a%b)
#找出與(p-1)*(p+1)互質的素數e
def co_prime(s):
while True:
e = random.choice(range(100))
x = gcd(e,s)
if x == 1:
break
return e
def co_prime(s):
while True:
e = random.choice(range(100))
x = gcd(e,s)
if x == 1:
break
return e
#找出d
def find_d(e,s):
d = 0
while(True):
d += 1
x = (e * d) % s
if x == 1:
return d
#加密
def encryption(m,ku):
C = pow(m,ku[0]) % ku[1]
return C
#解密
def decode(c,kr):
M = pow(c,kr[0]) % kr[1]
return M
def decode(c,kr):
M = pow(c,kr[0]) % kr[1]
return M
#主函數
if __name__ == '__main__':
# print("字典1:",dict1,"\n"+"字典2",dict2)
print('請輸入明文(只支持小寫字母):')
M = input()
C = ""
iC = []
print("p,q的取值範圍:")
array = prime_array()
print(array)
if __name__ == '__main__':
# print("字典1:",dict1,"\n"+"字典2",dict2)
print('請輸入明文(只支持小寫字母):')
M = input()
C = ""
iC = []
print("p,q的取值範圍:")
array = prime_array()
print(array)
#n不能小於25
while True:
p = random.choice(array)
q = random.choice(array)
n = p * q
if n>25:
break
print('p爲{},q爲{}'.format(p,q))
while True:
p = random.choice(array)
q = random.choice(array)
n = p * q
if n>25:
break
print('p爲{},q爲{}'.format(p,q))
s = (p-1) * (q-1)
e = co_prime(s)
d = find_d(e,s)
KU = [e,n]
KR = [d,n]
#加密結果
for ch in M:
iC.append(encryption(dict1[ch],KU))
for i in iC:
C += str(i)
print("加密後密文爲:",C)
#解密結果
M = ''
for i in iC:
M += dict2[decode(i,KR)]
print('解密後明文爲:',M)
e = co_prime(s)
d = find_d(e,s)
KU = [e,n]
KR = [d,n]
#加密結果
for ch in M:
iC.append(encryption(dict1[ch],KU))
for i in iC:
C += str(i)
print("加密後密文爲:",C)
#解密結果
M = ''
for i in iC:
M += dict2[decode(i,KR)]
print('解密後明文爲:',M)