用Python代码计算离散对数的问题

用Python代码计算离散对数的问题,python,logarithm,Python,Logarithm,我有一组对数,分别是L1、L2和L3,我从超安全路由器到路由器自发密钥交换系统(2015)的论文中检索到了它们。 本文的目的是在Alice和Bob之间安全地共享密钥。例如,Alice向Bob发送了K=46。鲍勃从爱丽丝那里收到了钥匙。密钥可以表示为: 需要使用三阶段流程共享密钥。L1:爱丽丝对鲍勃说。L1:鲍勃对爱丽丝说。L3:Alice对Bob。方程式为: Bob可以使用以下方法评估密钥: 这是方程式的结果: 给定alpha=5,x=15和p=97的值。在Python中实现后,我得

我有一组对数,分别是L1、L2和L3,我从超安全路由器到路由器自发密钥交换系统(2015)的论文中检索到了它们。 本文的目的是在Alice和Bob之间安全地共享密钥。例如,Alice向Bob发送了
K=46
。鲍勃从爱丽丝那里收到了钥匙。密钥可以表示为:

需要使用三阶段流程共享密钥。L1:爱丽丝对鲍勃说。L1:鲍勃对爱丽丝说。L3:Alice对Bob。方程式为:

Bob可以使用以下方法评估密钥:

这是方程式的结果:

给定
alpha=5
x=15
p=97
的值。在Python中实现后,我得到了错误的结果,这与表中的结果不同:

a=5
x=15
p=97
i1=0.958478
i2=4.238835

L1=a**(x+i1)%p
L2=a**(x+i1+i2)%p
L3=a**(x+i2)%p
K=L3*(a**(-i2))

print ("L1",L1)
print ("L2",L2)
print ("L3",L3)
print ("K",K)
产生这一结果的原因是:

L1 55.596893310546875
L2 2.15625
L3 68.87890625
K 0.07503566293789979

另一个问题是我试图手动计算,但结果仍然与表中的结果不一致。我希望任何人都能帮助我。谢谢。

您指定的文档有点模糊。 下面给出的示例包括非固定点

如果需要(作为静态定义或表格),您不共享
gm、pm

您所做的工作比算法更重要。不要将
基本
改进
术语混用

am=5 #Secret key of A node
bm=9 #Secret key of B node
gm=15 #Shared Base Number
pm=97 #Shared Modulos

A = (gm^am)%p #Shared key from A
B = (gm^bm)%p #Shared key from B

Ka = (A^bm) %p #Calculate Key wit A node Answer
Kb = (B^am)%p  #Calculate Key wit B node Answer

print "Shared Key A:",A,"Shared Key B:",B
print "Node A key :",Ka,"Node B key :",Kb

NUMSA = [[i,(am**i)%p] for i in range(p) if i > 0]
NUMSB = [[i,(bm**i)%p] for i in range(p) if i > 0]


print NUMSA #ALL Numbers and means for A node
print NUMSB #ALL Numbers and means for B node
诗人在这里想说什么?我不喜欢那种解释

你懂什么


希望有帮助。

好的,我发现了错误:

  • (a^(x+i2)%p)*a^(-i2)!=a^(x+i2-i2)%p
    因为模
  • 另外,如果a、x和p是已知的,并且如果它们未知,则不需要4路交换,它们无法发送消息

我的一位精通数学的朋友帮我找出了问题所在。你得到的答案是正确的。问题在于作者给出的i1和i2的值

一个额外的十进制数完全改变了本部分中mod p运算的结果:

L1=a**(x+i1)%p 在i1等于0.958478的情况下,输出为: 55.596893310546875

现在,如果在i1的值的末尾再加上一个1,结果i1为0.9584781,则同一等式的输出将变成一个完全不同的数字: 37.163330078125

如果使用给定的i2 4.238835比较算法以确定K=L3*a**(-i2),您也会很快发现结果不等于46。用算法(a**x)%p计算出的K的初始值为46,因此上述算法的计算结果应为46。相反,具有给定值的该方程的结果为0.05102662974

我的朋友提出了一个理论,基于作者说他们正在使用Matlab的事实。Matlab有一项功能,允许用户限制显示的小数位数。十进制数字仍然根据其实际值进行操作,但它们在屏幕上的表示形式被截断为指定的小数位数。对于大多数操作,这是完全正确的,对计算结果的影响可以忽略不计。但是,当执行模运算时,单个1,即使在数字的最低有效小数位,也可以改变整个数字


因此,我们推测实际的i1和i2值被其在Matlab中的显示设置截断。这不会改变算法的真实性,也不会阻止它在操作结束时计算到变量K的正确值。将显示使用i1和i2的完整十进制值的所有结果。然而,这也会使使用Matlab在计算时向作者显示的相同数字的人无法再现整个过程。

所以我猜这篇论文是错的?通常模运算是整数运算,所以我对你的浮点数感到困惑。注意,对于整数
pow(基、指数、模)
是现成的性能实现。