Home Projects




Projects

With more to come!

Anonymous Router Network RWS-Lite Number Identifier Text Classifier Personal Website Login System Priority Map CSV Visualizer Chess Sorting Animation
Anonymous Router Network

Anonymous communication has a long history with many different protocols including onion routing, Mixnets, and DC-nets, most of which depend on a certain portion of honest actors for security and/or direct interactions between communicating clients. However, a new form of communication has been proposed by Shi and Wu in which anonymity is guaranteed through one central router in which clients do not interact. Unlike previous models, this does not require a threshold of honest parties to assure anonymity. It prevents attackers from overloading a system with dishonest parties that can de-anonymize users. We leave discussion of these attacks to the plethora of surveys on de-anonymization.

Given it is a recent novel idea, there has been little research into implementation, but published works that do realize the idea suffer from severe limitations. Performance has been slow on models due to the expensive cryptographic building blocks, and dependence on one machine. Along with this, reliability is only guaranteed based on the work of a single router. This leaves some open questions:

1. Is it possible to eliminate the reliance of a single router while not sacrificing performance and security?

2. How does increasing the number of routers in the protocol in order to offload work affect execution time?

To address these questions, we will propose an implementation of an anonymous router network in which multiple routers are used to send messages instead of a single router. Suppose there are n senders that transmit a single message, per round of communication, to n receivers through m routers. Our goal is to preserve anonymity for all clients given that there is not a colluding party with more than n - 2 senders and n - 2 receivers which are untrusted. Along with this, the desired outcome is to ensure that at least some messages get sent, even if only one router transmits messages.

The work of Das and Park on Somewhat Practical Anonymous Router (sPAR) constructs a protocol that achieves the central anonymous routing scheme. They instantiate the concept utilizing fully homomorphic encryption (FHE) for multiple parties to obfuscate communication. Thus the router can obliviously permute incoming messages in order to send to the destination without leaking information. Their protocol shows that it is practical to implement due to the wide breadth of research and public libraries on FHE. However, the performance of sPAR scales linearly with respect to the amount of clients sending and receiving messages.

A related proposal by Ge et al. introduced a decentralized network of routers. They provide a protocol similar to popular anonymous communication protocols but with the necessity of a central authority. This provides security implications similar to previously built anonymous routers such as no interaction and an independence from a trustworthy router. Our network, while inspired by this work, differs as we replicate FHE techniques used in sPAR instead of expensive cryptographic components such as correlated pseudorandom functions. Thus we can benefit from offloading work from one router to multiple while using relatively inexpensive methods.

While some of the implementation has already been realized using the TFHE-rs library, work is still needed. Much of our construction is based around sPAR, specif- ically using their permutation system and multiparty FHE. We begin with adding one router while recording the outcome for differing constant message size. We then increase the number of routers, again tracking the performance compared to previous amounts. Extending this, there are a few methods that could be implemented to coordinate routers with clients. This could be clients sending every router a plaintext boolean value of whether or not it is being used by said client, or a router not having the knowledge of which clients are sending messages to specific routers. The latter, while sounding preferable, may lead to unexpected security implications. One client may be able to congest the network through exploiting the constant input size in our permutation system. Though the exact implementation remains unclear as of yet, we expect our protocol to be realized with the security implications listed above, along with a performance increase from previous instantiations.

RWS-Lite

This is the project I am currently workin on as a research assistant.
The software left by previous contributers was manually sorted to extract valuable code. From there, the codebase was restructured into modularizing every section, i.e. separating the data collection and data storage. This includes thouroughly documenting the codebase along with maintaining readability. To maintain development modularity and for the purpose of giving users more freedom over their use of RWSLite, a new configuration system was implemented regarding which data to collect, data storage options, file naming conventions, etc. More details about configuration are listed in the documentation of the software.

Data

Instead of solely storing files as comma separated values on disk and/or uploaded to Dropbox, an SQLite database was implemented. This is meant to ease the transition of scaling large datasets, along with easier implementation of data queries done in the system. The system is not yet fully capable of scaling as-is because of the replication of data and lack of clear synchronization.

Scripts

During development, contributers were tasked with updating Raspberry Pis which did not have updated sources of needed packages. To develop on any future computers, Bash scripts were written in order to update all sources, updating, and building the newest version of Python (if needed). Along with this, scripts were built in order to maintain the software environment and database structures.

Front-End

A Flask-based local server was implemented in order for local users to view collected data through HTTP. It serves a page built with React displaying data in graphical format, along with limited options such as which data types and time periods to display. It can also automatically fetch data from the server and update in real time. The Flask app has API endpoints in which it will appropriately respond with a request’s data.

API

Along with the graphical display, a user can change some of the configuration de- tails of the system via a section on the site. The Flask app recieves the configuration changes with no authentication required, parses, and changes the system configu- ration. This is somewhat limited, however, it does change the functionality of the software in real time.

Number Identifier

I followed the online book Neural Networks and Deep Learning, by Michael Nielson, to make image recognition software that identified numerical digits in photos. In doing so, I created a neural network in Java, which trains itself on data from an MNIST database, and uses different photos from the same database to identify with over 80% validity. This was the most fun I've had on a project, because I got to learn while making something tangible. I love math, so using multivariable calcus for the gradient descent was exciting. Looking back at the text, I remember trying to understand everything that was being stated, which was a fun challenge. I look forward to continue my studies in this field.

Text Classifier

This project is the one I am most excited about, but mostly because it is what I have been working on most recently. Also, I am using C++ to create it, which is the language in which I am the most confident in my abilities. The goal of this project was to learn more about text analasis while getting introduced to natural language processing. The program, as of right now, attempts to correctly label texts, based on training data and separate data to set hyperparameters. With only a portion of the data set, I was able to correctly classify over 76% of the testing data used. In the future, I plan on continuing to learn different methods of classifying, and learn more in the field of natural language processing. The biggest benefit I find from this project is the education value. I am reading Introduction to Natural Language Processing, Jacob Eisenstein to learn.
Personal Website
This project is what you are looking at right now! I have been working on this for a while, more so because I opted to work on other things, and I am not passionate about website design. I figured that building a personal website would help me learn about a different field of computer science while being a working portfolio of sorts. A lot of time spent over thinking what frameworks/libraries/engines/services/devices/etc. to use, which was incredibly unproductive. The biggest lesson I've learned from this, is to not overthink what I am doing, just find a goal, and do it. The quicker I actually start working and programming, the more goals I will hit. I eventually landed on using ExpressJS, and planned on hosting it locally on a dedicated device. That fell through when I realized I am currently not able to login to my internet provider's user portal to portfoward, so I rented a virtual private server. Learning web developement is important, especially because it is the easiest, most efficient, and popular medium for me to express myself and my work in this field. The website is made up of javascript, css, and html. I opted to not use a front-end engines/libraries/frameworks because I figured it would be more useful to learn the basics on a simple site. The most difficult part was learning css, as you can see, but I have managed to make the website somewhat presentable. In the end, it was useful to gain more experience in something that I am not used to doing, and to have something that I've made visible to people.
Login System
I was working on my personal website while I thought of how it could be useful to know how to develop a system to log in to. I could not think of a useful way to implement it into my website, I dedicated some time to build it. First, I worked on a website built with ExpressJS that had a login screen. Since I do not know much about databases, I just chose one without much thought, and landed on mySQL. I was able to successfully able to confirm login credentials on the website and inform the user they entered correct information. Then, I started working on an IOS app to communicate with the server and be able to login. I had never programmed in Swift, so it took a bit of time to build the app which held the login page. After that, I made an Android app using Java, which I have used, so it was pretty seemless. It was illuminating to make different software that interacted with one another, because it shows the art of incapsulation incredibly well If I were to ever implement it into something that the public were to use, I would have to make it much more secure. At the moment, I have the apps communicating with the server in plain JSON files. It was a fun project that taught me about online communication and databases.

Priority Map

While working on the Text Classifier, I was using the 20 Newsgroups data set which has categories and subcategories. I needed a way to iterate through each datum in a category and all of the data subcategorized in it. Sometimes, I needed to iterate through all of the data. I figured the easiest way to do that was to find some simple container provided by the C++ Standard Library. For the first time in my programming, I had no data structure that could provide me with what I wanted! Therefore, I had to take a detour away from the text classifying, and write a container. It felt gratifying that I had to write separate code to assist in developing what I was working on. The tricky part was that since I was using such a large data set, I had to attempt to make the containter as efficient in time and memory as possible.
CSV Visualizer
I was asked by a friend to help the non-profit he was employed by to help by creating software for their website that visualized data from CSV files. The biggest issue was that they were using a hosting service that did not have much freedom in design, and I could only add javascript, html, and css files. The first obstacle was parsing a CSV file in javascript, because I am not too familiar with the language. After doing that, how to design the layout in order to make it easy to understand by the user was difficult. I had never programmed for the sole purpose of user experience, so it was an interesting challenge. D3 was the library I used to actually build the graphs. The types of visualizations are scatterplots, bar graphs, listing the data, pie charts, and line graphs. The user can choose which graph to display, along with the domain/range, and the specific data they would like to see. This project taught me a lot about software in websites, because there were a lot of features that I want to add, but I have to consider how it would be seen by the user. So, I was not only programming the actual function of the software, but how it would be used by the user. It was a helpful challenge that taught me to create under the pressure of various conditions. That being said, my friend's employers never ended up using it, but I am grateful that it was proposed to me in the first place!

Chess

Before I learned a lot about data structures and algorithms, I wanted to practice programming and improve my skills. So, I made a playable chess application. At the time I had bought a collection of books about computer science that talked about Java, and my friends were using Java and JavaFX. So I decided to learn basics of making a graphical user interface with Java. This was good practice of how to make applications usable and enjoyable for users, along with how to integrate the principles I had been learning, such as file input and output, into working code. The load/save system writes and reads to text files of what piece is on each tile, and whose turn it is. It was also good practice in learning how to structure my own code. I found out that making everything incapsulated when beginning a project can be incredibly helpful down the line. It helps to understand the code, and to edit it as I'm building it because it is easy to traverse the codebase. Also, since I was not experienced in building my own projects, I found out that I found great satisfaction in thinking of an idea, building it, and finishing it. I started making a bot to play me, but I figured I would rather spend my time elsewhere. Also, the min-max algorithm would take too much time to process when computing over three moves ahead, so I decided I would learn intelligent agents in the future. In the end, I was grateful that I had the motivation to follow through with making it, and I think it was valuable in the fact that it was one of the first bigger projects that I worked on.

Sorting Animation

This was also before I learned any sorting algortihms in school, but I wanted to learn more. I am grateful that I love learning, because it was the motivation for this project. I spent too much time looking online about computer science education road maps and what my classes were going to be in the future, and I figured it would be helpful to learn before I arrived in class. Therefore, with my knowledge on JavaFX from making a chess application, I thought it would be cool to animate how sorting algorithms work. The idea mostly came from Youtube videos of sorting animations. The algorithms included in the application are bubble sort, heap sort, insertion sort, merge sort, quick sort, and selection sort. On earlier projects, I realized that it was important keep in mind to organize code for expansion in the future. When it came time to add more features such as the values to sort and displaying sort data, it was a lot easier to implement it. It was interesting to see that I was gaining skills from creating projects, not just knowledge about programming languages and computer science math.