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.

 


 

Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

FacebookTwitterLinkedinLinkedin
knowledge base
  1. Il linguaggio Python
  2. Come installare Python sul PC
  3. Come scrivere un programma in Python
  4. Come usare Python in modalità interattiva
  5. Le variabili
  6. I numeri
  7. Gli operatori logici
  8. Le strutture iterative ( o cicli )
  9. Le strutture condizionali
  10. Le eccezioni
  11. I file in python
  12. Le classi
  13. I moduli