def decrypt(self, mes): ''' Метод проверки подписи ''' try: mes, r, s = mes.split('_') except: raise ValidationError( 'Сообщение должно быть в формате {ТЕКСТ}_{r}_{s}.') # кодируем сообщение int_mes = [self.alph.index(l) + 1 for l in mes] self.y = int(self.y) s = int(s) r = int(r) mes_hash = square_hash(int_mes, len(self.alph)) if mes_hash % self.q == 0: mes_hash = 1 v = (mes_hash**(self.q - 2)) % self.q z1 = (s * v) % self.q z2 = ((self.q - r) * v) % self.q u = ((self.a**z1 * self.y**z2) % self.p) % self.q if u == r: result = 'Подпись верна.' else: result = 'Подпись не верна.' return result
def encrypt(self, mes): ''' Метод подписания сообщения ''' # оцифровываем сообщение int_mes = [self.alph.index(l) + 1 for l in mes] # составляем список доступных рандомизаторов k_array = [] for i in range(self.p - 1): k = i + 1 if Comparison.NOD(k, self.p - 1) == 1: k_array.append(k) # выбираем случайный рандомизатор k = k_array[randint(0, len(k_array) - 1)] # вычисляем a = g^k mod p a = self.g**k % self.p comparison = Comparison(self.p - 1) # вычисляем хэш-код сообщения mes_hash = square_hash(int_mes, len(self.alph)) # решаем сравнение b*k = M - x*a mod (p-1) b = comparison.solve_comparsion(k, mes_hash - self.x * a) return { 'result': mes + f'_{a}_{b}', 'info': f'Ключ для проверки подписи: {self.g**self.x % self.p}' }
def decrypt(self, mes): ''' Метод проверки подписи ''' try: mes, r, s = mes.split('_') except: raise ValidationError( 'Сообщение должно быть в формате {ТЕКСТ}_{r}_{s}.') # кодируем сообщение int_mes = [self.alph.index(l) + 1 for l in mes] mes_hash = square_hash(int_mes, len(self.alph)) s = int(s) r = int(r) Y = self._validate_point(self.y, 'Y') u1 = (s * mes_hash**(self.q - 2)) % self.q u2 = (-r * mes_hash**(self.q - 2)) % self.q p1 = self.elliptical_curve.multiplicate_point(self.G, u1) p2 = self.elliptical_curve.multiplicate_point(Y, u2) p = self.elliptical_curve.sum_points(p1, p2) if p == (0, 0): return 'Подпись не верна.' if p[0] % self.q == r: return 'Подпись верна' else: return 'Подпись не верна.'
def decrypt(self, mes): ''' Метод проверки подписи ''' try: mes, signature = mes.split('_') except: raise ValidationError('Сообщение должно быть в формате {ТЕКСТ}_{ПОДПИСЬ}.') self.N = int(self.N) self.E = int(self.E) # кодируем сообщение int_mes = [ self.alph.index(l) + 1 for l in mes ] # вычисляем хэш-код сообщения mes_hash = square_hash(int_mes, len(self.alph)) # расшифровываем хэш-код decrypted_mes_hash = (int(signature)**self.E) % self.N # проверяем подпись if mes_hash == decrypted_mes_hash: result = 'Подпись верна.' else: result = 'Подпись не верна.' return result
def encrypt(self, mes): ''' Метод подписания сообщения ''' # кодируем сообщение int_mes = [ self.alph.index(l) + 1 for l in mes ] # вычисляем хэш-код сообщения mes_hash = square_hash(int_mes, len(self.alph)) comparison = Comparison((int(self.P) - 1) * (int(self.Q) - 1)) # вычисляем секретный ключ D = comparison.solve_comparsion(int(self.E), 1) # подписываем сообщение s = M^D mod N signature = (mes_hash**D) % self.N return mes + '_' + str(signature)
def encrypt(self, mes): ''' Метод подписания сообщения ''' # кодируем сообщение int_mes = [self.alph.index(l) + 1 for l in mes] mes_hash = square_hash(int_mes, len(self.alph)) r = 0 s = 0 x = int(self.x) while r == 0 or s == 0: k = randint(1, self.q - 1) P = self.elliptical_curve.multiplicate_point(self.G, k) r = P[0] % self.q s = (k * mes_hash + r * x) % self.q Y = self.elliptical_curve.multiplicate_point(self.G, x) return { 'result': mes + f'_{r}_{s}', 'info': f'Ключ для проверки подписи: {Y[0]},{Y[1]}' }
def encrypt(self, mes): ''' Метод подписания сообщения ''' # кодируем сообщение int_mes = [self.alph.index(l) + 1 for l in mes] mes_hash = square_hash(int_mes, len(self.alph)) r = 0 s = 0 self.x = int(self.x) if mes_hash % self.q == 0: mes_hash = 1 while r == 0 or s == 0: k = randint(1, self.q - 1) r = (self.a**k % self.p) % self.q s = (self.x * r + k * mes_hash) % self.q return { 'result': mes + f'_{r}_{s}', 'info': f'Ключ для проверки подписи: {self.a**self.x % self.p}' }
def decrypt(self, mes): try: mes, a, b = mes.split('_') except: raise ValidationError( 'Сообщение должно быть в формате {ТЕКСТ}_{a}_{b}.') # оцифровываем сообщение int_mes = [self.alph.index(l) + 1 for l in mes] # вычисляем хэш-код сообщения mes_hash = square_hash(int_mes, len(self.alph)) y = int(self.y) # вычисляем a1 = (y^a * a^b) mod p a1 = ((y**int(a)) * (int(a)**int(b))) % self.p # вычисляем a2 = g^M mod p a2 = self.g**mes_hash % self.p if a1 == a2: result = 'Подпись верна.' else: result = 'Подпись не верна.' return result