密钥生成
1,选取大素数p(采用Miller和Rabin素数测试快速得到),g属于Zp是一个本原元,公开p和g。
#!!!!!这里Zp 指的是p的素数域 ,即比p小的与它互素的数的集合
求一素数最小生成元的代码:
temp = input('请输入素数p:')
p = int(temp)
p_need = list(range(1,p))
c = [] #存放某一元的集合,用来判断与p_need是否相同
d = list(range(1,p))
e = list(range(p-1))
for i in range(0,p):
for j,z in zip(d,e):
temp = (i ** j)%p
c.append(temp)
c.sort()
if c == p_need:
print('最小生成元为: ',i)
break
c = []
2,随机选取整数k, 1<=x<=p-2,计算y = g^x mod p
3,公钥为y,私钥为k
加密过程
A选取随机数r∈Zp−1,对明文加密Ek(m,r)=(y1,y2) 。
其中y1≡grmod p,y2≡m*yrmod p。
解密过程
Dk(y1,y2)=(y2(y1k)−1)modp≡m(gk)r(grk)−1≡m mod p