Cypto File
Cypto File
INDEX
PROGRAM 1
Aim:- Program to find GCD of any two numbers a and b mod n by Generalized Euclidean
Algorithm
CODE:-
def extended_gcd(a, b):
if a == 0:
return b, 0, 1
else:
gcd, x, y = extended_gcd(b % a, a)
return gcd, y - (b // a) * x, x
gcd, x, y = extended_gcd(a, b)
if gcd != 1:
else:
return (x % n + n) % n
gcd_modulus = gcd_mod(a, b, n)
if gcd_modulus is None:
else:
print("GCD of", a, "and", b, "modulo", n, "is", gcd_modulus)
OUTPUT:-
PROGRAM 2
CODE:-
def extended_gcd(a, b):
if a == 0:
return b, 0, 1
else:
gcd, x, y = extended_gcd(b % a, a)
return gcd, y - (b // a) * x, x
gcd, x, y = extended_gcd(b, p)
if gcd != 1:
else:
return (x % p + p) % p
inverse = multiplicative_inverse(b, p)
if inverse is None:
else:
CODE:-
def encrypt(text, shift):
result = ""
if char.isupper():
elif char.islower():
else:
result += char
return result
CODE:-
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
g, x, y = egcd(a, m)
if g != 1:
else:
return x % m
result = ""
if char.isalpha():
if char.isupper():
elif char.islower():
else:
result += char
return result
result = ""
if char.isalpha():
if char.isupper():
elif char.islower():
else:
result += char
return result
encrypted_text = encrypt(text, a, b)
decrypted_text = decrypt(encrypted_text, a, b)
CODE:-
def generate_key_square(key):
key_square = ""
key_square += char
key_square += chr(i)
return key_square
def prepare_text(plaintext):
prepared_text = ""
i=0
prepared_text += plaintext[i]
prepared_text += "X"
i += 1
if len(prepared_text) % 2 != 0:
prepared_text += "X"
return prepared_text
row = 0
col = 0
for i in range(5):
for j in range(5):
if key_square[5 * i + j] == letter:
row = i
col = j
break
key_square = generate_key_square(key)
plaintext = prepare_text(plaintext)
ciphertext = ""
char1 = plaintext[i]
char2 = plaintext[i + 1]
if row1 == row2:
else:
ciphertext += key_square[row1 * 5 + col2]
return ciphertext
OUTPUT:-
PROGRAM 6
AIM:- Program to generate addition and multiplication table for GF(22 ) Field
CODE:-
def add_GF2(x, y):
return x ^ y
result = 0
while y:
if y & 1:
result ^= x
y >>= 1
x <<= 1
if x & 0b100:
x ^= 0b101
return result
def generate_addition_table():
print("| + | 0 | 1 | a | b |")
print("|---|----|----|----|----|")
for i in range(4):
for j in range(4):
print()
def generate_multiplication_table():
print("| x | 0 | 1 | a | b |")
print("|---|----|----|----|----|")
for i in range(4):
for j in range(4):
print()
generate_addition_table()
generate_multiplication_table()
OUTPUT:-
PROGRAM 7
CODE:-
def left_shift(key, bits):
shifted_key = (key << bits) & 0xFFFFFFFFFFFFFFFF
overflow = shifted_key >> 56
return (shifted_key | overflow) & 0xFFFFFFFFFFFFFFFF
def generate_subkeys(key):
# PC-1
pc1_table = [
57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4
]
# PC-2
pc2_table = [
14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32
]
# Apply PC-1
key_permuted = 0
for i in range(56):
key_permuted |= (key >> (64 - pc1_table[i])) & 0x01
key_permuted <<= 1
key_permuted >>= 1
subkeys = []
for i in range(16):
c = left_shift(c, 2 if i in [0, 1, 8, 15] else 1)
d = left_shift(d, 2 if i in [0, 1, 8, 15] else 1)
# Apply PC-2
subkey = 0
for j in range(48):
subkey |= ((c if j < 28 else d) >> (56 - pc2_table[j])) & 0x01
subkey <<= 1
subkey >>= 1
subkeys.append(subkey)
return subkeys
def main():
key = int(input("Enter the 64-bit key in hexadecimal: "), 16)
subkeys = generate_subkeys(key)
if __name__ == "__main__":
main()
OUTPUT:-
PROGRAM 8
a.) Check given table of S-box and inverse S-box are invertible to each other.
CODE:-
def create_s_box():
s_box = [
return s_box
def create_inverse_s_box():
s_box = create_s_box()
for i in range(4):
for j in range(4):
return inverse_s_box
for i in range(4):
for j in range(4):
if s_box[i][j] != inverse_s_box[i][j]:
return False
return True
def main():
s_box = create_s_box()
inverse_s_box = create_inverse_s_box()
print("S-box:")
print(row)
print("\nInverse S-box:")
print(row)
if check_invertibility(s_box, inverse_s_box):
print("\nThe given S-box and its inverse are invertible to each other.")
else:
print("\nThe given S-box and its inverse are not invertible to each other.")
if __name__ == "__main__":
main()
OUTPUT:-
B)Ask the user to enter input to be given in S-box and return its output.
CODE:-
# Define the S-box
s_box = [
def s_box_lookup(input):
return s_box[row][col]
def main():
output_value = s_box_lookup(input_value)
if __name__ == "__main__":
main()
OUTPUT:-
PROGRAM 9
CODE:-
import random
def is_prime(n, k=5):
if n <= 1:
return False
if n <= 3:
return True
for _ in range(k):
a = random.randint(2, n - 1)
if pow(a, n - 1, n) != 1:
return False
return True
def generate_prime(bits):
while True:
p = random.getrandbits(bits)
if is_prime(p):
return p
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
def multiplicative_inverse(e, phi):
d=0
x1, x2 = 0, 1
y1, y2 = 1, 0
temp_phi = phi
while e > 0:
temp1 = temp_phi // e
temp2 = temp_phi - temp1 * e
temp_phi = e
e = temp2
x = x2 - temp1 * x1
y = y2 - temp1 * y1
x2 = x1
x1 = x
y2 = y1
y1 = y
if temp_phi == 1:
return y2 + phi
OUTPUT:-