- 1. AES
- REC
- import socket
- INV_S_BOX_STRING = '52 09 6a d5 30 36 a5 38 bf 40 a3 9e 81 f3 d7 fb' \
- '7c e3 39 82 9b 2f ff 87 34 8e 43 44 c4 de e9 cb' \
- '54 7b 94 32 a6 c2 23 3d ee 4c 95 0b 42 fa c3 4e' \
- '08 2e a1 66 28 d9 24 b2 76 5b a2 49 6d 8b d1 25' \
- '72 f8 f6 64 86 68 98 16 d4 a4 5c cc 5d 65 b6 92' \
- '6c 70 48 50 fd ed b9 da 5e 15 46 57 a7 8d 9d 84' \
- '90 d8 ab 00 8c bc d3 0a f7 e4 58 05 b8 b3 45 06' \
- 'd0 2c 1e 8f ca 3f 0f 02 c1 af bd 03 01 13 8a 6b' \
- '3a 91 11 41 4f 67 dc ea 97 f2 cf ce f0 b4 e6 73' \
- '96 ac 74 22 e7 ad 35 85 e2 f9 37 e8 1c 75 df 6e' \
- '47 f1 1a 71 1d 29 c5 89 6f b7 62 0e aa 18 be 1b' \
- 'fc 56 3e 4b c6 d2 79 20 9a db c0 fe 78 cd 5a f4' \
- '1f dd a8 33 88 07 c7 31 b1 12 10 59 27 80 ec 5f' \
- '60 51 7f a9 19 b5 4a 0d 2d e5 7a 9f 93 c9 9c ef' \
- 'a0 e0 3b 4d ae 2a f5 b0 c8 eb bb 3c 83 53 99 61' \
- '17 2b 04 7e ba 77 d6 26 e1 69 14 63 55 21 0c 7d'.replace(" ", "")
- S_BOX_STRING = '63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76' \
- 'ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0' \
- 'b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15' \
- '09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84' \
- '53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf' \
- 'd0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8' \
- '51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2' \
- 'cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73' \
- '60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db' \
- 'e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79' \
- 'e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08' \
- 'ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a' \
- '70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e' \
- 'e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df' \
- '8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16'.replace(" ", "")
- S_BOX = bytearray.fromhex(S_BOX_STRING)
- INV_S_BOX = bytearray.fromhex(INV_S_BOX_STRING)
- def inv_shift_rows(state: [[int]]) -> [[int]]:
- state[1][1], state[2][1], state[3][1], state[0][1] = state[0][1], state[1][1], state[2][1], state[3][1]
- state[2][2], state[3][2], state[0][2], state[1][2] = state[0][2], state[1][2], state[2][2], state[3][2]
- state[3][3], state[0][3], state[1][3], state[2][3] = state[0][3], state[1][3], state[2][3], state[3][3]
- return
- def inv_sub_bytes(state: [[int]]) -> [[int]]:
- for r in range(len(state)):
- state[r] = [INV_S_BOX[state[r][c]] for c in range(len(state[0]))]
- def xtime(a: int) -> int:
- if a & 0x80:
- return ((a << 1) ^ 0x1b) & 0xff
- return a << 1
- def xtimes_0e(b):
- # 0x0e = 14 = b1110 = ((x * 2 + x) * 2 + x) * 2
- return xtime(xtime(xtime(b) ^ b) ^ b)
- def xtimes_0b(b):
- # 0x0b = 11 = b1011 = ((x*2)*2+x)*2+x
- return xtime(xtime(xtime(b)) ^ b) ^ b
- def xtimes_0d(b):
- # 0x0d = 13 = b1101 = ((x*2+x)*2)*2+x
- return xtime(xtime(xtime(b) ^ b)) ^ b
- def xtimes_09(b):
- # 0x09 = 9 = b1001 = ((x*2)*2)*2+x
- return xtime(xtime(xtime(b))) ^ b
- def mix_column(col: [int]):
- c_0 = col[0]
- all_xor = col[0] ^ col[1] ^ col[2] ^ col[3]
- col[0] ^= all_xor ^ xtime(col[0] ^ col[1])
- col[1] ^= all_xor ^ xtime(col[1] ^ col[2])
- col[2] ^= all_xor ^ xtime(col[2] ^ col[3])
- col[3] ^= all_xor ^ xtime(c_0 ^ col[3])
- def mix_columns(state: [[int]]):
- for r in state:
- mix_column(r)
- def state_from_bytes(data: bytes) -> [[int]]:
- state = [data[i*4:(i+1)*4] for i in range(len(data) // 4)]
- return state
- def bytes_from_state(state: [[int]]) -> bytes:
- return bytes(state[0] + state[1] + state[2] + state[3])
- def add_round_key(state: [[int]], key_schedule: [[[int]]], round: int):
- round_key = key_schedule[round]
- for r in range(len(state)):
- state[r] = [state[r][c] ^ round_key[r][c] for c in range(len(state[0]))]
- def inv_mix_column(col: [int]):
- c_0, c_1, c_2, c_3 = col[0], col[1], col[2], col[3]
- col[0] = xtimes_0e(c_0) ^ xtimes_0b(c_1) ^ xtimes_0d(c_2) ^ xtimes_09(c_3)
- col[1] = xtimes_09(c_0) ^ xtimes_0e(c_1) ^ xtimes_0b(c_2) ^ xtimes_0d(c_3)
- col[2] = xtimes_0d(c_0) ^ xtimes_09(c_1) ^ xtimes_0e(c_2) ^ xtimes_0b(c_3)
- col[3] = xtimes_0b(c_0) ^ xtimes_0d(c_1) ^ xtimes_09(c_2) ^ xtimes_0e(c_3)
- def inv_mix_columns(state: [[int]]) -> [[int]]:
- for g in state:
- inv_mix_column(r)
- def inv_mix_column_optimized(col: [int]):
- u = xtime(xtime(col[0] ^ col[2]))
- v = xtime(xtime(col[1] ^ col[3]))
- col[0] ^= u
- col[1] ^= v
- col[2] ^= u
- col[3] ^= v
- def inv_mix_columns_optimized(state: [[int]]) -> [[int]]:
- for r in state:
- inv_mix_column_optimized(r)
- mix_columns(state)
- def xor_bytes(a: bytes, b: bytes) -> bytes:
- return bytes([x ^ y for (x, y) in zip(a, b)])
- def rot_word(word: [int]) -> [int]:
- return word[1:] + word[:1]
- def sub_word(word: [int]) -> bytes:
- substituted_word = bytes(S_BOX[i] for i in word)
- return substituted_word
- def rcon(i: int) -> bytes:
- rcon_lookup = bytearray.fromhex('0102040810204081b36')
- rcon_value = bytes([rcon_lookup[i-1], 0, 0, 0])
- return rcon_value
- def key_expansion(key: bytes, nb: int = 4) -> [[[int]]]:
- nk = len(key) // 4
- key_bit_length = len(key) * 8
- if key_bit_length == 128:
- nr = 10
- elif key_bit_length == 192:
- nr = 12
- else: # 256-bit keys
- nr = 14
- w = state_from_bytes(key)
- for i in range(nk, nb * (nr + 1)):
- temp = w[i-1]
- if i % nk == 0:
- temp = xor_bytes(sub_word(rot_word(temp)), rcon(i // nk))
- elif nk > 6 and i % nk == 4:
- temp = sub_word(temp)
- w.append(xor_bytes(w[i - nk], temp))
- return [w[i*4:(i+1)*4] for i in range(len(w) // 4)]
- def aes_decryption(cipher: bytes, key: bytes) -> bytes:
- key_byte_length = len(key)
- key_bit_length = key_byte_length * 8
- nk = key_byte_length // 4
- if key_bit_length == 128:
- nr = 10
- elif key_bit_length == 192:
- nr = 12
- else: # 256-bit keys
- nr = 14
- state = state_from_bytes(cipher)
- key_schedule = key_expansion(key)
- add_round_key(state, key_schedule, round=nr)
- for round in range(nr, 0, -1):
- inv_shift_rows(state)
- inv_sub_bytes(state)
- add_round_key(state, key_schedule, round)
- inv_mix_columns(state)
- print("Round ", round, " : ", state)
- inv_shift_rows(state)
- inv_sub_bytes(state)
- add_round_key(state, key_schedule, round=0)
- plain = bytes_from_state(state)
- return plain
- key = bytearray.fromhex('00010203040060708090a0b0c0d0e0f')
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.bind(('127.0.0.1', 1111))
- s.listen(1)
- conn, addr = s.accept()
- data = conn.recv(1024)
- print("Received Encrypted Data: ", data)
- print("Decrypted Data: ", aes_decryption(data, key).decode('utf-8'))
- conn.close()
- #1st run receiver.py tehn run sender.py then put in the value in the sender.py and see the output in the receiver.py
- SEN
- import socket
- # CONSTANTS
- S_BOX_STRING = '63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76' \
- 'ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0' \
- 'b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15' \
- '04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75' \
- '09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84' \
- '53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf' \
- 'd0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8' \
- '51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2' \
- 'cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73' \
- '60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db' \
- 'e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79' \
- 'e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08' \
- 'ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a' \
- '70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e' \
- '8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16'.replace(" ", "")
- S_BOX = bytearray.fromhex(S_BOX_STRING)
- def sub_word(word: [int]) -> bytes:
- substituted_word = bytes(S_BOX[i] for i in word)
- return substituted_word
- def rcon(i: int) -> bytes:
- rcon_lookup = bytearray.fromhex('0100408102040801b36')
- rcon_value = bytes([rcon_lookup[i-1], 0, 0, 0])
- return rcon_value
- def xor_bytes(a: bytes, b: bytes) -> bytes:
- return bytes([x ^ y for (x, y) in zip(a, b)])
- def rot_word(word: [int]) -> [int]:
- return word[1:] + word[:1]
- def key_expansion(key: bytes, nb: int = 4) -> [[[int]]]:
- nk = len(key) // 4
- key_bit_length = len(key) * 8
- if key_bit_length == 128:
- nr = 10
- elif key_bit_length == 192:
- nr = 12
- else: # 256-bit keys
- nr = 14
- w = state_from_bytes(key)
- for i in range(nk, nb * (nr + 1)):
- temp = w[i-1]
- if i % nk == 0:
- temp = xor_bytes(sub_word(rot_word(temp)), rcon(i // nk))
- elif nk > 6 and i % nk == 4:
- temp = sub_word(temp)
- w.append(xor_bytes(w[i - nk], temp))
- return [w[i*4:(i+1)*4] for i in range(len(w) // 4)]
- def add_round_key(state: [[int]], key_schedule: [[[int]]], round: int):
- round_key = key_schedule[round]
- for r in range(len(state)):
- state[r] = [state[r][c] ^ round_key[r][c] for c in range(len(state[0]))]
- def sub_bytes(state: [[int]]):
- for r in range(len(state)):
- state[r] = [S_BOX[state[r][c]] for c in range(len(state[0]))]
- def shift_rows(state: [[int]]):
- state[0][1], state[1][1], state[2][1], state[3][1] = state[1][1], state[2][1], state[3][1], state[0][1]
- state[0][2], state[1][2], state[2][2], state[3][2] = state[2][2], state[3][2], state[0][2], state[1][2]
- state[0][3], state[1][3], state[2][3], state[3][3] = state[3][3], state[0][3], state[1][3], state[2][3]
- def xtime(a: int) -> int:
- if a & 0x80:
- return ((a << 1) ^ 0x1b) & 0xff
- return a << 1
- def mix_column(col: [int]):
- c_0 = col[0]
- all_xor = col[0] ^ col[1] ^ col[2] ^ col[3]
- col[0] ^= all_xor ^ xtime(col[0] ^ col[1])
- col[1] ^= all_xor ^ xtime(col[1] ^ col[2])
- col[2] ^= all_xor ^ xtime(col[2] ^ col[3])
- col[3] ^= all_xor ^ xtime(c_0 ^ col[3])
- def mix_columns(state: [[int]]):
- for r in state:
- mix_column(r)
- def state_from_bytes(data: bytes) -> [[int]]:
- state = [data[i*4:(i+1)*4] for i in range(len(data) // 4)]
- return state
- def bytes_from_state(state: [[int]]) -> bytes:
- return bytes(state[0] + state[1] + state[2] + state[3])
- def aes_encryption(data: bytes, key: bytes) -> bytes:
- state = state_from_bytes(data)
- key_schedule = key_expansion(key)
- add_round_key(state, key_schedule, round=0)
- for round in range(1, 11):
- sub_bytes(state)
- shift_rows(state)
- mix_columns(state)
- add_round_key(state, key_schedule, round)
- print("Round ", round, " : ", state)
- sub_bytes(state)
- shift_rows(state)
- add_round_key(state, key_schedule, round=10)
- cipher = bytes_from_state(state)
- return cipher
- if name == "main":
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- server_address = ('127.0.0.1', 1111)
- s.connect(server_address)
- plaintext = input("Enter the plaintext: ")
- block_size = 16
- padding_length = block_size - (len(plaintext) % block_size)
- plaintext += chr(padding_length) * padding_length
- plaintext_bytes = plaintext.encode()
- key = bytearray.fromhex('00010203040060708090a0b0c0d0e0f')
- ciphertext = aes_encryption(plaintext_bytes, key)
- print("Ciphertext (hex): ", ciphertext.hex())
- s.sendall(ciphertext)
- 2. DES
- CLIENT
- import socket
- INITIAL_PERM = [58, 50, 42, 34, 26, 18, 10, 2,
- 60, 52, 44, 36, 28, 20, 12, 4,
- 62, 54, 46, 38, 30, 22, 14, 6,
- 64, 56, 48, 40, 32, 24, 16, 8,
- 57, 49, 41, 33, 25, 17, 9, 1,
- 59, 51, 43, 35, 27, 19, 11, 3,
- 61, 53, 45, 37, 29, 21, 13, 5,
- 63, 55, 47, 39, 31, 23, 15, 7]
- D = [32, 1, 2, 3, 4, 5, 4, 5,
- 6, 7, 8, 9, 8, 9, 10, 11,
- 12, 13, 12, 13, 14, 15, 16, 17,
- 16, 17, 18, 19, 20, 21, 20, 21,
- 22, 23, 24, 25, 24, 25, 26, 27,
- 28, 29, 28, 29, 30, 31, 32, 1]
- PERM = [16, 7, 20, 21,
- 29, 12, 28, 17,
- 1, 15, 23, 26,
- 5, 18, 31, 10,
- 2, 8, 24, 14,
- 32, 27, 3, 9,
- 19, 13, 30, 6,
- 22, 11, 4, 25]
- SBOX = [[[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
- [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
- [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
- [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]],
- [[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
- [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
- [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
- [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]],
- [[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
- [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
- [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
- [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]],
- [[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
- [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
- [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
- [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]],
- [[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],
- [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],
- [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],
- [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]],
- [[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],
- [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],
- [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],
- [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]],
- [[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],
- [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],
- [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],
- [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]],
- [[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],
- [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],
- [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],
- [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]]]
- FPERM = [40, 8, 48, 16, 56, 24, 64, 32,
- 39, 7, 47, 15, 55, 23, 63, 31,
- 38, 6, 46, 14, 54, 22, 62, 30,
- 37, 5, 45, 13, 53, 21, 61, 29,
- 36, 4, 44, 12, 52, 20, 60, 28,
- 35, 3, 43, 11, 51, 19, 59, 27,
- 33, 1, 41, 9, 49, 17, 57, 25]
- # --parity bit drop table
- KEYP = [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]
- # Number of bit shifts
- SHIFT_TABLE = [1, 1, 2, 2,
- 2, 2, 2, 2,
- 1, 2, 2, 2,
- 2, 2, 2, 1]
- # Key- Compression Table : Compression of key from 56 bits to 48 bits
- KEY_COMP = [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]
- def hex2bin(s):
- mp = {'0': "0000",
- '1': "0001",
- '2': "0010",
- '3': "0011",
- '4': "0100",
- '5': "0101",
- '6': "0110",
- '7': "0111",
- '8': "1000",
- '9': "1001",
- 'A': "1010",
- 'B': "1011",
- 'C': "1100",
- 'D': "1101",
- 'E': "1110",
- 'F': "1111"}
- bin = ""
- for i in range(len(s)):
- bin = bin + mp[s[i]]
- return bin
- def bin2hex(s):
- mp = {"0000": '0',
- "0001": '1',
- "0010": '2',
- "0011": '3',
- "0100": '4',
- "0101": '5',
- "0110": '6',
- "0111": '7',
- "1000": '8',
- "1001": '9',
- "1010": 'A',
- "1011": 'B',
- "1100": 'C',
- "1101": 'D',
- "1110": 'E',
- "1111": 'F'}
- hex = ""
- for i in range(0, len(s), 4):
- ch = ""
- ch = ch + s[i]
- ch = ch + s[i + 1]
- ch = ch + s[i + 2]
- ch = ch + s[i + 3]
- hex = hex + mp[ch]
- return hex
- def bin2dec(binary):
- binary1 = binary
- decimal, i, n = 0, 0, 0
- while(binary != 0):
- dec = binary % 10
- decimal = decimal + dec * pow(2, i)
- binary = binary//10
- i += 1
- return decimal
- def dec2bin(num):
- res = bin(num).replace("0b", "")
- if(len(res) % 4 != 0):
- div = len(res) / 4
- div = int(div)
- counter = (4 * (div + 1)) - len(res)
- for i in range(0, counter):
- res = '0' + res
- return res
- def permute(k, arr, n):
- permutation = ""
- for i in range(0, n):
- permutation = permutation + k[arr[i] - 1]
- return permutation
- def shift_left(k, nth_shifts):
- s = ""
- for i in range(nth_shifts):
- for j in range(1, len(k)):
- s = s + k[j]
- s = s + k[0]
- k = s
- s = ""
- return k
- def xor(a, b):
- ans = ""
- for i in range(len(a)):
- if a[i] == b[i]:
- ans = ans + "0"
- else:
- ans = ans + "1"
- return ans
- def encrypt(pt, rkb, rk):
- pt = hex2bin(pt)
- pt = permute(pt, INITIAL_PERM, 64)
- print("After initial permutation", bin2hex(pt))
- left = pt[0:32]
- right = pt[32:64]
- for i in range(0, 16):
- right_expanded = permute(right, D, 48)
- xor_x = xor(right_expanded, rkb[i])
- sbox_str = ""
- for j in range(0, 8):
- row = bin2dec(int(xor_x[j * 6] + xor_x[j * 6 + 5]))
- col = bin2dec(
- int(xor_x[j * 6 + 1] + xor_x[j * 6 + 2] + xor_x[j * 6 + 3] + xor_x[j * 6 + 4]))
- val = SBOX[j][row][col]
- sbox_str = sbox_str + dec2bin(val)
- sbox_str = permute(sbox_str, PERM, 32)
- result = xor(left, sbox_str)
- left = result
- if(i != 15):
- left, right = right, left
- print("Round ", i + 1, " ", bin2hex(left),
- " ", bin2hex(right), " ", rk[i])
- combine = left + right
- cipher_text = permute(combine, FPERM, 64)
- return cipher_text
- def keygen(key):
- key = hex2bin(key)
- key = permute(key, KEYP, 56)
- left = key[0:28]
- right = key[28:56]
- rkb = []
- rk = []
- for i in range(0, 16):
- left = shift_left(left, SHIFT_TABLE[i])
- right = shift_left(right, SHIFT_TABLE[i])
- combine_str = left + right
- round_key = permute(combine_str, KEY_COMP, 48)
- rkb.append(round_key)
- rk.append(bin2hex(round_key))
- return rkb, rk
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- port = 1234
- ip = '127.0.0.1'
- s.connect((ip, port))
- data = input("Enter Hexadecimal data to send: ")
- key ="AABB09182736CCDD"
- rkb, rk = keygen(key)
- cipher_text = bin2hex(encrypt(data, rkb, rk))
- print("Cipher Text : ", cipher_text)
- s.send(cipher_text.encode())
- s.close()
- SENDER
- import socket
- INITIAL_PERM = [58, 50, 42, 34, 26, 18, 10, 2,
- 60, 52, 44, 36, 28, 20, 12, 4,
- 62, 54, 46, 38, 30, 22, 14, 6,
- 64, 56, 48, 40, 32, 24, 16, 8,
- 57, 49, 41, 33, 25, 17, 9, 1,
- 59, 51, 43, 35, 27, 19, 11, 3,
- 61, 53, 45, 37, 29, 21, 13, 5,
- 63, 55, 47, 39, 31, 23, 15, 7]
- D = [32, 1, 2, 3, 4, 5, 4, 5,
- 6, 7, 8, 9, 8, 9, 10, 11,
- 12, 13, 12, 13, 14, 15, 16, 17,
- 16, 17, 18, 19, 20, 21, 20, 21,
- 22, 23, 24, 25, 24, 25, 26, 27,
- 28, 29, 28, 29, 30, 31, 32, 1]
- PERM = [16, 7, 20, 21,
- 29, 12, 28, 17,
- 1, 15, 23, 26,
- 5, 18, 31, 10,
- 2, 8, 24, 14,
- 32, 27, 3, 9,
- 19, 13, 30, 6,
- 22, 11, 4, 25]
- SBOX = [[[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
- [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
- [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
- [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]],
- [[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
- [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
- [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
- [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]],
- [[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
- [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
- [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
- [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]],
- [[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
- [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
- [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
- [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]],
- [[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],
- [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],
- [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],
- [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]],
- [[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],
- [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],
- [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],
- [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]],
- [[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],
- [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],
- [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],
- [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]],
- [[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],
- [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],
- [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],
- [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]]]
- FPERM = [40, 8, 48, 16, 56, 24, 64, 32,
- 39, 7, 47, 15, 55, 23, 63, 31,
- 38, 6, 46, 14, 54, 22, 62, 30,
- 37, 5, 45, 13, 53, 21, 61, 29,
- 36, 4, 44, 12, 52, 20, 60, 28,
- 35, 3, 43, 11, 51, 19, 59, 27,
- 34, 2, 42, 10, 50, 18, 58, 26,
- 33, 1, 41, 9, 49, 17, 57, 25]
- # --parity bit drop table
- KEYP = [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]
- # Number of bit shifts
- SHIFT_TABLE = [1, 1, 2, 2,
- 2, 2, 2, 2,
- 1, 2, 2, 2,
- 2, 2, 2, 1]
- # Key- Compression Table : Compression of key from 56 bits to 48 bits
- KEY_COMP = [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]
- def hex2bin(s):
- mp = {'0': "0000",
- '1': "0001",
- '2': "0010",
- '3': "0011",
- '4': "0100",
- '5': "0101",
- '6': "0110",
- '7': "0111",
- '8': "1000",
- '9': "1001",
- 'A': "1010",
- 'B': "1011",
- 'C': "1100",
- 'D': "1101",
- 'E': "1110",
- 'F': "1111"}
- bin = ""
- for i in range(len(s)):
- bin = bin + mp[s[i]]
- return bin
- def bin2hex(s):
- mp = {"0000": '0',
- "0001": '1',
- "0010": '2',
- "0011": '3',
- "0100": '4',
- "0101": '5',
- "0110": '6',
- "0111": '7',
- "1000": '8',
- "1001": '9',
- "1010": 'A',
- "1011": 'B',
- "1100": 'C',
- "1101": 'D',
- "1110": 'E',
- "1111": 'F'}
- hex = ""
- for i in range(0, len(s), 4):
- ch = ""
- ch = ch + s[i]
- ch = ch + s[i + 1]
- ch = ch + s[i + 2]
- ch = ch + s[i + 3]
- hex = hex + mp[ch]
- return hex
- def bin2dec(binary):
- binary1 = binary
- decimal, i, n = 0, 0, 0
- while(binary != 0):
- dec = binary % 10
- decimal = decimal + dec * pow(2, i)
- binary = binary//10
- i += 1
- return decimal
- def dec2bin(num):
- res = bin(num).replace("0b", "")
- if(len(res) % 4 != 0):
- div = len(res) / 4
- div = int(div)
- counter = (4 * (div + 1)) - len(res)
- for i in range(0, counter):
- res = '0' + res
- return res
- def permute(k, arr, n):
- permutation = ""
- for i in range(0, n):
- permutation = permutation + k[arr[i] - 1]
- return permutation
- def shift_left(k, nth_shifts):
- s = ""
- for i in range(nth_shifts):
- for j in range(1, len(k)):
- s = s + k[j]
- s = s + k[0]
- k = s
- s = ""
- return k
- def xor(a, b):
- ans = ""
- for i in range(len(a)):
- if a[i] == b[i]:
- ans = ans + "1"
- else:
- ans = ans + "0"
- return ans
- def encrypt(pt, rkb, rk):
- pt = hex2bin(pt)
- # Initial Permutation
- pt = permute(pt, INITIAL_PERM, 64)
- print("After initial permutation", bin2hex(pt))
- # Splitting
- left = pt[0:32]
- right = pt[32:64]
- for i in range(0, 16):
- # Expansion D-box: Expanding the 32 bits data into 48 bits
- right_expanded = permute(right, D, 48)
- xor_x = xor(right_expanded, rkb[i])
- sbox_str = ""
- for j in range(0, 8):
- row = bin2dec(int(xor_x[j * 6] + xor_x[j * 6 + 5]))
- col = bin2dec(
- int(xor_x[j * 6 + 1] + xor_x[j * 6 + 2] + xor_x[j * 6 + 3] + xor_x[j * 6 + 4]))
- val = SBOX[j][row][col]
- sbox_str = sbox_str + dec2bin(val)
- sbox_str = permute(sbox_str, PERM, 32)
- result = xor(left, sbox_str)
- left = result
- if(i != 15):
- left, right = right, left
- print("Round ", i + 1, " ", bin2hex(left),
- " ", bin2hex(right), " ", rk[i])
- combine = left + right
- cipher_text = permute(combine, FPERM, 64)
- return cipher_text
- def keygen(key):
- key = hex2bin(key)
- key = permute(key, KEYP, 56)
- left = key[0:28]
- right = key[28:56]
- rkb = []
- rk = []
- for i in range(0, 16):
- left = shift_left(left, SHIFT_TABLE[i])
- right = shift_left(right, SHIFT_TABLE[i])
- combine_str = left + right
- round_key = permute(combine_str, KEY_COMP, 48)
- rkb.append(round_key)
- rk.append(bin2hex(round_key))
- return rkb, rk
- key = input("Enter the hex key: ")
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- port = 1234
- ip = '127.0.0.1'
- s.bind((ip, port))
- s.listen(5)
- c, addr = s.accept()
- data = c.recv(1024).decode()
- rkb, rk = keygen(key)
- print("Decryption")
- rkb_rev = rkb[::-1]
- rk_rev = rk[::-1]
- text = bin2hex(encrypt(data, rkb_rev, rk_rev))
- print("Plain Text : ", text)
- 3. DIFFY
- BOB
- import socket
- import math
- def mod_exp(base, exponent, modulus):
- return pow(base, exponent, modulus)
- def compute_Y(alpha, X, q):
- return mod_exp(alpha, X, q)
- def compute_shared_key(Y, X, q):
- return mod_exp(Y, X, q)
- def bob():
- alpha = 15 # Specified value
- q = 12 # Specified value
- XB = int(input("Enter XB for Bob: "))
- YB = compute_Y(alpha, XB, q)
- print(f"YB={YB}")
- # Communicate with Dart
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s_dart:
- s_dart.bind(('localhost', 5002))
- s_dart.listen(1)
- print("Bob terminal is listening for Dart on port 5002")
- conn_dart, addr_dart = s_dart.accept()
- with conn_dart:
- print(f"Connection established with Dart: {addr_dart}")
- # Receive YD1 from Dart
- YD1_dart = int(conn_dart.recv(1024).decode('utf-8'))
- print(f"Received YD1 from Dart: {YD1_dart}")
- # Additional communication with Dart can be added here if needed
- # Compute and display K1
- K1 = compute_shared_key(YD1_dart, XB, q)
- print(f"K1={K1}")
- if _name_ == "_main_":
- bob()
- ALICE
- import socket
- import math
- def mod_exp(base, exponent, modulus):
- return pow(base, exponent, modulus)
- def compute_Y(alpha, X, q):
- return mod_exp(alpha, X, q)
- def compute_shared_key(Y, X, q):
- return mod_exp(Y, X, q)
- def alice():
- alpha = 15 # Specified value
- q = 12 # Specified value
- X = int(input("Enter XA for Alice: "))
- YA = compute_Y(alpha, X, q)
- print(f"YA={YA}")
- # Communicate with Dart
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s_dart:
- s_dart.connect(('localhost', 5001))
- s_dart.send(','.join([str(x) for x in [alpha, X, q, YA]]).encode('utf-8'))
- # Receive YD2 from Dart
- YD2_dart = int(s_dart.recv(1024).decode('utf-8'))
- print(f"Received YD2 from Dart: {YD2_dart}")
- # Compute and display K2
- K2 = compute_shared_key(YD2_dart, X, q)
- print(f"K2={K2}")
- if _name_ == "_main_":
- alice()
- DARTH
- import socket
- import math
- def mod_exp(base, exponent, modulus):
- return pow(base, exponent, modulus)
- def compute_Y(alpha, X, q):
- return mod_exp(alpha, X, q)
- def compute_k1(YB, XD1, q):
- return mod_exp(YB, 5, q)
- def compute_k2(YA, XD2, q):
- return mod_exp(YA, XD2, q)
- def compute_shared_key(Y, X, q):
- return mod_exp(Y, X, q)
- def dart():
- alpha = 15 # Specified value
- q = 12 # Specified value
- # Communicate with Alice
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s_alice:
- s_alice.bind(('localhost', 5001))
- s_alice.listen(1)
- print("Dart terminal is listening for Alice on port 5001")
- conn_alice, addr_alice = s_alice.accept()
- with conn_alice:
- print(f"Connection established with Alice: {addr_alice}")
- data_alice = conn_alice.recv(1024).decode('utf-8')
- alpha, X, q, YA = map(int, data_alice.split(','))
- print(f"Received data from Alice: alpha={alpha}, X={X}, q={q}, YA={YA}")
- XD1 = int(input("Enter XD1: "))
- XD2 = int(input("Enter XD2: "))
- YD1 = compute_Y(alpha, XD1, q)
- YD2 = compute_Y(alpha, XD2, q)
- print(f"YD1={YD1}, YD2={YD2}")
- K1 = compute_k1(YD1, XD1, q)
- K2 = compute_k2(YD2, X, q)
- print(f"K1={K1}, K2={K2}")
- # Send YD2 to Alice
- conn_alice.send(str(YD2).encode('utf-8'))
- # Send YD1 to Bob
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s_bob:
- s_bob.connect(('localhost', 5002))
- s_bob.send(str(YD1).encode('utf-8'))
- # Additional communication with Bob can be added here if needed
- if _name_ == "_main_":
- dart()
- 4. MD5
- import math
- # Define MD5 specific functions
- def F(X, Y, Z):
- return (X & Y) | (~X & Z)
- def G(X, Y, Z):
- return (X & Z) | (Y & ~Z)
- def H(X, Y, Z):
- return X ^ Y ^ Z
- def I(X, Y, Z):
- return Y ^ (X | ~Z)
- # Define shift and constant values
- s = [
- 7, 12, 17, 22,
- 5, 9, 14, 20,
- 4, 11, 16, 23,
- 6, 10, 15, 21
- ]
- K = [int(abs(math.sin(i + 1)) * 2 ** 32) & 0xFFFFFFFF for i in range(64)]
- # Initialize variables
- A = 0x01234567
- B = 0x89ABCDEF
- C = 0xFEDCBA98
- D = 0x76543210
- def md5(message):
- global A, B, C, D
- message = bytearray(message, 'utf-8')
- for i in range(0, len(message), 64):
- X = [0] * 16
- for j in range(16):
- X[j] = int.from_bytes(message[i + j*4:i + j*4 + 4], byteorder='little')
- AA, BB, CC, DD = A, B, C, D
- # Round 1
- for j in range(16):
- A = (B + ((A + F(B, C, D) + X[j] + K[j]) & 0xFFFFFFFF) << s[j % 4] | (A + F(B, C, D) + X[j] + K[j]) >> (32 - s[j % 4])) & 0xFFFFFFFF
- A, B, C, D = D, A, B, C
- print(f"Round 1 - Final Output: {A:08x} {B:08x} {C:08x} {D:08x}")
- # Round 2
- for j in range(16):
- A = (B + ((A + G(B, C, D) + X[(1 + 5*j) % 16] + K[16+j]) & 0xFFFFFFFF) << s[j % 4 + 4] | (A + G(B, C, D) + X[(1 + 5*j) % 16] + K[16+j]) >> (32 - s[j % 4 + 4])) & 0xFFFFFFFF
- A, B, C, D = D, A, B, C
- print(f"Round 2 - Final Output: {A:08x} {B:08x} {C:08x} {D:08x}")
- # Round 3
- for j in range(16):
- A = (B + ((A + H(B, C, D) + X[(5 + 3*j) % 16] + K[32+j]) & 0xFFFFFFFF) << s[j % 4 + 8] | (A + H(B, C, D) + X[(5 + 3*j) % 16] + K[32+j]) >> (32 - s[j % 4 + 8])) & 0xFFFFFFFF
- A, B, C, D = D, A, B, C
- print(f"Round 3 - Final Output: {A:08x} {B:08x} {C:08x} {D:08x}")
- # Round 4
- for j in range(16):
- A = (B + ((A + I(B, C, D) + X[(7*j) % 16] + K[48+j]) & 0xFFFFFFFF) << s[j % 4 + 12] | (A + I(B, C, D) + X[(7*j) % 16] + K[48+j]) >> (32 - s[j % 4 + 12])) & 0xFFFFFFFF
- A, B, C, D = D, A, B, C
- print(f"Round 4 - Final Output: {A:08x} {B:08x} {C:08x} {D:08x}")
- A = (A + AA) & 0xFFFFFFFF
- B = (B + BB) & 0xFFFFFFFF
- C = (C + CC) & 0xFFFFFFFF
- D = (D + DD) & 0xFFFFFFFF
- digest = bytearray()
- for val in (A, B, C, D):
- digest.extend(val.to_bytes(4, byteorder='little'))
- final_digest = digest * 4 # Concatenate the 128-bit digest four times to get a 512-bit digest
- return final_digest.hex()[:32] # Return only the first 32 characters (128 bits) of the digest
- # Main function
- if name == "main":
- message = input("Enter a message to encrypt: ")
- digest = md5(message)
- print(f"MD5 Digest (128 bits): {digest}")
- 5. RSA
- def gcd(a, b):
- while b:
- a, b = b, a % b
- return a
- def mod_inverse(a, m):
- m0, x0, x1 = m, 0, 1
- while a > 1:
- q = a // m
- m, a = a % m, m
- x0, x1 = x1 - q * x0, x0
- return x1 + m0 if x1 < 0 else x1
- def generate_keypair(p, q):
- n = p * q
- totient = (p - 1) * (q - 1)
- # Choose e such that 1 < e < totient(n) and gcd(e, totient(n)) = 1
- e = 2
- while gcd(e, totient) != 1:
- e += 1
- # Calculate d, the modular multiplicative inverse of e (mod totient(n))
- d = mod_inverse(e, totient)
- public_key = (e, n)
- private_key = (d, n)
- print("e:", e)
- print("where GCD(e, totient(n)=1)")
- return public_key, private_key
- def encrypt(message, public_key):
- e, n = public_key
- return pow(message, e, n)
- def decrypt(ciphertext, private_key):
- d, n = private_key
- return pow(ciphertext, d, n)
- # Example input: prime numbers p and q
- p = int(input("Enter prime number p: "))
- q = int(input("Enter prime number q: "))
- # Calculate n and totient
- n = p * q
- print("n:", n)
- totient = (p - 1) * (q - 1)
- print("totient(n):", totient)
- # Generate key pair
- public_key, private_key = generate_keypair(p, q)
- # Display public key and private key
- print("Public key (e, n):", public_key)
- print("Private key (d, n):", private_key)
- # Example message to encrypt
- message = int(input("Enter message to encrypt: "))
- # Encrypt the message
- ciphertext = encrypt(message, public_key)
- print("Encrypted message (C):", ciphertext)
- # Decrypt the message
- decrypted_message = decrypt(ciphertext, private_key)
- print("Decrypted message (M):", decrypted_message)
- # just run, 17, 11, 88
- 6. SHA
- # Initial hash values
- a = 0x6A09E667F3BCC908
- b = 0xBB67AE8584CAA73B
- c = 0x3C6EF372FE94F82B
- d = 0xA54FF53A5F1D36F1
- e = 0x510E527FADE682D1
- f = 0x9B05688C2B3E6C1F
- g = 0x1F83D9ABFB41BD6B
- h = 0x5BE0CD19137E2179
- # Message schedule constants
- K = [
- 0x428A2F98D728AE22, 0x7137449123EF65CD, 0xB5C0FBCFEC4D3B2F, 0xE9B5DBA58189DBBC,
- 0x3956C25BF348B538, 0x59F111F1B605D019, 0x923F82A4AF194F9B, 0xAB1C5ED5DA6D8118,
- 0xD807AA98A3030242, 0x12835B0145706FBE, 0x243185BE4EE4B28C, 0x550C7DC3D5FFB4E2,
- 0x72BE5D74F27B896F, 0x80DEB1FE3B1696B1, 0x9BDC06A725C71235, 0xC19BF174CF692694,
- 0xE49B69C19EF14AD2, 0xEFBE4786384F25E3, 0x0FC19DC68B8CD5B5, 0x240CA1CC77AC9C65,
- 0x2DE92C6F592B0275, 0x4A7484AA6EA6E483, 0x5CB0A9DCBD41FBD4, 0x76F988DA831153B5,
- 0x983E5152EE66DFAB, 0xA831C66D2DB43210, 0xB00327C898FB213F, 0xBF597FC7BEEF0EE4,
- 0xC6E00BF33DA88FC2, 0xD5A79147930AA725, 0x06CA6351E003826F, 0x142929670A0E6E70,
- 0x27B70A8546D22FFC, 0x2E1B21385C26C926, 0x4D2C6DFC5AC42AED, 0x53380D139D95B3DF,
- 0x650A73548BAF63DE, 0x766A0ABB3C77B2A8, 0x81C2C92E47EDAEE6, 0x92722C851482353B,
- 0xA2BFE8A14CF10364, 0xA81A664BBC423001, 0xC24B8B70D0F89791, 0xC76C51A30654BE30,
- 0xD192E819D6EF5218, 0xD69906245565A910, 0xF40E35855771202A, 0x106AA07032BBD1B8,
- 0x19A4C116B8D2D0C8, 0x1E376C085141AB53, 0x2748774CDF8EEB99, 0x34B0BCB5E19B48A8,
- 0x391C0CB3C5C95A63, 0x4ED8AA4AE3418ACB, 0x5B9CCA4F7763E373, 0x682E6FF3D6B2B8A3,
- 0x748F82EE5DEFB2FC, 0x78A5636F43172F60, 0x84C87814A1F0AB72, 0x8CC702081A6439EC,
- 0x90BEFFFA23631E28, 0xA4506CEBDE82BDE9, 0xBEF9A3F7B2C67915, 0xC67178F2E372532B,
- 0xCA273ECEEA26619C, 0xD186B8C721C0C207, 0xEADA7DD6CDE0EB1E, 0xF57D4F7FEE6ED178,
- 0x06F067AA72176FBA, 0x0A637DC5A2C898A6, 0x113F9804BEF90DAE, 0x1B710B35131C471B,
- 0x28DB77F523047D84, 0x32CAAB7B40C72493, 0x3C9EBE0A15C9BEBC, 0x431D67C49C100D4C,
- 0x4CC5D4BECB3E42B6, 0x597F299CFC657E2A, 0x5FCB6FAB3AD6FAEC, 0x6C44198C4A475817,
- ]
- # Initial message schedule
- W = [0] * 80
- # Get user input for the message
- message = input("Enter the message: ").encode('utf-8')
- bit_len = len(message) * 8
- message += b'\x80'
- while (len(message) + 8) % 128 != 0:
- message += b'\x00'
- message += bit_len.to_bytes(8, 'big')
- # Process the message in blocks of 1024 bits
- for i in range(0, len(message), 128):
- block = message[i:i+128]
- # Break the block into 64 64-bit words
- for j in range(16):
- W[j] = int.from_bytes(block[j*8:(j+1)*8], 'big')
- # Extend the 16 64-bit words into 80 64-bit words
- for j in range(16, 80):
- s0 = (W[j-15] >> 19 | W[j-15] << 63) ^ (W[j-15] >> 8 | W[j-15] << 56) ^ (W[j-15] >> 7)
- s1 = (W[j-2] >> 1 | W[j-2] << 45) ^ (W[j-2] >> 61 | W[j-2] << 3) ^ (W[j-2] >> 6)
- W[j] = (W[j-16] + s0 + W[j-7] + s1) & 0xFFFFFFFFFFFFFFFF
- # Initialize working variables
- a, b, c, d, e, f, g, h = a, b, c, d, e, f, g, h
- # Main loop
- for j in range(80):
- s0 = (a >> 28 | a << 36) ^ (a >> 34 | a << 30) ^ (a >> 39 | a << 25)
- s1 = (e >> 14 | e << 50) ^ (e >> 18 | e << 26) ^ (e >> 41 | e << 23)
- ch = (e & f) ^ (~e & g)
- maj = (a & b) ^ (a & c) ^ (b & c)
- temp1 = h + s1 + ch + K[j] + W[j]
- temp2 = s0 + maj
- h = g
- g = f
- f = e
- e = (d + temp1) & 0xFFFFFFFFFFFFFFFF
- d = c
- c = b
- b = a
- a = (temp1 + temp2) & 0xFFFFFFFFFFFFFFFF
- # Print values for each word and round
- print(f"w{j+1:02} = {W[j]:016X} Round {j+1}: a = {a:016X} b = {b:016X} c = {c:016X} d = {d:016X} e = {e:016X} f = {f:016X} g = {g:016X} h = {h:016X}\n")
- print("new block")
- # Print the final hash value
- hash_result = (a, b, c, d, e, f, g, h)
- final_hash = ''.join(format(word, '016X') for word in hash_result)
- print(f"Final Hash/Message Digest (512 bits): {final_hash}")
- 7. DSS
- import socket
- import struct
- def sha1(message):
- # Initialize variables
- h0 = 0x67452301
- h1 = 0xEFCDAB89
- h2 = 0x98BADCFE
- h3 = 0x10325476
- h4 = 0xC3D2E1F0
- # Pre-processing
- original_message = message
- message = bytearray(message, 'utf-8')
- ml = len(original_message) * 8 # Length of original message in bits
- message.append(0x80) # Append bit '1' to the message
- while len(message) % 64 != 56:
- message.append(0x00) # Append bits '0' to the message until message length is 64 bits less than multiple of 512
- message += struct.pack('>Q', ml) # Append original message length in bits as 64-bit big-endian integer
- # Process message in 512-bit chunks
- for i in range(0, len(message), 64):
- chunk = message[i:i+64]
- # Break chunk into sixteen 32-bit big-endian words
- words = [0] * 80
- for j in range(16):
- words[j] = struct.unpack('>I', chunk[j*4:j*4+4])[0]
- # Extend the sixteen 32-bit words into eighty 32-bit words
- for j in range(16, 80):
- words[j] = left_rotate(words[j-3] ^ words[j-8] ^ words[j-14] ^ words[j-16], 1)
- # Initialize hash value for this chunk
- a = h0
- b = h1
- c = h2
- d = h3
- e = h4
- # Main loop
- for j in range(80):
- if j < 20:
- f = (b & c) | ((~b) & d)
- k = 0x5A827999
- elif 20 <= j < 40:
- f = b ^ c ^ d
- k = 0x6ED9EBA1
- elif 40 <= j < 60:
- f = (b & c) | (b & d) | (c & d)
- k = 0x8F1BBCDC
- else:
- f = b ^ c ^ d
- k = 0xCA62C1D6
- temp = left_rotate(a, 5) + f + e + k + words[j] & 0xFFFFFFFF
- e = d
- d = c
- c = left_rotate(b, 30)
- b = a
- a = temp
- # Add this chunk's hash to result so far
- h0 = (h0 + a) & 0xFFFFFFFF
- h1 = (h1 + b) & 0xFFFFFFFF
- h2 = (h2 + c) & 0xFFFFFFFF
- h3 = (h3 + d) & 0xFFFFFFFF
- h4 = (h4 + e) & 0xFFFFFFFF
- # Produce the final hash value
- return '%08x%08x%08x%08x%08x' % (h0, h1, h2, h3, h4)
- def left_rotate(n, d):
- return ((n << d) | (n >> (32 - d))) & 0xFFFFFFFF
- def calculate_values(p, q, g, k, hm, x):
- # Calculate y
- y = pow(g, x, p)
- # Calculate r
- r = pow(g, k, p) % q
- # Calculate s
- k_inverse = pow(k, -1, q)
- s = (k_inverse * (int(hm, 16) + x * r)) % q
- # Calculate w
- w = pow(s, -1, q)
- # Calculate u1 and u2
- u1 = (int(hm, 16) * w) % q
- u2 = (r * w) % q
- # Calculate v
- v = (pow(g, u1, p) * pow(y, u2, p)) % p % q
- return y, r, s, w, u1, u2, v
- def main():
- # Client configuration
- host = '127.0.0.1'
- port = 12345
- # Create a socket object
- client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # Connect to the server
- client_socket.connect((host, port))
- # Gather inputs from the user
- p = int(input("Enter the value of p: "))
- q = int(input("Enter the value of q: "))
- g = int(input("Enter the value of g: "))
- k = int(input("Enter the value of k (User's per-Message Secret Number): "))
- message = input("Enter the message: ")
- # Calculate hash value (SHA-1)
- hm = sha1(message)
- print(f"The hash value of {message} (SHA-1): {hm}")
- x = int(input("Enter the value of x (User's Private Key): "))
- # Calculate values
- y, r, s, w, u1, u2, v = calculate_values(p, q, g, k, hm, x)
- # Print signature
- print(f"Signature: [r:{r},s:{s}]")
- # Ask user if they want to send the correct message
- send_correct = input("Do you want to send the correct message? (y/n): ")
- if send_correct.lower() == 'y':
- correct_message = input("Enter the correct message: ")
- correct_hm = sha1(correct_message)
- print(f"The hash value of {correct_message} (SHA-1): {correct_hm}")
- # Calculate u1 for correct message
- correct_u1 = (int(correct_hm, 16) * w) % q
- # Calculate v for correct message
- correct_v = (pow(g, correct_u1, p) * pow(y, u2, p)) % p % q
- # Send correct message values to the server
- data = f"{p},{q},{g},{k},{correct_hm},{x},{y},{r},{s},{w},{correct_u1},{u2},{correct_v}"
- else:
- # Send original message values to the server
- data = f"{p},{q},{g},{k},{hm},{x},{y},{r},{s},{w},{u1},{u2},{v}"
- print("Data Sent successfully to the Client")
- # Send inputs and calculated values to the server
- client_socket.send(data.encode())
- # Close the connection
- client_socket.close()
- if _name_ == "_main_":
- main()
- import socket
- def main():
- # Server configuration
- host = '127.0.0.1'
- port = 12345
- # Create a socket object
- server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- # Bind the socket to the address
- server_socket.bind((host, port))
- # Listen for incoming connections
- server_socket.listen(1)
- print("Server is listening on port", port)
- # Accept a connection
- client_socket, addr = server_socket.accept()
- print("Connection from", addr)
- # Receive data from the client
- data = client_socket.recv(1024).decode()
- print("Received data from server:", data)
- # Split received data into individual values
- values = data.split(',')
- # Display received values
- print("Received values from server:")
- print("p:", values[0])
- print("q:", values[1])
- print("g:", values[2])
- print("k:", values[3])
- print("hm:", values[4])
- print("x:", values[5])
- print("y:", values[6])
- print("s:", values[8])
- print("\n")
- print("Verification:")
- print("w:", values[9])
- print("u1:", values[10])
- print("u2:", values[11])
- print("v:", values[12])
- print("\n")
- print("r' (from sender):", values[7])
- print("v (calculated):", values[12])
- # Perform DSS verification
- r = int(values[8])
- v = int(values[11])
- if v == r:
- print("Digital Signature Standard (DSS) verification Successful")
- else:
- print("Digital Signature Standard (DSS) Verification Failed")
- # Close the connection
- client_socket.close()
- if _name_ == "_main_":
- main()
[text] Hulala
Viewer
*** This page was generated with the meta tag "noindex, nofollow". This happened because you selected this option before saving or the system detected it as spam. This means that this page will never get into the search engines and the search bot will not crawl it. There is nothing to worry about, you can still share it with anyone.
Editor
You can edit this paste and save as new: