Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random
- import codecs
- import math
- import sys
- def prime(n): # Проверка на простое число
- d = 2
- while d ** 2 <= n and n % d != 0:
- d += 1
- if d ** 2 > n:
- return True
- else:
- return False
- def mutprime(num1, num2): # Проверка на взаимнопростые числа
- if math.gcd(num1, num2) == 1:
- return True
- return False
- def fact(eu): # Факторизация
- i = 2
- f = []
- while prime(eu) == False:
- if eu % i == 0 and prime(i) == True:
- eu = eu / i
- if i not in f:
- f.append(i)
- else:
- i += 1
- f.append(eu)
- return f
- def fastpush(g, b, p): # Быстрое возведение в степень
- if b == 0:
- return 1
- if b % 2 == 1:
- return (g * fastpush(g, b - 1, p)) % p
- d = fastpush(g, b/2, p)
- return (d ** 2) % p
- def primeroot(p1, g1): # Проверка на первообразный корень по модулю
- if mutprime(p1, g1) == True:
- euler = p - 1
- count = 0
- f = fact(euler)
- print(f)
- #г в степени п-1 делить на каждый из простых множителей числа п-1 и по модулю п
- for i in range(len(f)):
- if fastpush(g1, euler / f[i], p1) != 1:
- count += 1
- else:
- return False
- if count == len(f):
- return True
- return False
- print("enter p")
- p = int(input())
- if prime(p) == False:
- print("p isn't prime number")
- sys.exit()
- print("enter g")
- g = int(input())
- if primeroot(p, g) == False:
- print("g isn't prime root")
- else:
- a = random.randint(1, p - 1)
- print("random number а = ", a)
- public_key = g ** a % p
- print("public key А = ", public_key)
- file = codecs.open('1.txt', 'r', 'utf-8')
- b = int(file.read(2))
- private_key = b ** a % p
- print("private key B = ", private_key)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement