You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
5.5 KiB
162 lines
5.5 KiB
#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. |
|
|
|
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"): |
|
answer = True |
|
stepfour = "```"+str(stepthreeb)+"h```" |
|
elif(mdsupport=="n"): |
|
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))
|
|
|