Advertisement
saleks28

kmzi4_8sem

Aug 15th, 2020
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.05 KB | None | 0 0
  1. from random import randint
  2. from pygost import gost34112012256
  3. from asn1 import Decoder, Encoder, Numbers
  4. from Cryptodome.Util.number import inverse
  5.  
  6.  
  7. # const vars
  8. A = -1
  9. B = 53520245325288251180656443226770638951803337703360722011463033447827147086694
  10. p = 57896044625414088412406986721186632159605151965036429316594800028484330862739
  11. r = 28948022312707044206203493360593316079803694388568974763893400879284219004579
  12. xP = 36066034950041118412594006918367965339490267219250288222432003968962962331642
  13. yP = 54906983586985298119491343295734802658016371303757622466870297979342757624191
  14. q = r
  15. d = 28843936935357833154095140201945387686710795615857734070222172448292711098429
  16. CONST_MENU = "Enter the command number:\n" \
  17.              "1 - Make a signature\n" \
  18.              "2 - Check file signature\n" \
  19.              "3 - Exit\n"
  20.  
  21.  
  22.  
  23. def write_asn1(s, r, Q):
  24.     qX = lift(Q[0])
  25.     qY = lift(Q[1])
  26.     f = Encoder()
  27.     f.start()
  28.     f.enter(Numbers.Sequence)#заголовок
  29.     f.enter(Numbers.Set)#множество ключей, 1 задействован
  30.     f.enter(Numbers.Sequence)# первый «ключ»
  31.     f.write(b'\x80\x06\x07\x00', Numbers.OctetString)
  32.     f.write(b'GOST R 34.10-2018', Numbers.UTF8String)
  33.     f.enter(Numbers.Sequence)# значение открытого ключа
  34.     f.write(qX, Numbers.Integer)
  35.     f.write(qY, Numbers.Integer)
  36.     f.leave()
  37.     f.enter(Numbers.Sequence)#параметры криптосистемы
  38.     f.enter(Numbers.Sequence)#параметры поля
  39.     f.write(p, Numbers.Integer)
  40.     f.leave()
  41.     f.enter(Numbers.Sequence)#параметры кривой
  42.     f.write(A, Numbers.Integer)
  43.     f.write(B, Numbers.Integer)
  44.     f.leave()
  45.     f.enter(Numbers.Sequence)#образующая группы точек кривой
  46.     f.write(xP, Numbers.Integer)
  47.     f.write(yP, Numbers.Integer)
  48.     f.leave()
  49.     f.write(q, Numbers.Integer)
  50.     f.leave()#– параметры криптосистемы"
  51.     f.enter(Numbers.Sequence)#подпись сообщения
  52.     f.write(r, Numbers.Integer)
  53.     f.write(s, Numbers.Integer)
  54.     f.leave()
  55.     f.leave()
  56.     f.enter(Numbers.Sequence)
  57.     f.leave()
  58.     f.leave()
  59.     f.leave()
  60.     with open("signed.txt", "wb") as output:
  61.         output.write(f.output())
  62.  
  63.  
  64. def make_signature(filename):
  65.     global p, r, A, B, xP, yP, q, d
  66.     E = EllipticCurve(GF(p), [A, B])
  67.     P = E(xP, yP)
  68.     text = read_file(filename)
  69.     alph = gost34112012256.new(text).digest()
  70.     h = int.from_bytes(alph, "big")
  71.     e = h % q
  72.     if e == 0:
  73.         e = 1
  74.     Q = d * P
  75.     while 1:
  76.         k = randint(0, q)
  77.         C = k * P
  78.         xC = C[0]
  79.         xC = lift(xC)
  80.         yC = C[1]
  81.         r = xC % q
  82.         if r == 0:
  83.             continue
  84.         s = (r * d + k * e) % q
  85.         if s == 0:
  86.             continue
  87.         write_asn1(s, r, Q)
  88.         print("Made a signature")
  89.         break
  90.        
  91.  
  92. def check_signature(filename):
  93.     data = read_file("signed.txt")
  94.     f = Decoder()
  95.     f.start(data)
  96.     f.enter()#заголовок
  97.     f.enter()#множество ключей, 1 задействован
  98.     f.enter()# первый «ключ»
  99.     f.read()
  100.     f.read()
  101.     f.enter()# значение открытого ключа
  102.     qX = f.read()[1]
  103.     qY = f.read()[1]
  104.     f.leave()
  105.     f.enter()#параметры криптосистемы
  106.     f.enter()#параметры поля
  107.     p = f.read()[1]
  108.     f.leave()
  109.     f.enter()#параметры кривой
  110.     A = f.read()[1]
  111.     B = f.read()[1]
  112.     f.leave()
  113.     f.enter()#образующая группы точек кривой
  114.     xP = f.read()[1]
  115.     yP = f.read()[1]
  116.     f.leave()
  117.     q = f.read()[1]
  118.     f.leave()#– параметры криптосистемы"
  119.     f.enter()#подпись сообщения
  120.     r = f.read()[1]
  121.     s = f.read()[1]
  122.     f.leave()
  123.     f.leave()
  124.     f.enter()
  125.     f.leave()
  126.     f.leave()
  127.     f.leave()
  128.     if r <= 0 or r >= q or s <= 0 or s >= q:
  129.         print("File was changed!")
  130.         return False
  131.     mess = read_file(filename)
  132.     hah = gost34112012256.new(mess).digest()
  133.     h = int.from_bytes(hah, "big")
  134.     e = h % q
  135.     if e == 0:
  136.         e = 1
  137.     v = inverse(e, q)
  138.     z2 = (-r * v) % q
  139.     z1 = (s * v) % q
  140.     E = EllipticCurve(GF(p), [A,B])
  141.     P = E(xP, yP)
  142.     Q = E(qX, qY)
  143.     C = z1 * P + z2 * Q
  144.     xc = C[0]
  145.     xc = lift(xc)
  146.     R = xc % q
  147.     if R == r:
  148.         print("Message wasn't changed")
  149.     else:
  150.         print("Message was changed")
  151.  
  152.  
  153. def read_file(filename):
  154.     data = b''
  155.     with open(filename, "rb") as inp:
  156.         for line in inp:
  157.             data += line
  158.     return data
  159.  
  160.  
  161. def get_filename():
  162.     return input("Enter filename: ")
  163.  
  164. def main():
  165.     while 1:
  166.         user_choice = int(input(CONST_MENU))
  167.         if user_choice == 1:
  168.             make_signature(get_filename())
  169.             break
  170.         elif user_choice == 2:
  171.             check_signature(get_filename())
  172.             break
  173.         elif user_choice == 3:
  174.             return
  175.    
  176.  
  177. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement