def rsa_demo(p: int, q: int, e: int, message: int): """Demo's encryption and decryption with the given arguments.""" print("RSA") # find public key param n n = p * q print("Message:", message) print("Primes p & q:", p, q) print("Public key parameter n: ", n) print("Public key parameter e: ", e) # find phi(n) and private key parameter d phi_n = (p - 1) * (q - 1) d = cf.inverse_mod(e, phi_n) print("Phi(n):", phi_n) print("Private key parameter d:", d, "\n") # keys print("Public key n, e:", n, e) print("Private key n, d:", n, d, "\n") # create ciphetext c = m**e % n c = message**e % n print("Ciphertext:", c) # decrypt c to verify plaintext m m = c**d % n print("Decrypted plaintext:", m)
def paillier_demo(p: int, q: int, m: int, g: int, r: int): """Dems encryption and decryption with the given arguments.""" print("Paillier") # find public key param n n = p * q print("Message m:", m) print("Primes p & q:", p, q) print("Public key parameter n:", n) print("Public key parameter g:", g) # find private key params (ƛ, μ) ƛ = cf.lcm(p - 1, q - 1) k = cf.L((g**ƛ) % (n**2), n) μ = cf.inverse_mod(k, n) print("Private key parameter ƛ:", ƛ) print("Pre-parameter k:", k) print("Private key parameter μ:", μ, "\n") # keys print("Public key (n, g):", n, g) print("Private key (ƛ, μ):", ƛ, μ, "\n") # find ciphertext c = g**m r**n mod n**2 c = pow(g, m) * pow(r, n) % pow(n, 2) print("Ciphertext:", c) # decrpyt c to verify the plaintext m p = cf.L(pow(c, ƛ) pow(n, 2), n) * μ % n print("Decrypted plaintext:", p) return c
def generate_keys(p: int, q: int, e: int): """ Return a dict containing private and public key parameters.""" n = p * q d = cf.inverse_mod(e, (p - 1) * (q - 1)) phi_n = (p - 1) * (q - 1) return {"n": n, "e": e, "d": d, "phi_n": phi_n}
def sign(g: int, k: int, p: int, x: int, m: int): """ Return the signature parameters for a given messsage.""" r = g**k % p k1 = cf.inverse_mod(k, p - 1) val = k1 * (m - (x * r)) s = val % (p - 1) return {"r": r, "s": s}
def generate_keys(p: int, q: int, g: int): """ Return a dict containing private and public key parameters.""" n = p * q ƛ = cf.lcm(p - 1, q - 1) k = cf.L((g**ƛ) % (n**2), n) μ = cf.inverse_mod(k, n) return {"n": n, "g": g, "ƛ": ƛ, "μ": μ}
def elgamal_demo(p: int, g: int, a: int, r: int, message: int): """Demo's encryption and decryption with the given arguments.""" print("ElGamal") # find public key parameter y y = pow(g, a, p) print("Message:", message) print("Prime p:", p) print("Generator g:", g) print("Randomly chosen int r:", r) print("Public key parameter y:", y, "\n") # keys print("Public key y, g, p:", y, g, p) print("Private key a:", a, "\n") # find k k = pow(y, r, p) print("Parameter k:", k, "\n") # encrypt m to find c1 and c2 print("\n==Encryption") start_time = time.time() c1 = pow(g, r, p) c2 = message * k % p print("\nTime to encrypt:", time.time() - start_time, "seconds") print("Ciphertext c1:", c1) print("Ciphertext c2:", c2, "\n") # decrypt c1 and c2 to derive k and k1 print("\n==Decryption") start_time = time.time() d_k = pow(c1, a, p) k1 = cf.inverse_mod(k, p) print("Derived parameter k:", d_k) print("Parameter k1:", k1, "\n") # decrypt c1 and c2 to verify m m = k1 * c2 % p print("\nTime to decrypt:", time.time() - start_time, "seconds") print("Decrypted plaintext:", m, "\n") return c1, c2, g, a, p, r, y, m
def elgamal_demo(p: int, g: int, x: int, r: int, message: int): """Demo's encryption and decryption with the given arguments.""" print("ElGamal") # find public key parameter y y = g**x % p print("Message:", message) print("Prime p:", p) print("Generator g:", g) print("Randomly chosen int r:", r) print("Public key parameter y:", y, "\n") # keys print("Public key y, g, p:", y, g, p) print("Private key x:", x, "\n") # find k k = y**r % p print("Parameter k:", k, "\n") # encrypt m to find c1 and c2 c1 = g**r % p c2 = message * k % p print("Ciphertext c1:", c1) print("Ciphertext c2:", c2, "\n") # decrypt c1 and c2 to derive k and k1 d_k = c1**x % p k1 = cf.inverse_mod(k, p) print("Derived parameter k:", d_k) print("Parameter k1:", k1, "\n") # decrypt c1 and c2 to verify m m = k1 * c2 % p print("Decrypted plaintext:", m, "\n")
def rsa_demo(p: int, q: int, e: int, message: int): """Demo's encryption and decryption with the given arguments.""" print("RSA") # find public key param n n = p * q print("Message:", message) print("Primes p & q:", p, q) print("Public key parameter n: ", n) print("Public key parameter e: ", e) # find phi(n) and private key parameter d phi_n = (p - 1) * (q - 1) d = cf.inverse_mod(e, phi_n) print("Phi(n):", phi_n) print("Private key parameter d:", d, "\n") # keys print("Public key n, e:", n, e) print("Private key n, d:", n, d) # create ciphetext c = m**e % n print("\n==Encryption") start_time = time.time() c = pow(message, e, n) print("\nTime to encrypt:", time.time() - start_time, "seconds") print("Ciphertext:", c) # decrypt c to verify plaintext m print("\n==Decryption") start_time = time.time() m = pow(c, d, n) print("\nTime to decrypt:", time.time() - start_time, "seconds") print("Decrypted plaintext:", m) return c
import crypto_functions as cf m = 5 x = 8 k = 9 p = 11 g = 2 r = g**k % p k1 = cf.inverse_mod(k, p - 1) val = k1 * (m - (x * r)) print(val)
return ci21, ci22 cipher0_1, cipher0_2, g, a, p, r1, y1, m1 = elgamal_demo(1559, 55, 5, 9, 29) cipher1_1, cipher1_2, g, a, p, r2, y2, m2 = elgamal_demo(1559, 55, 5, 9, 31) cipher2_1, cipher2_2 = homomorphic(cipher0_1, cipher0_2, cipher1_1, cipher1_2, g, a) print('ci1: ', cipher2_1) print('ci2: ', cipher2_2) print("\n==Decryption") y = pow(g, a, p) r = 9 k = pow(y, r, p) start_time = time.time() d_k = pow(cipher2_1, a, p) xx = cf.inverse_mod(d_k, p) #xx = pow(cipher2_1, (11 - a)) #print(xx) mm = xx * cipher2_2 % p #mm = (pow(cipher2_1, (209490258419118348130222483494418126789-a)) * cipher2_2) % p print("\nTime to decrypt:", time.time() - start_time, "seconds") m3 = m1 * m2 % p print('\n Entschlüsselte multiplizierte Nachricht: ', mm, '\n Original multiplizierte Nachricht: ', m3) #letters: #k=s #y=h #r=y #x=a
dec3 = pow(ci3, d, n) print("\nTime to decrypt:", time.time() - start_time, "seconds") return dec3 #cipher1 = rsa_demo(7, 9, 5, int('110011', 2)) cipher1 = rsa_demo(209490258419118348130222483494418126789, 177205842835470845473200187961499093143, 320697230375185983296943967089956439199, 550304652486555850518304746550) print('\n Cipher 1:', cipher1) #cipher2 = rsa_demo(7, 9, 5, int('110101', 2)) cipher2 = rsa_demo(209490258419118348130222483494418126789, 177205842835470845473200187961499093143, 320697230375185983296943967089956439199, 22156276073203669139234564254) print('\n Cipher 2:', cipher2) cipher3 = rsa_demo( 209490258419118348130222483494418126789, 177205842835470845473200187961499093143, 320697230375185983296943967089956439199, 12192701804860537419905592943941808347725613386669159823700) print('\n Cipher 3:', cipher3) p = 209490258419118348130222483494418126789 q = 177205842835470845473200187961499093143 n = p * q phi_n = (p - 1) * (q - 1) e = 320697230375185983296943967089956439199 d = cf.inverse_mod(e, phi_n) dec = homomorphic(cipher1, cipher2, e, d) print('\n Decryption 3:', dec)