CNS Practical-10

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)

Leave a Comment

Your email address will not be published. Required fields are marked *

error: Content is protected !!
Scroll to Top