Advertisement
Hexkritor

Untitled

Feb 5th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.27 KB | None | 0 0
  1. import socket
  2. import hashlib
  3. import random
  4.  
  5. def powMod (n ,power ,mod):
  6.     res=1
  7.     while power>0:
  8.         if (power&1):
  9.             res = (res * n) % mod
  10.         n = (n * n) % mod
  11.         power>>=1
  12.     return res
  13.  
  14. def gcd(a, b):
  15.     while b:
  16.         a, b = b, a%b
  17.     return a
  18.  
  19. def egcd(a, b):
  20.     if a == 0:
  21.         return (b, 0, 1)
  22.     else:
  23.         g, y, x = egcd(b % a, a)
  24.         return g, x - (b // a) * y, y
  25.  
  26. def modinv(a, m):
  27.     g, x, y = egcd(a, m)
  28.     if g != 1:
  29.         raise Exception ('modular inverse does not exist')
  30.     else :
  31.         return x % m
  32.  
  33.  
  34. def number2hashnum(number):
  35.     tNumber = number
  36.     hashObj = hashlib.sha256()
  37.     byteNumber = bytearray()
  38.     while tNumber > 0:
  39.         byteNumber.append(tNumber & 0xFF)
  40.         tNumber >>= 8
  41.     byteNumber.reverse()
  42.     hashObj.update(byteNumber)
  43.     hash = hashObj.digest()
  44.     hashArray = bytearray(hash)
  45.     hashNumber = 0
  46.     hashArray.reverse()
  47.     length = len(hashArray)
  48.     i = 0
  49.     while i<length :
  50.         hashNumber += hashArray[i] << (i * 8)
  51.         i += 1
  52.     return hashNumber
  53.  
  54. def parseMessageTo2Ints(message):
  55.     message = message.decode()
  56.     message = message.split(' ')
  57.     return int(message[0]), int(message[1])
  58.  
  59. def createVote(answer):
  60.     R = ((random.getrandbits(128)) << 20) | answer #R'
  61.     h = number2hashnum(R)
  62.     return R, h
  63.  
  64. def blindSignPrepare(N, h, D):
  65.     X = random.getrandbits(512)
  66.     while (gcd(X,N) != 1 or X < 3):
  67.         X = random.getrandbits(512)
  68.     h_ = (powMod(X, D, N) * h) % N
  69.     return h_, X
  70.  
  71. def secretManupulations(S_, X, N):
  72.     Xinv = modinv(X, N)
  73.     return (S_ * Xinv % N)
  74.  
  75. connSock = socket.socket()
  76. print("Введите адрес сервера:")
  77. IP_ADDRESS = input()
  78. connSock.connect((IP_ADDRESS,9090))
  79. message = connSock.recv(2048)
  80. N, D = parseMessageTo2Ints(message)
  81.  
  82. message = connSock.recv(2048)
  83.  
  84. print("Введите номер для голосования")
  85. R, h = createVote(int(input()))
  86. h_, X = blindSignPrepare(N,h,D)
  87.  
  88. connSock.send(str(h_).encode())
  89. message = connSock.recv(2048)
  90.  
  91. signedHash = secretManupulations(int(message.decode()),X,N)
  92. connSock.close()
  93. connSock = socket.socket()
  94. connSock.connect((IP_ADDRESS,9091))
  95.  
  96. connSock.send((str(R)+' '+str(signedHash)).encode())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement