题目
已知公开参数:g 和 p分别等于11, 1125899906842679
已知Bob的公钥:B=42548555979246
已知Alice给Bob发的密文:C1 = 459789841564816 , C2 = 885654270236026
求Alice发给Bob的明文。
提示:
1、明文编码方法:https://paste.ubuntu.com/p/J5mkvRBjRd/
实验原理
1、公开参数 g和p
2、私钥:x,公钥:X=g^x
3、加密过程:明文m<p
随机选r<p,算c1 = g^r mod p
接收者公钥为Y,计算k = Y^r
c2 = k * m
解密过程
m = c2 * c1^(-x) mod p
需求解离散对数得出x的值代入公式得出m.
解离散对数
用sagemath
示例
213 mod 23
x=discrete_log(mod(13,23),mod(2,23))
#或discrete_log(13,mod(2,23))
print(x)
python代码:
def encode(s, base=256):
s = str(s) # make input a string
return sum(ord(s[i])*base^i for i in range(len(s)))
def decode(n, base=256):
v = []
while n != 0:
v.append(chr(n % base))
n //= base
return ''.join(v)
def main():
c1=459789841564816
c2=885654270236026
p=1125899906842679
B=42548555979246
y=745029588469182
m=(c2*pow(c1,-y,mod=p))%p
str=decode(m)
print(str)
main()