-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathkeygen.py
96 lines (72 loc) · 2.7 KB
/
keygen.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
#!/usr/bin/env python
# uso: keygen.py
#
# Generar par de llaves RSA
#
# pylint: disable=missing-module-docstring
#
import sys
import os
import getpass
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
DEFAULT_KEY_FILE = "id_rsa"
MAX_PASSPHRASE_ATTEMPTS = 5
def rsa_private_key(public_exponent=65537, key_size=2048):
"""Generar llave RSA.
Argumentos:
public_exponent -- Propiedad matemática de la generación de la llave (default 65537)
key_size -- Tamaño de la llave en bits (default 2048)
"""
return rsa.generate_private_key(
public_exponent=public_exponent,
key_size=key_size,
)
def main():
"""Función principal.
- Codificación de serialización: PEM
- Formato privado: PKCS8
- Contraseña (opcional): BestAvailableEncryption
"""
print("Generando par de llaves RSA pública/privada.")
key_file = input(f"Ingresa el archivo en donde deseas guardar la llave "
f"({os.path.join(os.getcwd(), DEFAULT_KEY_FILE)}): ")
if not key_file:
key_file = DEFAULT_KEY_FILE
passphrase = ""
attempts = MAX_PASSPHRASE_ATTEMPTS
while attempts:
passphrase = getpass.getpass("Ingresa una contraseña (vacío para sin contraseña): ")
passphrase_confirm = getpass.getpass("Ingresa la misma contraseña otra vez: ")
if passphrase == passphrase_confirm:
break
attempts -= 1
if not attempts:
print("Demasiados intentos fallidos. Intenta nuevamente.")
sys.exit()
print("Las contraseñas no coinciden.")
private_key = rsa_private_key()
public_key = private_key.public_key()
if passphrase:
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.BestAvailableEncryption(passphrase.encode())
)
else:
private_pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption()
)
with open(f"{key_file}.pem", "w", encoding="utf-8") as private_file:
print(private_pem.decode(), file=private_file)
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open(f"{key_file}.pub", "w", encoding="utf-8") as public_file:
print(public_pem.decode(), file=public_file)
print("Llaves generadas con éxito!")
if __name__ == '__main__':
main()