rsa lesson added

This commit is contained in:
2026-01-25 00:53:16 +01:00
parent a6ed5c6bb9
commit 890114066f
17 changed files with 429 additions and 5 deletions

View File

@@ -0,0 +1,36 @@
from cryptography.hazmat.primitives import serialization
pem_data = b"""
-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAK4gNXUU314X3Wp8
ORTyJDw/WqrShnmk2SKuJHocNc9NXWbSZB/UQpjjt5yjmB5Ugl7OkfQd+53TsmJy
Vr2ZYjpqNAtu5ijJiBQ3cVTeKEGzPHeCHWLedfStUbC77/+kNAsGPQOzkoHmXe95
UnopxzVOfjSdR6vab6YXNvpj1DdvAgMBAAECgYAfT8ltIXC9UdtOD8KQAq8Dan0a
ZLsr2rn1I42Jq9L9UTMvjzvUAW5sYd6du0laguXiuJDEbjPWAMB+NYNlmtRv0rzt
Ych1EHF/hgCZUMHxISYrrvY1PoHu4JZmTGpo5cREdnjfqzyEDvXO+Rg2AA7rk7hW
qg8cmisvaujZ+vtReQJBANkPhl4ItI8uMGqOB7Lev5pMNmZPOkqcYFl7Vi9OYr5s
wsTKyvaGM8i2NonSAgwszLl6ylHEBy5CkCopq9gbN4sCQQDNXOirgt/X75ScYPso
pzMtcCN0WUPeAbxqfOcerZ5e8XDROGSotjZc3uCaXgPk7kmBRPcoLTHoBruO5pPz
8NwtAkEAlVzagFCLNs9434nWgF5JCHsTH/m6yearYke9uZW92v1qVRKa8WLNtXq1
MsdBQ3F8etGk8PjsXAfPvkOojW/FGwJBALFiLxb2VKMQLi1lF4xl366/zeARuq1o
knborDmzfbhElE4jh86ylQJjAV5VFsgHizY9e78YSqNALYGhaOqsgYECQQDDavQE
Z47hwsvkDXSfmOYbLCqPUVKJ4Kk/OO+m8yCugQImDYxgIylroZe3wpKFH5Yk2NkB
G6buDKcaTFHcOJiy
-----END PRIVATE KEY-----
"""
private_key = serialization.load_pem_private_key(
pem_data,
password=None
)
numbers = private_key.private_numbers()
print(f"Modulus (n): {numbers.public_numbers.n}")
print(f"Public Exponent (e): {numbers.public_numbers.e}")
print(f"Private Exponent (d): {numbers.d}")
print(f"Prime 1 (p): {numbers.p}")
print(f"Prime 2 (q): {numbers.q}")
print(f"d mod (p-1): {numbers.dmp1}")
print(f"d mod (q-1): {numbers.dmq1}")
print(f"q^-1 mod p: {numbers.iqmp}")

View File

@@ -0,0 +1,16 @@
from cryptography.hazmat.primitives import serialization
pem_data = b"""
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCuIDV1FN9eF91qfDkU8iQ8P1qq
0oZ5pNkiriR6HDXPTV1m0mQf1EKY47eco5geVIJezpH0Hfud07Jicla9mWI6ajQL
buYoyYgUN3FU3ihBszx3gh1i3nX0rVGwu+//pDQLBj0Ds5KB5l3veVJ6Kcc1Tn40
nUer2m+mFzb6Y9Q3bwIDAQAB
-----END PUBLIC KEY-----
"""
key = serialization.load_pem_public_key(pem_data)
numbers = key.public_numbers()
print(f"Modulus (n): {numbers.n}")
print(f"Exponent (e): {numbers.e}")

View File

@@ -0,0 +1,15 @@
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
key = rsa.generate_private_key(public_exponent=65537, key_size=1024)
print(key.private_bytes(
serialization.Encoding.PEM,
serialization.PrivateFormat.PKCS8,
serialization.NoEncryption()
).decode())
print(key.public_key().public_bytes(
serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo
).decode())

View File

@@ -0,0 +1,37 @@
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from Crypto.Util.number import getPrime
e = 65537
p = getPrime(512)
q = getPrime(512)
n = p * q
phi = (p - 1) * (q - 1)
d = pow(e, -1, phi)
dp = d % (p - 1)
dq = d % (q - 1)
q_inv = pow(q, -1, p)
private_numbers = rsa.RSAPrivateNumbers(
p=p,
q=q,
d=d,
dmp1=dp,
dmq1=dq,
iqmp=q_inv,
public_numbers=rsa.RSAPublicNumbers(e=e, n=n)
)
key = private_numbers.private_key()
print(key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
).decode())
print(key.public_key().public_bytes(
serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo
).decode())

View File

@@ -0,0 +1,50 @@
from Crypto.Util.number import getPrime, bytes_to_long, long_to_bytes
from math import gcd
from sympy.ntheory.modular import crt
import time
# key generation
p = getPrime(512) # 512-bit prime number
q = getPrime(512) # 512-bit prime number
n = p * q
phi = (p - 1) * (q - 1)
e = 65537 # = 2^16 +1 = 10000000000000001
assert gcd(e, phi) == 1
d = pow(e, -1, phi)
# encryption
def encrypt(message):
m = bytes_to_long(message.encode())
c = pow(m, e, n)
return c
# CRT
dp = d % (p - 1) # d_p = d mod (p-1)
dq = d % (q - 1) # d_q = d mod (q-1)
q_inv = pow(q, -1, p) # q^{-1} mod p
def decrypt(cipher_int):
m1 = pow(cipher_int, dp, p) # c^dp mod p
m2 = pow(cipher_int, dq, q) # c^dq mod q
m, mod = crt([p, q], [m1, m2]) # m ≡ m1 (mod p), m ≡ m2 (mod q)
# Garner's Algorithm
# h = (m1 - m2) * q_inv % p
# m = (m2 + h * q) % n
message = long_to_bytes(m).decode()
return message
m = "Hello World"
c = encrypt(m)
start = time.perf_counter()
m_recover = decrypt(c)
end = time.perf_counter()
print("Ciphertext: ", c)
print("Message: ", m_recover)
print(f"decrypt time: {(end-start)*1e3:.3f} ms")

View File

@@ -0,0 +1,37 @@
from Crypto.Util.number import getPrime, bytes_to_long, long_to_bytes
from math import gcd
import time
# key generation
p = getPrime(512) # 512-bit prime number
q = getPrime(512) # 512-bit prime number
n = p * q
phi = (p - 1) * (q - 1)
e = 65537 # = 2^16 +1 = 10000000000000001
assert gcd(e, phi) == 1
d = pow(e, -1, phi)
# encryption
def encrypt(message):
m = bytes_to_long(message.encode())
c = pow(m, e, n)
return c
# decryption
def decrypt(cipher_int):
m = pow(cipher_int, d, n)
message = long_to_bytes(m).decode()
return message
m = "Hello World"
c = encrypt(m)
start = time.perf_counter()
m_recover = decrypt(c)
end = time.perf_counter()
print("Ciphertext: ", c)
print("Message: ", m_recover)
print(f"decrypt time: {(end-start)*1e3:.3f} ms")