8000 some algorithms in python by gleydson · Pull Request #34 · AllAlgorithms/python · GitHub
[go: up one dir, main page]

Skip to content

some algorithms in python #34

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Oct 4, 2018
Next Next commit
Addition of playfair cipher in python
  • Loading branch information
gleydson committed Oct 3, 2018
commit 47c5571087d38b9dd19ec85bd1f74451c949e1f1
Empty file added ciphers/README.md
Empty file.
146 changes: 146 additions & 0 deletions ciphers/playfair.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

# @Author: Gleydson Rodrigues

# ./playfair.py [encrypt/decrypt] key message


alphabet = "abcdefghijlmnopqrstuvwxyz".upper()

def vetorize(text):
listText = []
for letter in text:
listText.append(letter)
return listText

def normalizeMessage(text):
newText = []
text = text.upper()
text = text.replace(" ", "")
text = text.replace(".", "")
text = text.replace(",", "")
pos = 0
while pos < len(text) - 1:
firstLetter = text[pos]
secondLetter = text[pos + 1]
if firstLetter == secondLetter:
if firstLetter == "X":
newText.append(firstLetter)
newText.append("Z")
pos += 1
else:
newText.append(firstLetter)
newText.append("X")
pos += 1
else:
newText.append(firstLetter)
newText.append(secondLetter)
pos += 2
if pos < len(text):
if text[-1] == "X":
newText.append(text[pos])
newText.append("Z")
else:
newText.append(text[pos])
newText.append("X")
return newText

def createMatrix():
matrix = []
for i in range(5):
matrix.append([])
for j in range(5):
matrix[i].append("")
return matrix

def mountGrid(matrix, key, alphabet):
alphabet = vetorize(alphabet)
line, column, pos = 0, 0, 0
for letter in key:
line = pos / 5
column = pos % 5
if letter in alphabet:
alphabet.remove(letter)
matrix[line][column] = letter
pos += 1
while len(alphabet) > 0:
line = pos / 5
column = pos % 5
matrix[line][column] = alphabet.pop(0)
pos += 1
return matrix

def getIndex(letter, matrix):
for i in range(5):
for j in range(5):
if matrix[i][j] == letter:
return [i, j]

def encrypt(message, key):
matrix = mountGrid(createMatrix(), key, alphabet)
message = normalizeMessage(message)
messageEncrypted = ""
pos, line, column = 0, 0, 1
while pos < len(message) - 1:
firstLetter = message[pos]
secondLetter = message[pos + 1]
indexFirstLetter = getIndex(firstLetter, matrix)
indexSecondLetter = getIndex(secondLetter, matrix)
if indexFirstLetter[line] == indexSecondLetter[line]:
messageEncrypted += matrix[indexFirstLetter[line]][(indexFirstLetter[column] + 1) % 5]
messageEncrypted += matrix[indexSecondLetter[line]][(indexSecondLetter[column] + 1) % 5]
elif indexFirstLetter[column] == indexSecondLetter[column]:
messageEncrypted += matrix[(indexFirstLetter[line] + 1) % 5][indexFirstLetter[column]]
messageEncrypted += matrix[(indexSecondLetter[line] + 1) % 5][indexSecondLetter[column]]
else:
messageEncrypted += matrix[indexFirstLetter[line]][indexSecondLetter[column]]
messageEncrypted += matrix[indexSecondLetter[line]][indexFirstLetter[column]]
pos += 2
return messageEncrypted

def decrypt(messageEncrypted, key):
matrix = mountGrid(createMatrix(), key, alphabet)
messageDecrypted = ""
pos, line, column = 0, 0, 1
while pos < len(messageEncrypted):
firstLetter = messageEncrypted[pos]
secondLetter = messageEncrypted[pos + 1]
indexFirstLetter = getIndex(firstLetter, matrix)
indexSecondLetter = getIndex(secondLetter, matrix)
if indexFirstLetter[line] == indexSecondLetter[line]:
messageDecrypted += matrix[indexFirstLetter[line]][(indexFirstLetter[column] - 1) % 5]
messageDecrypted += matrix[indexSecondLetter[line]][(indexSecondLetter[column] - 1) % 5]
elif indexFirstLetter[column] == indexSecondLetter[column]:
messageDecrypted += matrix[(indexFirstLetter[line] - 1) % 5][indexFirstLetter[column]]
messageDecrypted += matrix[(indexSecondLetter[line] - 1) % 5][indexSecondLetter[column]]
else:
messageDecrypted += matrix[indexFirstLetter[line]][indexSecondLetter[column]]
messageDecrypted += matrix[indexSecondLetter[line]][indexFirstLetter[column]]
pos += 2
return messageDecrypted

def help():
print(
"./playfair.py [encrypt/decrypt] key message"
)

def main():
params = sys.argv[1:]
if len(params) == 0:
help()
elif params[0] == "encrypt":
key = params[1].upper()
message = params[2:]
print(encrypt("".join(x for x in message).upper(), key))
elif params[0] == "decrypt":
key = params[1].upper()
message = params[2:]
print(decrypt("".join(x for x in message).upper(), key))
else:
help()

if __name__ == "__main__":
main()
0