# -*- coding: utf-8 -*-
from cipher import Cipher
class DellaPorta(Cipher):
''' Cifra criptografica de Giambattista della Porta '''
def __init__(self):
'''
keys - chaves para determinar o deslocamento da cifra
plain - alfabeto fixo
cipher - alfabeto a ser deslocado
'''
self.keys = {
'A': 0, 'B': 0, 'C': 1, 'D': 1, 'E': 2, 'F': 2,
'G': 3, 'H': 3, 'I': 4, 'J': 4, 'K': 5, 'L': 5,
'M': 6, 'N': 6, 'O': 7, 'P': 7, 'Q': 8, 'R': 8,
'S': 9, 'T': 9, 'U': 10, 'V': 10, 'W': 11,
'X': 11, 'Y': 12, 'Z': 12
}
self.plain = 'ABCDEFGHIJKLM'
self.cipher = 'NOPQRSTUVWXYZ'
def shift(self, key):
''' Desloca o alfabeto '''
shift = self.keys[key]
return self.cipher[shift:] + self.cipher[:shift]
def repeat_password(self, password, length):
''' Repete a password ate o tamanho do texto plano '''
new_pass = password * int((length/len(password)))
length -= len(new_pass)
if length:
new_pass += password[:length]
return new_pass
def encrypt(self, plaintext, password):
''' Retorna o texto cifrado '''
ciphertext = ''
plaintext = self.format_str(plaintext)
plainalphabet = self.plain
password = self.format_str(
self.repeat_password(password, len(plaintext))
)
for idx in range(len(plaintext)):
char = plaintext[idx]
cipheralphabet = self.shift(password[idx])
if char in plainalphabet:
idchar = plainalphabet.find(char)
ciphertext += cipheralphabet[idchar]
elif char in cipheralphabet:
idchar = cipheralphabet.find(char)
ciphertext += plainalphabet[idchar]
return ciphertext
def decrypt(self, ciphertext, password):
''' Retorna o texto decifrado '''
return self.encrypt(ciphertext, password)