-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvigenere-cipher.py
84 lines (75 loc) · 4.55 KB
/
vigenere-cipher.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# Ky funksion gjeneron një tabelë 26x26 që përfaqëson Vigenere cipher.
# Çdo rresht përfaqëson një shifër të Cezarit me një vlerë të ndryshëm.
def generate_vigenere_table():
table = [[0] * 26 for _ in range(26)] # Inicializon tabelën me zero
for i in range(26):
for j in range(26):
table[i][j] = (i + j) % 26 # Plotëson tabelën me vlerat e duhura sipas Vigenere cipher.
return table
# Ky funksion gjeneron një çelës për shifrën Vigenere bazuar në një vlerë seed.
# Nëse seed-i është një numër i plotë, ai gjeneron një çelës të rastësishëm të gjatësisë së specifikuar duke përdorur modulin 'random'.
# Nëse seed-i është një varg, ai konverton çdo karakter në vlerën e tij ASCII dhe zbret 65 (vlera ASCII e 'A') për të marrë vlerën kryesore.
def generate_key(seed, length):
if isinstance(seed, int):
import random
random.seed(seed)
key = [random.randint(0, 25) for _ in range(length)] # Gjeneron një çelës të rastësishëm ( random ).
elif isinstance(seed, str):
key = [ord(char) - 65 for char in seed.upper()] # Konverton çdo karakter në vlerën e tij ASCII dhe i zbret 65.
return key
# Ky funksion enkripton një mesazh me tekst të thjeshtë (plain) duke përdorur shifrën Vigenere.
# Përsëritet mbi çdo karakter në tekstin e thjeshtë (plain), dhe nëse karakteri është alfabetik,
# Aplikon shifrën Vigenere duke përdorur vlerën e çelësit përkatës.
# Vlera kryesore përcaktohet nga pozicioni i karakterit në modulin e tekstit të thjeshtë, gjatësia e tekstit.
# Karakteret e enrkiptuara më pas i shtohet vargut të tekstit të enkriptuar.
def encrypt(plaintext, key):
ciphertext = ""
for i in range(len(plaintext)):
if plaintext[i].isalpha():
key_index = i % len(key) # Përcaktoni vlerën kryesore bazuar në pozicionin e karakterit.
shift = key[key_index]
if plaintext[i].islower():
ciphertext += chr((ord(plaintext[i]) - 97 + shift) % 26 + 97) # Aplikoni shifrën Vigenere për shkronjat e vogla.
else:
ciphertext += chr((ord(plaintext[i]) - 65 + shift) % 26 + 65) # Aplikoni shifrën Vigenere për shkronjat e mëdha.
else:
ciphertext += plaintext[i] # Shton karaktere jo alfabetike ashtu siç janë.
return ciphertext
# Ky funksion deshifron një mesazh të enkriptuar me tekst duke përdorur Vigenere cipher.
# Funksionon në mënyrë të ngjashme me funksionin 'encrypt', por zbaton inversin e shifrës Vigenere për çdo karakter.
def decrypt(ciphertext, key):
plaintext = ""
for i in range(len(ciphertext)):
if ciphertext[i].isalpha():
key_index = i % len(key) # Përcaktoni vlerën e qelsit bazuar në pozicionin e karakterit.
shift = key[key_index]
if ciphertext[i].islower():
plaintext += chr((ord(ciphertext[i]) - 97 - shift) % 26 + 97) # Aplikoni shifrën e kundërt (inverse) Vigenere për shkronjat e vogla.
else:
plaintext += chr((ord(ciphertext[i]) - 65 - shift) % 26 + 65) # Aplikoni shifrën e kundërt Vigenere për shkronjat e mëdha.
else:
plaintext += ciphertext[i] # Shkruaj karakteret jo alfabetike ashtu siç janë
return plaintext
# Ky funksion është pika kryesore hyrëse e programit.
# Ai pyet përdoruesin nëse dëshiron të kodojë ose deshifrojë një mesazh, dhe më pas kërkon hyrjet e duhura (tekst i thjeshtë ose i shifruar dhe një vlerë fillestare).
# Gjeneron një çelës bazuar në seed, dhe më pas thërret funksionin e duhur (`encrypt` ose `decrypt`) për të përpunuar mesazhin.
def main():
choice = input("Shkruaj 'encrypt' për të enkriptuar ose 'decrypt' për të deshifruar: ").lower()
if choice == 'encrypt':
plaintext = input("Shkruaj plaintext: ")
seed = input("Shkruaj një numër të plotë ose një farë vargu: ")
key = generate_key(seed, len(plaintext))
ciphertext = encrypt(plaintext, key)
print("Ciphertext:", ciphertext)
elif choice == 'decrypt':
ciphertext = input("Shkruaj ciphertext: ")
seed = input("Shkruaj një numër të plotë ose një farë vargu: ")
key = generate_key(seed, len(ciphertext))
plaintext = decrypt(ciphertext, key)
print("Plaintext:", plaintext)
else:
print("Zgjedhje e pavlefshme.")
# Kjo linjë siguron që funksioni "main" thirret vetëm kur skripta ekzekutohet drejtpërdrejt,
# dhe jo kur importohet si modul.
if __name__ == "__main__":
main()