import hashlib
import random
def gcd(a, b):
while b:
a, b = b, a % b
return a
def modinv(a, m):
m0, x0, x1 = m, 0, 1
if m == 1:
return 0
while a > 1:
q = a // m
a, m = m, a % m
x0, x1 = x1 - q * x0, x0
return x1 + m0 if x1 < 0 else x1
def is_prime(n):
if n <= 1: return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0: return False
return True
def generate_keys():
primes = [i for i in range(50, 100) if is_prime(i)]
p = random.choice(primes)
q = random.choice([x for x in primes if x != p])
n = p * q
phi = (p - 1) * (q - 1)
e = random.choice([x for x in range(2, phi) if gcd(x, phi) == 1])
d = modinv(e, phi)
return (e, n), (d, n)
def encrypt(message, public_key):
e, n = public_key
cipher = [pow(ord(char), e, n) for char in message]
return cipher
def decrypt(cipher, private_key):
d, n = private_key
message = ''.join([chr(pow(c, d, n)) for c in cipher])
return message
def generate_signature(message, private_key):
message_hash = hashlib.sha256(message.encode()).hexdigest()
signature = encrypt(message_hash, private_key)
return signature, message_hash
def verify_signature(signature, message, public_key):
decrypted_hash = decrypt(signature, public_key)
message_hash = hashlib.sha256(message.encode()).hexdigest()
return decrypted_hash == message_hash
public_key, private_key = generate_keys()
message = "This is a secret message"
signature, message_hash = generate_signature(message, private_key)
is_valid = verify_signature(signature, message, public_key)
print("Message: ", message)
print("Signature: ", signature)
print("Hash: ", message_hash)
print("Signature Valid: ", is_valid)