Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
 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}'
     }
Ejemplo n.º 3
0
    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 'Подпись не верна.'
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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]}'
     }
Ejemplo n.º 7
0
    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}'
        }
Ejemplo n.º 8
0
    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