def decode(self, S, D, N): self.Y = self.m if int.from_bytes(self.Y, 'big') >= self.P: for i in range(0, self.m.__len__()): self.W[i] = lab1.fastModuloExponentiation(S[i], D, N) else: self.W = lab1.fastModuloExponentiation(S, D, N)
def encode(self): if int.from_bytes(self.m, 'big') >= self.P: for i in range(0, self.m.__len__()): self.S[i] = lab1.fastModuloExponentiation( self.Y[i], self.C, self.N) else: self.S = lab1.fastModuloExponentiation(self.m, self.C, self.N)
def el_gamal(p, g, m): if not isPrime(p): sys.exit('ERROR. [P] must be prime number or p <= 255.') Ca = random.randint(1, p - 1) Cb = random.randint(1, p - 1) # Алгоритм евлкида Cd = random.randint(1, p - 1) Da = lab1.fastModuloExponentiation(g, Ca, p) Db = lab1.fastModuloExponentiation(g, Cb, p) Dc = lab1.fastModuloExponentiation(g, Cd, p) # Зачем нужны Ca, Cd, Da, Dc пока что не разобрался, но в методичке они есть if int.from_bytes(m, 'big') >= p: k = [0] * m.__len__() r = [0] * m.__len__() mx = [0] * m.__len__() e = [0] * m.__len__() for i in range(0, m.__len__()): k[i] = random.randint(1, p - 2) r[i] = lab1.fastModuloExponentiation(g, k[i], p) e[i] = m[i] * lab1.fastModuloExponentiation(Db, k[i], p) % p mx[i] = e[i] * lab1.fastModuloExponentiation(r[i], p - 1 - Cb, p) % p out = bytearray(mx) with open("elGamal_out.mp3", 'wb') as f: f.write(out) for i in range(0, m.__len__()): if mx[i] == m[i]: print(mx[i], ' == ', m[i]) continue else: print(mx[i], ' != ', m[i]) print("Error!") return False print("Successful!") return True else: k = random.randint(1, p - 2) r = lab1.fastModuloExponentiation(g, k, p) e = m * lab1.fastModuloExponentiation(Db, k, p) % p mx = e * lab1.fastModuloExponentiation(r, p - 1 - Cb, p) % p if m == mx: print(m, ' == ', mx) print("Successful!") return True print(m, ' != ', mx) print("Error!") return False
def encode(self): self.r = lab1.fastModuloExponentiation(self.g, self.k, self.p) print('r = ', self.r) if int.from_bytes(self.h, 'big') >= self.p: for i in range(0, self.h.__len__()): # print(2) self.u[i] = (self.h[i] - self.x * self.r) % (self.p - 1) self.k_tmp[i] = lab1.mulinv(self.k, self.p - 1) self.s[i] = self.k_tmp[i] * self.u[i] % (self.p - 1) else: self.u = (self.h - self.x * self.r) % (self.p - 1) self.k_tmp = lab1.mulinv(self.k, self.p - 1) self.s = self.k_tmp * self.u % (self.p - 1)
def shamir_secret(m, p): if not (isPrime(p) and (p > 255)): sys.exit('ERROR. [P] must be prime number or p <= 255.') Ca = lab1.generate_g(p) Cb = lab1.generate_g(p) Da = lab1.genEuclideanAlgo(Ca, p - 1)[1] Db = lab1.genEuclideanAlgo(Cb, p - 1)[1] if int.from_bytes(m, 'big') >= p: x1 = [0] * m.__len__() x2 = [0] * m.__len__() x3 = [0] * m.__len__() x4 = [0] * m.__len__() for i in range(0, m.__len__()): x1[i] = lab1.fastModuloExponentiation(m[i], Ca, p) x2[i] = lab1.fastModuloExponentiation(x1[i], Cb, p) x3[i] = lab1.fastModuloExponentiation(x2[i], Da, p) x4[i] = lab1.fastModuloExponentiation(x3[i], Db, p) # Проверка на равность полученного сообщения и изначального out = bytearray(x4) with open("Shamir_out.gif", 'wb') as f: f.write(out) for i in range(0, m.__len__()): if x4[i] == m[i]: print(x4[i], ' == ', m[i]) continue else: print(x4[i], ' != ', m[i]) print("Error!") return False print("Successful!") return True else: x1 = lab1.fastModuloExponentiation(int.from_bytes(m, 'big'), Ca, p) x2 = lab1.fastModuloExponentiation(x1, Cb, p) x3 = lab1.fastModuloExponentiation(x2, Da, p) x4 = lab1.fastModuloExponentiation(x3, Db, p) # Проверка на равность полученного сообщения и изначального if not x4 == int.from_bytes(m, 'big'): print(x4, ' != ', m) print("Error!") return False print(x4, ' == ', m) print("Successful!") return True
def __init__(self, p, g, m): self.p = p self.g = g self.h = m self.x = lab1.generate_g(p - 2) self.y = lab1.fastModuloExponentiation(self.g, self.x, self.p) self.k = lab1.generate_g(p - 2) print(lab1.genEuclideanAlgo(self.k, p - 1)) self.r = 0 if int.from_bytes(self.h, 'big') >= self.p: self.u = [0] * m.__len__() self.s = [0] * m.__len__() self.k_tmp = [0] * m.__len__() else: self.r = 0 self.u = 0 self.s = 0 self.k_tmp = 0
def decode(self, r, s): left = 0 right = 0 if int.from_bytes(self.h, 'big') >= self.p: left = [0] * self.h.__len__() right = [0] * self.h.__len__() # print('r = ', r) # print('s = ', s) # print('p = ', self.p) for i in range(0, self.h.__len__()): left[i] = lab1.fastModuloExponentiation(self.y, r, self.p) * \ lab1.fastModuloExponentiation(r, s[i], self.p) right[i] = lab1.fastModuloExponentiation( self.g, self.h[i], self.p) else: left = lab1.fastModuloExponentiation( self.y, r, self.p) * lab1.fastModuloExponentiation( r, s, self.p) right = lab1.fastModuloExponentiation(self.g, self.h, self.p) return left, right
def decrypt(self, e): mx = [0] * e.__len__() for i in range(0, e.__len__()): mx[i] = lab1.fastModuloExponentiation(e[i], self.C, self.N) return mx
def encrypt(self, D, N): e = [0] * self.m.__len__() for i in range(0, self.m.__len__()): e[i] = lab1.fastModuloExponentiation(self.m[i], D, N) return e