Path: blob/master/Digital-Signatures/ElGamal-Signatures/Challenges/Nonsense/encrypt.py
1402 views
import hashlib1import gmpy22import os3from secret import x, seed456class DSA():7def __init__(self):8self.g = 881254765991844860947906502788903687548887576557080271674539194352403043663953175294708319724950617257821380552212173022015897837698543668852317795964936026096349870522528631922296811061207456059313950953460120080560877303655674290096219136638913642243321418241000719288039847241985633128548166677199247607959self.y = 1843314063082027590753948883651683540877954293991905222699702304961278622441025958321937646725409962967791927185238045577245876264573540421143224296587192657063229731090321918440077585011099088639721228451892329243373887154940488098919432108222556144810185226050572728841123194141321209943443861067355640308410self.p = 8988465674311579542539546160517603870931187718975987866312297514459270897049508172301615266325707417890526774449417293761674801565150483996743070090166412513518587985214365382471540955496040234331175638263520783884803615935078577995942322188221521732670801721230928553759619149507455070177086212581728498595911self.q = 111881721526647309940148929983594502771363524821912self.x = x1314def sign(self, m, k):15h = int(hashlib.md5(m).hexdigest(), 16)16r = pow(self.g, k, self.p) % self.q17s = int(((self.x * r + h) * gmpy2.invert(k, self.q)) % self.q)18return (r, s)1920def verify(self, m, r, s):21if 0 < r and r < self.q and 0 < s and s < self.q:22h = int(hashlib.md5(m).hexdigest(), 16)23w = gmpy2.invert(s, self.q)24u1 = (h * w) % self.q25u2 = (r * w) % self.q26v = ((pow(self.g, u1, self.p) * pow(self.y, u2, self.p)) % self.p) % self.q27return v == r28return None293031class LCG():32def __init__(self):33self.a = 343777629299677746797665754757796765754734self.b = 82866986546959242626236347547757464363435self.m = 111881721526647309940148929983594502771363524821936self.seed = seed37self.state = (self.a * self.seed + self.b) % self.m3839def next_number(self):40self.state = (self.a * self.state + self.b) % self.m41return self.state424344generator = LCG()45signature = DSA()4647for _ in range(2):48message = "VolgaCTF{" + os.urandom(16).encode('hex') + "}"49k = generator.next_number()50(r, s) = signature.sign(message, k)51print (message, r, s)52print signature.verify(message, r, s)5354