-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRSA.py
99 lines (80 loc) · 2.05 KB
/
RSA.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import random
# Función para calcular el máximo común divisor
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
# Función para calcular la inversa modular
def mod_inverse(a, m):
m0 = m
y = 0
x = 1
if m == 1:
return 0
while a > 1:
q = a // m
t = m
m = a % m
a = t
t = y
y = x - q * y
x = t
if x < 0:
x += m0
return x
# Generar claves RSA
def gen_keys(bits):
while True:
# Generar primos p y q
p = gen_prime(bits // 2)
q = gen_prime(bits // 2)
n = p * q
phi = (p - 1) * (q - 1)
# Elegir e coprimo con phi
e = random.randrange(1, phi)
g = gcd(e, phi)
while g != 1:
e = random.randrange(1, phi)
g = gcd(e, phi)
# Calcular d
d = mod_inverse(e, phi)
# Verificar si las claves funcionan
test_msg = 12345
cipher = encrypt_number(test_msg, e, n)
decrypted = decrypt_number(cipher, d, n)
if decrypted == test_msg:
return (e, d, n)
# Cifrar un mensaje
def encrypt(msg, e, n):
cipher = []
for char in msg:
cipher.append(pow(ord(char), e, n))
return cipher
# Descifrar un mensaje
def decrypt(cipher, d, n):
msg = ''
for c in cipher:
char = pow(c, d, n)
if char in range(32, 127): # Rango de caracteres ASCII válidos
msg += chr(char)
return msg
# Cifrar un número
def encrypt_number(num, e, n):
return pow(num, e, n)
# Descifrar un número
def decrypt_number(cipher, d, n):
return pow(cipher, d, n)
# Generar un número primo
def gen_prime(bits):
while True:
p = random.randrange(2 ** (bits - 1), 2 ** bits)
if is_prime(p):
return p
# Verificar si un número es primo
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True