Advertisement
bmtd

Wiener Attack

Mar 8th, 2016
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.03 KB | None | 0 0
  1. #sage
  2. def fraction(x):
  3.     result=[]
  4.     while 1:
  5.         if (x==int(x)):
  6.             result.append(int(x))
  7.             break
  8.         result.append(int(x))
  9.         x=1/(x-int(x))
  10.     return result
  11. def convergent(a,dmax):    
  12.     result=[]
  13.     result.append([a[0],1])
  14.     result.append([a[0]*a[1]+1,a[1]])
  15.     for i in range(2,len(a)):
  16.         p=a[i]*result[i-1][0]+result[i-2][0]
  17.         q=a[i]*result[i-1][1]+result[i-2][1]
  18.         if q>dmax:
  19.             break
  20.         result.append([p,q])        
  21.     if a[0]==0:
  22.         result.pop(0)    
  23.     return result
  24. def check(k,d,e,n):
  25.     phi=(e*d-1)/k
  26.     if int(phi)!=phi:
  27.         print "No! Error phi"
  28.         return 0
  29.     b=n-phi+1
  30.     delta=b**2-4*n
  31.     can_delta=sqrt(delta)    
  32.     if int(can_delta)!=can_delta:
  33.         print "No! Error delta"        
  34.         return 0
  35.     else:
  36.         print (b+can_delta)/2,(b-can_delta)/2
  37. def wiener(e,n):
  38.     dmax=pow(n,1/4)/3
  39.     a=convergent(fraction(e/n),dmax)
  40.     for i in range(len(a)):
  41.         check(a[i][0],a[i][1],e,n)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement