【问题标题】:Diffie Hellman with not prime modulus非素数模数的 Diffie Hellman
【发布时间】:2020-09-12 04:25:57
【问题描述】:

当模数不是素数时,我已经阅读了很多关于 Diffie-Hellman 后门的文章。

但我需要帮助解决一个例子才能最终理解。

所以我有下一个参数:

p = 16289129
g = 5
A = 7835875
B = 3410160

我知道 p 是可因式分解的:23·708223

我怎样才能用非素数模数解决离散对数;这不起作用:

p = 16289129
g = 5
A = 7835875
B = 3410160

discrete_log(A, g, p)

【问题讨论】:

  • 我投票结束这个问题,因为它属于crypto.stackexchange.com
  • @Marc:这不是一个加密问题,而是一个与加密有关的明智问题。
  • 除了“它不起作用”之外,只提供有关您的问题的更多信息是没有用的。
  • 你必须将数字分解,分别计算每个素数的离散对数模,然后使用中国剩余定理组合结果。

标签: math discrete-mathematics sage


【解决方案1】:

我知道这样做的唯一方法是使用 for 循环到 p 范围的蛮力,您可以用少量数字很快恢复 A 和 B,但对于比您正在做的更大的事情显然不可能。这是一些恢复 A & B 的代码。

def egcd(a, b):
    if a == 0:
        return (b, 0, 1)
    else:
        g, y, x = egcd(b % a, a)
        #print(g,y,x)
        #print(g,x - (b // a) * y, x-(b//a), (b//a)*y, ( b//a ), y)
        return (g, x - (b // a) * y, y)

def modinv(a, m):
    g, x, y = egcd(a, m)
    if g != 1:
        raise Exception('modular inverse does not exist')
    else:
        return x % m


for x in range(0, 16289129):
  # Variables Used
  sharedPrime = 16289129     # p
  sharedBase = 5 #1009      # g
  #sharedPrime = 1031267
  #sharedBase = 111029
  aliceSecret =  x   # a
  bobSecret = 3410160       # b

  # Begin
  #print( "Publicly Shared Variables:")
  #print( "    Publicly Shared Prime: " , sharedPrime )
  #print( "    Publicly Shared Base:  " , sharedBase )

  # Alice Sends Bob A = g^a mod p
  #A = (sharedBase**aliceSecret) % sharedPrime
  A = pow(sharedBase,aliceSecret, sharedPrime)
  #print( "\n  Alice Sends Over Public Chanel: " , A )

  # Bob Sends Alice B = g^b mod p
  #B = (sharedBase ** bobSecret) % sharedPrime
  B = pow(sharedBase,bobSecret, sharedPrime)
  #print( "\n Bob Sends Over Public Chanel: ", B )

  #print( "\n------------\n" )
  #print( "Privately Calculated Shared Secret:" )
  # Alice Computes Shared Secret: s = B^a mod p
  # aliceSharedSecret = (B ** aliceSecret) % sharedPrime
  #aliceSharedSecret = pow(B,aliceSecret,sharedPrime)
  #print( "    Alice Shared Secret: ", aliceSharedSecret )

  # Bob Computes Shared Secret: s = A^b mod p
  #bobSharedSecret = (A**bobSecret) % sharedPrime
  bobSharedSecret = pow(A,bobSecret,sharedPrime)
  #print( "    Bob Shared Secret: ", bobSharedSecret )


  compare = bobSecret ^ aliceSecret

  mi = modinv(sharedBase,sharedPrime)

  c=A 
  d=A
  iterx=0
  oldc=A
  oldd=A
  while c !=0:
      oldc = c
      oldd = d
      c=c*mi%sharedPrime 
      d=(c*mi**2)%sharedPrime
      #print(mi)
      mi>>=1
      iterx+=1 
      #print(iterx, c)  
      dfcompare = oldc ^ A
      if dfcompare == aliceSecret: # or dfcompare == A  or dfcompare == A  or dfcompare == bobSharedSecret:
         print("alice Key found inside: ", aliceSecret,bobSecret,aliceSecret^bobSecret, mi, c, oldc, A,bobSharedSecret,B, dfcompare == bobSecret, dfcompare == aliceSecret,  dfcompare == 266)
      if dfcompare == bobSecret: # or dfcompare == A  or dfcompare == B or dfcompare == bobSharedSecret:
         print("bob Key found inside: ", aliceSecret,bobSecret,aliceSecret^bobSecret,  mi, c, oldc, A,bobSharedSecret,B, dfcompare == bobSecret, dfcompare == aliceSecret,  dfcompare == 266)
      dfcompare = oldd ^ A
      if dfcompare == aliceSecret: # or dfcompare == A  or dfcompare == A  or dfcompare == bobSharedSecret:
         print("alice Key found inside: ", aliceSecret,bobSecret,aliceSecret^bobSecret, mi, c, oldc, A,bobSharedSecret,B, dfcompare == bobSecret, dfcompare == aliceSecret,  dfcompare == 266)
      if dfcompare == bobSecret: # or dfcompare == A  or dfcompare == B or dfcompare == bobSharedSecret:
         print("bob Key found inside: ", aliceSecret,bobSecret,aliceSecret^bobSecret,  mi, c, oldc, A,bobSharedSecret,B, dfcompare == bobSecret, dfcompare == aliceSecret,  dfcompare == 266)

  #print(iterx, oldc)  

  dfcompare = oldc ^ A

  if dfcompare == aliceSecret: # or dfcompare == A  or dfcompare == B or dfcompare == bobSharedSecret:
      print("alice Key found outside: ", aliceSecret,bobSecret, aliceSecret^bobSecret, mi, c, oldc, A,bobSharedSecret,B, dfcompare == bobSecret, dfcompare == aliceSecret,  dfcompare == 266)
  if dfcompare == bobSecret: #  or dfcompare == A or dfcompare == B or dfcompare == bobSharedSecret:
      print("bob Key found outside: ", aliceSecret,bobSecret, aliceSecret^bobSecret, mi, c, oldc, A,bobSharedSecret,B, dfcompare == bobSecret, dfcompare == aliceSecret,  dfcompare == 266)
    #break

  dfcompare = oldd ^ A

  if dfcompare == aliceSecret: # or dfcompare == A  or dfcompare == B or dfcompare == bobSharedSecret:
      print("alice Key found outside: ", aliceSecret,bobSecret, aliceSecret^bobSecret, mi, c, oldc, A,bobSharedSecret,B, dfcompare == bobSecret, dfcompare == aliceSecret,  dfcompare == 266)
  if dfcompare == bobSecret: #  or dfcompare == A or dfcompare == B or dfcompare == bobSharedSecret:
      print("bob Key found outside: ", aliceSecret,bobSecret, aliceSecret^bobSecret, mi, c, oldc, A,bobSharedSecret,B, dfcompare == bobSecret, dfcompare == aliceSecret,  dfcompare == 266)

输出:

alice Key found inside:  0 3410160 3410160 1628913 3257826 1 1 1 7231001 False True False
alice Key found inside:  0 3410160 3410160 1628913 3257826 1 1 1 7231001 False True False
alice Key found inside:  514345 3410160 3396057 24 3399166 5388270 1550861 9501427 7231001 False True False
alice Key found inside:  736913 3410160 4142689 25451 181780 1390738 5482147 13392747 7231001 False True False
bob Key found inside:  805168 3410160 3686848 795 14730017 2027477 12797655 13227860 7231001 True False False
alice Key found inside:  1090405 3410160 2403221 397 5406755 9329510 10418179 11317568 7231001 False True False
alice Key found inside:  1319263 3410160 2107823 397 12968756 10691327 11994016 9408910 7231001 False True False
alice Key found inside:  1520691 3410160 2309315 198 15131181 6151666 4909505 3061289 7231001 False True False
bob Key found inside:  1812398 3410160 3125086 0 9989884 9989884 11298316 15863668 7231001 True False False
bob Key found inside:  1812398 3410160 3125086 0 0 9989884 11298316 15863668 7231001 True False False
bob Key found inside:  1812398 3410160 3125086 0 0 9989884 11298316 15863668 7231001 True False False
bob Key found outside:  1812398 3410160 3125086 0 0 9989884 11298316 15863668 7231001 True False False
bob Key found outside:  1812398 3410160 3125086 0 0 9989884 11298316 15863668 7231001 True False False
bob Key found inside:  1848360 3410160 2637016 6 5892567 12707894 16113862 3527100 7231001 True False False
bob Key found inside:  2076229 3410160 2860725 12 4861935 6311004 5522604 5891481 7231001 True False False
bob Key found inside:  2637508 3410160 1848884 198 14344704 14930223 14146015 4071246 7231001 True False False
bob Key found inside:  3121830 3410160 1813078 3181 11985609 834007 3715367 14209381 7231001 True False False
alice Key found inside:  3129104 3410160 1816544 101807 3083406 16029624 1760214 8757757 7231001 False True False
alice Key found inside:  3789467 3410160 907883 99 6405853 2089061 1155243 11032296 7231001 False True False

【讨论】:

  • 在发布答案之前,您应该阅读问题的 cmets。这是一个关于使用 sage 函数的问题。正确的答案是分解模数,对每个素数执行离散对数模,并将结果与​​中国剩余定理结合。这总共需要大约 5 行 sage 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2012-02-06
相关资源
最近更新 更多