# Encryption/Decryption Application

For our application project we plan on approaching the subject of cryptography as it applies to linear algebra and creating a computer program that will implement different cryptographic applications. Through creating this computer application we plan on expanding on the idea of encrypting and decrypting messages we learned in class through various approaches such as shift ciphers, where you shift the letters by a specified amount, substitution ciphers (also known as Caesar ciphers), in which you have a key that is used to change from plaintext into cipher text, and Hill ciphers, where you have an alphabet of a certain size and a matrix that is applied to a certain number of characters of the plaintext at a time to change the message to cipher text.

Our program would allow the user to specify the message they wish to encrypt or decrypt and the method by which they want to do that. Depending on the method the user selects the program will encrypt or decrypt the message entered in. We will provide the user will a variety of different alphabets, including a standard 26-character alphabet and a subset of the ASCII alphabet that are printable, which would allow the use of the same ciphers to generate completely different messages.

The largest part of our project will be working with Hill ciphers using concepts in linear algebra. Our plan for the program is to allow the user of the program to specify an n by n matrix (up to size n = 10) to be applied to a message they supply. The user can either fill this matrix manually, which the program will ensure is invertible, or the program will automatically generate a random invertible matrix. We need to ensure the matrices we are using are invertible to allow for both encryption using the original matrix and decryption using the inverse of the original matrix. To do this will we be figuring out the determinants of the matrices in our program to ensure that the matrices are invertible and then also finding the decipher key matrix from an entered or generated matrix. We plan on doing this recursively in the program following the general method of reduction that we were taught in class, which lends itself to recursion. If a user decides to manually enter the matrix our program will ensure the matrix is invertible and if it isn’t will tell the user they need to enter a new matrix or use our auto-generate feature.