HOP/HOP 1.0.2.1.py

163 lines
5.5 KiB
Python
Raw Normal View History

2020-12-04 18:47:12 +00:00
#Changelog:
#HOP Encode
#1.0:
#Released HOP Encode
#1.0.1:
#Updated version number
#Added optimize for Discord option
#Added changelog
#HOP Decode
#1.0:
#Released HOP decode
#1.0.1:
#Updated version number to match that of HOP Encode
#Added changelog
#HOP
#1.0.2:
#Combined HOP Encode and HOP Decode
#Integrated GitHub and repl.it
#Added several files, including .replit, CODE_OF_CONDUCT.md, CONTRIBUTING.md, README.md, and SECURITY.md
#Moved input, print, and import statements outside functions
#Added ability to choose on runtime encode or decode
#1.0.2.1:
#Made changes to show that the "optimize for Discord" option also supports Element/Matrix, IRC, Joplin, etc.
2020-12-04 18:47:12 +00:00
import base64
def decode(ciphertext, key):
steponel = list(ciphertext)
stepone = ""
for i in range(len(steponel)-1):
stepone=stepone+steponel[i]
steptwo = stepone.encode('utf-8')
steptwob = base64.a85decode(steptwo)
steptwoc = steptwob.decode('utf-8')
def vigenere_dec(cipher,key):
alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
input_string = ""
dec_key = ""
dec_string = ""
dec_key = key
dec_key = dec_key.lower()
input_string = cipher
input_string = input_string.lower()
string_length = len(input_string)
expanded_key = dec_key
expanded_key_length = len(expanded_key)
while expanded_key_length < string_length:
expanded_key = expanded_key + dec_key
expanded_key_length = len(expanded_key)
key_position = 0
for letter in input_string:
if letter in alphabet:
position = alphabet.find(letter)
key_character = expanded_key[key_position]
key_character_position = alphabet.find(key_character)
key_position = key_position + 1
new_position = position - key_character_position
if new_position > 35:
new_position = new_position + 36
new_character = alphabet[new_position]
dec_string = dec_string + new_character
else:
dec_string = dec_string + letter
return(dec_string)
def stepfour(stepthree):
stepthree=str(int(stepthree,36))
test = list(stepthree)
if len(test)%3==1:
stepthree="00"+stepthree
if len(test)%3==2:
stepthree="0"+stepthree
stepthreel = list(stepthree)
stepfourl = [""]*int((float(len(stepthreel))/3))
k = 0
while k < len(stepthreel)-2:
stepfourl[int(k/3)] = stepthreel[k] + stepthreel[k+1] + stepthreel[k+2]
k = k + 3
for j in range(len(stepfourl)):
temp = stepfourl[j]
temp = int(temp)
temp = chr(temp)
stepfourl[j] = temp
stepfour=""
for l in range(len(stepfourl)):
stepfour = stepfour + stepfourl[l]
return(stepfour)
stepthree = vigenere_dec(steptwoc, key)
stepfour = stepfour(stepthree)
output = "Your decoded message: "+stepfour
return output;
def encode(plaintext, key):
def b36_encode(i):
if i < 0: return "-" + b36_encode(-i)
if i < 36: return "0123456789abcdefghijklmnopqrstuvwxyz"[i]
return b36_encode(i // 36) + b36_encode(i % 36)
def stepone(plaintext):
magicasciipowers = list(plaintext)
numbersgohere = [""]*len(magicasciipowers)
for i in range(len(magicasciipowers)):
temp = magicasciipowers[i]
temp = ord(temp)
if (temp<100):
numbersgohere[i]="0"+str(temp)
else:
numbersgohere[i]=str(temp)
numbers = ""
for i in range(len(numbersgohere)):
numbers=numbers+numbersgohere[i]
return(int(numbers))
def vigenere_enc(stepone,key):
alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
input_string = ""
enc_key = ""
enc_string = ""
enc_key = key
enc_key = enc_key.lower()
input_string = stepone
input_string = input_string.lower()
string_length = len(input_string)
expanded_key = enc_key
expanded_key_length = len(expanded_key)
while expanded_key_length < string_length:
expanded_key = expanded_key + enc_key
expanded_key_length = len(expanded_key)
key_position = 0
for letter in input_string:
if letter in alphabet:
position = alphabet.find(letter)
key_character = expanded_key[key_position]
key_character_position = alphabet.find(key_character)
key_position = key_position + 1
new_position = position + key_character_position
if new_position > 35:
new_position = new_position - 36
new_character = alphabet[new_position]
enc_string = enc_string + new_character
else:
enc_string = enc_string + letter
return(enc_string)
steptwo = vigenere_enc(b36_encode(stepone(plaintext)),key)
steptwob = steptwo.encode('utf-8')
stepthree = base64.a85encode(steptwob)
stepthreeb = stepthree.decode('utf-8')
stepfour = str(stepthreeb)+"h"
answer = False
while answer == False:
mdsupport = input("Optimize for markdown supported services, like Discord, Element/Matrix, Joplin, or IRC? y or n: ")
if(mdsupport=="y"):
2020-12-04 18:47:12 +00:00
answer = True
stepfour = "```"+str(stepthreeb)+"h```"
elif(mdsupport=="n"):
2020-12-04 18:47:12 +00:00
answer = True
output="Your encoded message: "+stepfour
return output
var = input("Encode or Decode? 1 for encode, 2 for decode: ")
if (var=="1"):
ciphertext = input("Enter message to encode: ")
key = input("Enter encryption key: ")
print(encode(ciphertext, key))
elif (var=="2"):
plaintext = input("Enter message to decode: ")
key = input("Enter encryption key: ")
print(decode(plaintext, key))