Programma del cifrario affine in Python
Questo programma realizza un cifrario affine nell'alfabeto inglese con il linguaggio Python.
from math import gcd
def affine_cipher_encrypt(plaintext, a, b):
# Controlla se 'a' è coprimo con 26.
if gcd(a, 26) != 1:
return "Error: 'a' must be coprime with 26."
# Codifica un testo in chiaro (plaintext) usando la formula di cifratura
encrypted_text = ''
for char in plaintext.upper():
if char.isalpha(): # Check if the character is a letter
# Applica la formula di cifratura
encrypted_char = chr(((a * (ord(char) - ord('A')) + b) % 26) + ord('A'))
encrypted_text += encrypted_char
else:
encrypted_text += char # Non-alphabetic characters are not transformed
return encrypted_text
def affine_cipher_decrypt(ciphertext, a, b):
# Controlla se 'a' è coprimo con 26
if gcd(a, 26) != 1:
return "Error: 'a' must be coprime with 26."
# Trova l'inverso moltiplicativa della chiave 'a' nel modulo 26
a_inv = pow(a, -1, 26)
decrypted_text = ''
for char in ciphertext.upper():
if char.isalpha(): # Check if the character is a letter
# Applica la formula di decifratura
decrypted_char = chr((a_inv * (ord(char) - ord('A') - b) % 26) + ord('A'))
decrypted_text += decrypted_char
else:
decrypted_text += char # Non-alphabetic characters are not transformed
return decrypted_text
# Codifica la parola "HELLO" con la chiave 'a' = 5 e 'b' = 8.
messaggio_cifrato=affine_cipher_encrypt('HELLO', 5, 8)
print(messaggio_cifrato)
# decodifica
messaggio_decifrato=affine_cipher_decrypt(messaggio_cifrato, 5, 8)
print(messaggio_decifrato)
Ecco una spiegazione dettagliata del codice.
Il programma utilizza due funzioni, una per cifrare un testo in chiaro e l'altra per decifrare un testo criptato.
- La funzione affine_cipher_encrypt
Questa funzione cifra il testo in chiaro. Per prima cosa verifica se la chiave "a" è un numero intero coprimo con 26. E' essenziale perché la chiave "a" deve avere un inverso moltiplicativo modulo 26 per la decifratura. Se "a" non è coprimo con 26, la funzione restituisce un errore e termina il programma. Per ogni carattere nel testo in chiaro, il codice converte il carattere in un numero tramite `ord(char) - ord('A')`, poi applica la formula di cifratura affine, e infine converte il numero risultante di nuovo in un carattere. I caratteri non alfabetici vengono lasciati inalterati. - La funzione affine_cipher_decrypt
Questa funzione verifica se "a" è coprimo con 26. Poi calcola l'inverso moltiplicativo di "a" modulo 26, che sarà usato nella formula di decifratura. Per ogni carattere nel testo cifrato, il codice lo trasforma in un numero, applica la formula di decifratura affine, e converte il numero risultante di nuovo in un carattere. Anche qui, i caratteri non alfabetici vengono lasciati inalterati.
Per cifrare un testo in chiaro lancio la funzione "affine_cipher_encrypt()" passando come parametri il testo da cifrare, la chiave di cifratura (a) e la chiave di spostamento (b).
Viceversa, per decifrare un testo cifrato chiamo la funzione "affine_cipher_decrypt()" passandogli come parametri il testo cifrato e le chiavi ci difratura (a) e di spostamento (b) che ho usato per cifrarlo.
E così via.