from Crypto.Util.number import getPrime
from gmpy2 import invert
# νμ΄μ¬μμ p, q κ°μ μμ±νλ λ°©λ²
p = getPrime(1024) #1024 bit / 무μμλ‘ ν° λ μμ p, q κ³ λ₯΄κΈ°
q = getPrime(1024)
# n κ° κ³μ°νλ λ²
n = p * q
# n μ΄νμ nκ³Ό μλ‘μμΈ μλ€μ κ°μ κ³μ°
phi = (p - 1) * (q - 1)
# 1<e<phi μ΄κ³ , eμ phiκ° μλ‘μμΈ eλ₯Ό μ ν ( λκ° 65537 μ¬μ© )
e=65537
# de=1(mod phi)λ₯Ό λ§μ‘±νλ dλ₯Ό κ³μ°νλ€ / μμμ μ μ kμ λν΄μ de=1+k phiλ₯Ό λ§μ‘±
d= invert(e,phi)
print("곡κ°ν€ n = ",n)
print("곡κ°ν€ e = ",e)
print("κ°μΈν€ d = ",d)
μνΈνμ 볡νΈν
# μνΈν
# μλ³Έ λ©μμ§ m, μνΈνλ λ©μμ§ M, 곡κ°ν€ e,n , κ°μΈν€ d
m=11
# μνΈν λ λ©μμ§ = μλ³Έ λ©μμ§ ** 곡κ°ν€e % 곡κ°ν€n
M = m**e%n
print("μνΈν λ λ©μμ§ = ",M)
# μλ³Έ λ©μμ§ = μνΈν λ λ©μμ§ ** κ°μΈν€ d % 곡κ°ν€n
# 볡νΈν
m = M**d%n
print(" 볡νΈν λ λ©μμ§n = ",m)