Cifra de Políbio ou Quadrado de Políbio em Python


SUBMITTED BY: Guest

DATE: Jan. 28, 2014, 7:09 p.m.

FORMAT: Python

SIZE: 3.8 kB

HITS: 1746

  1. class Polybius:
  2. def __init__(self):
  3. ## p_alphabet nao possui a letra j, que sera substituida
  4. ## pela letra i na cifragem e decifragem
  5. self.p_alphabet = 'abcdefghiklmnopqrstuvwxyz'
  6. self.p_alphanum = 'abcdefghijklmnopqrstuvwxyz0123456789'
  7. def cipher_alphabet(self, password):
  8. ''' (str) -> str
  9. Retorna um alfabeto cifrado iniciado com
  10. o texto da palavra chave password
  11. '''
  12. c_alphabet = []
  13. p_alphabet = self.p_alphanum
  14. for ch in password:
  15. if ch not in c_alphabet:
  16. c_alphabet.append(ch)
  17. idx = p_alphabet.find(ch)
  18. p_alphabet = p_alphabet[idx:] + p_alphabet[:idx]
  19. for ch in p_alphabet:
  20. if ch not in c_alphabet:
  21. c_alphabet.append(ch)
  22. return ''.join(c_alphabet)
  23. def create_square(self, alphabet, lines):
  24. ''' (list, int) -> list of str
  25. Retorna uma tabela lista quadrada definida por lines
  26. com cada celula preenchida com um caracter de alphabet
  27. '''
  28. square = []
  29. temp = []
  30. count = 0
  31. for ch in alphabet:
  32. temp.append(ch)
  33. count += 1
  34. if count == lines:
  35. square.append(temp)
  36. temp = []
  37. count = 0
  38. return square
  39. def select_square(self, key):
  40. ''' (int) -> list of str
  41. Retorna o quadrado de Polibio referente a key utilizada.
  42. Se key for True, usa-se o quadrado de Polibio com letras e numerais;
  43. Se key for uma string, retorna o quadrado de Polibio com key como palavra chave.
  44. Se nao houver key, usa-se o quadrado de Polibio padrao.
  45. '''
  46. if key:
  47. if key == True:
  48. return self.create_square(self.p_alphanum, 6)
  49. else:
  50. return self.create_square(self.cipher_alphabet(str(key)), 6)
  51. return self.create_square(self.p_alphabet, 5)
  52. def encrypt(self, plaintext, key = None):
  53. ''' (str, str) -> str
  54. Retorna o plaintext cifrado com a cifra de Polibio.
  55. Se key = True, cifra com quadrado de Polibio com letras e numeros.
  56. Se key = uma string, cifra o quadrado de Polibio com key como palavra chave.
  57. Se nao houver key, cifra com o quadrado de polibio padrao.
  58. '''
  59. square = self.select_square(key)
  60. ciphertext = ''
  61. for ch in plaintext.lower():
  62. idx = 1
  63. if ch == 'j':
  64. ch = 'i'
  65. for linha in square:
  66. if ch in linha:
  67. ciphertext += str(idx) + str(linha.index(ch) + 1) + ' '
  68. idx += 1
  69. return ciphertext
  70. def decrypt(self, ciphertext, key = None):
  71. ''' (str, str) -> str
  72. Retorna o ciphertext decifrado com a cifra de Polibio.
  73. Se key = True, decifra com quadrado de Polibio com letras e numeros.
  74. Se key = uma string, decifra o quadrado de Polibio com key como palavra chave.
  75. Se nao houver key, decifra com o quadrado de polibio padrao.
  76. '''
  77. square = self.select_square(key)
  78. plaintext = ''
  79. ciphertext = str(ciphertext).replace(' ', '')
  80. for num in range(0, len(ciphertext), 2):
  81. var = int(ciphertext[num:num + 2])
  82. i, j = var / 10, var % 10
  83. if i - 1 < len(square) and j - i < len(square[0]):
  84. plaintext += square[i - 1][j - 1]
  85. return plaintext.lower()

comments powered by Disqus