Friday, January 31, 2014

My First Python Encryptor



As part of my curriculum at Champlain College I was required to take Introduction to Computer Theory. This introduced me to the Python programming language for what was really the first time. My first impression of Python was that I  loved it. I instantly saw the potential that a language like this (or any scripting language such as perl/bash etc.) truly has. 

As my final project for the class I was able to choose to either write a research paper or create my own Python program. Despite my side-love for writing I chose to try something new and write my own program. After a little bit of thought I knew that I wanted to create a simple string encryptor. This seemed to me to be within my skill level, yet at the same time something that would challenge me. I put ALOT of time into this piece of code and taught myself more Python outside of class then was necessary. It was worth it though for at the end I had a working Python program that I was proud of and could truly call my own.

I wrote the code in a way that it could be expanded upon by adding more encryption/decryption methods. This particularly version is simply my one encryption method that I invented wrapped up into a user-input type text interface.

How it works:
1. Asks user to use the program
2. Asks user if they want to encrypt or decrypt a string
3. Asks the user for their desired method
4. If encryption, parses a string seeded with a unique key through an encryption algorithm
5. If decryption parses a encrypted string seeded with the key through a decryption algorithm

Things to keep in mind:
-My invented encryption algorithm is named "bloat"
-Due to the character encoding this program currently only runs in the IDLE environment
-This code was written using Python 3.3.3 and as such will only work when ran using Python version 3.

 Source Code:

#!/usr/bin/env python3
import random
import string
import sys
from collections import deque
#sys.setdefaultencoding("UTF-8")
#Bloat encryption invented by Hunter Gregal
#Encrypt bloat
def bloat_encrypt(destring,enstring):
    m=(string.ascii_lowercase)
 
    #Asks for a key from the user
    key=str(input("Please enter a key to encrypt the string. This key will be required in order to decrypt it as well.\n: "))
    #gives key numerical value
    keylist=list(key)
    i=len(key) - 1
    c=0
    while i:
        c= c + ord(keylist[i])
        i=i-1
     
    #encodes destring with key
    destring=str(destring)
    destringlist=list(destring)
    i=len(destring) -1
    while i:
        n = ord(destringlist[i]) #gives each letter a number value
        destringlist[i]=chr(n+c) #increase each letter value by key value and converts it to its unicode char
        i=i-1
    destring=''.join(destringlist)

   #Further obfuscates destring by salting it  
    while destring:
     
        #Reverses string and adds random letters
        x=(len(destring)-1)
        enstring = (enstring + destring[x] + random.choice(m))
        destring = destring[0:x]
    print(enstring)    
    return destring,enstring
#Decrypt bloat
def bloat_decrypt(destring,enstring):
    key=str(input("Please enter a key to decrypt the string with.\n:"))
    #Reverses string and removes salt
    destring=''
    x=list(enstring)
    x=x[::2]
    x.reverse()
    destring=''.join(x)
    #gives key numerical value
    keylist=list(key)
    i=len(key) - 1
    c=0
    while i:
        c= c + ord(keylist[i])
        i=i-1
    #Decrypts string with the key
    destring=str(destring)
    destringlist=list(destring)
    i=len(destring) -1
    while i:
        m = ord(destringlist[i])
        destringlist[i]=chr(m-c)
        i=i-1
    destring=''.join(destringlist)
 
    print(destring)
    return destring,enstring
 



Running in IDLE: 

print("Python string encryptor brought to you by Hunter Gregal")
print("\n\n\n")
#Define enstring/destring ahead of time
enstring=''
destring=''
go=input("Would you like to use the program? Y/N\n: ")
while go == "Y" or go == "y":  #Run or breaks the program depending on input
    choice=input("Would you like to decrypt or encrypt a string? [decrypt]/[encrypt]\n: ") #Asks user if they want to encrypt or decrypt
    if choice == "encrypt" or choice == "Encrypt": #If user chooses encrypt....
        method=input("What encryption method would you like to use?\n [bloat]\n: ")
        destring=input("What string would you like to encrypt?\n: ")
 
        if method == "bloat" or method == "Bloat": #If user chooses bloat run bloat_encrypt function
            bloat_encrypt(destring,enstring)
 
     
    elif choice =="decrypt" or choice == "Decrypt": #If user chooses decrypt ....
        method=input("What is the decryption method you would like to use?\n [bloat]\n: ")
        enstring=input("What is the string that you would like to decrypt?\n: ")
 
        if method == "bloat" or method == "Bloat": #If users chooses bloat run bloat_decrypt function
            bloat_decrypt(destring,enstring)
 
 
        go=input("Would you like to use the program again? Y/N\n: ") #Keep running?
input("Press any key to exit")