This project provides two Python scripts (sender.py and receiver.py) for securely transferring the contents of a folder (SEND_FOLDER) from one machine (Sender/Host) to another (Receiver/Target) over a network.
- Mutual TLS (mTLS): Ensures both the sender and receiver authenticate each other using cryptographic certificates before any data transfer. Prevents spoofing and man-in-the-middle attacks (assuming initial certificate exchange is secure).
- End-to-End Encryption: The folder contents are zipped and then encrypted using AES (via Fernet) with a unique key for each transfer. Only someone with the decryption key can access the original files.
- Self-Signed Certificate Generation: The scripts automatically generate the necessary TLS certificates if they don't exist.
- Simple Authentication Code: An additional 4-digit code is used after the mTLS handshake as a basic confirmation step.
- User-Friendly Prompts: GUI dialogs guide the user through entering necessary information (IP, auth code, decryption key).
- Automatic Dependency Handling (Receiver): The receiver script attempts to create a Python virtual environment and install the
cryptographydependency if run outside a venv.
- Python 3.x installed on both Sender and Receiver machines.
pip(Python package installer) available (usually included with Python).- The
cryptographyPython library (Receiver script attempts to install this automatically if needed).
Follow these steps carefully on both the Sender (Host) and Receiver (Target) machines.
(Note: BOTH sender.py and receiver.py may COEXIST on the same machine in the same folder as long as BOTH the cert.pem files are properly exchanged between machines. see below).
(Note: The programs may be simpler to run in an IDE for the first few runs to check for package dependencies and generate necessary files).
-
Create Main Folder:
- On the Sender machine, create a main project directory (e.g.,
SecureTransfer). - On the Receiver machine, create a main project directory (e.g.,
SecureTransfer).
- On the Sender machine, create a main project directory (e.g.,
-
Place Scripts:
- Place
sender.pyinside the main folder (SecureTransfer) on the Sender machine. - Place
receiver.pyinside the main folder (SecureTransfer) on the Receiver machine.
- Place
-
Initial Run & Certificate/Folder Generation:
- On the Receiver Machine:
- Open a terminal/command prompt, navigate (
cd) into theSecureTransferdirectory. - Run the receiver script:
python receiver.py(orpython3 receiver.py). - The script will:
- Attempt to create a virtual environment (
venv) and installcryptographyif needed (this might take a moment). It may restart itself within the venv. - Generate
receiver_cert.pem(public certificate) andreceiver_key.pem(private key) in theSecureTransferfolder if they don't exist. - Create the
received_folderdirectory on your Desktop if it doesn't exist. - IMPORTANT: It will likely show an error message saying
sender_cert.pemis missing. This is expected at this stage. You can close the error message and the script for now.
- Attempt to create a virtual environment (
- Open a terminal/command prompt, navigate (
- On the Sender Machine:
- Open a terminal/command prompt, navigate (
cd) into theSecureTransferdirectory. - Run the sender script:
python sender.py(orpython3 sender.py). - The script will:
- Generate
sender_cert.pem(public certificate) andsender_key.pem(private key) in theSecureTransferfolder if they don't exist. - Create the
SEND_FOLDERdirectory insideSecureTransferif it doesn't exist. - IMPORTANT: It will prompt for the Target IP/Auth code. It might also show an error if
receiver_cert.pemis missing (depending on how quickly you close the IP/Auth prompt). This is expected. You can cancel or close the prompts/script for now.
- Generate
- Open a terminal/command prompt, navigate (
- On the Receiver Machine:
-
Exchange PUBLIC Certificates:
- This is the crucial step for setting up mTLS trust. You need to securely transfer the public certificate from each machine to the other.
- Copy
receiver_cert.pemfrom the Receiver'sSecureTransferfolder TO the Sender'sSecureTransferfolder. - Copy
sender_cert.pemfrom the Sender'sSecureTransferfolder TO the Receiver'sSecureTransferfolder. - SECURITY WARNING: Use a secure method for this transfer (e.g., USB drive,
scp, secure chat). NEVER copy the_key.pemfiles between machines. These private keys must remain secret on their respective machines.
-
Firewall Configuration (Receiver):
- The Receiver machine's firewall must allow incoming TCP connections on port
12346(this port number is defined asTLS_PORTin both scripts). - How you configure this depends on your operating system and firewall software.
- Example for Linux using UFW:
sudo ufw allow 12346/tcp - (Note: Refer to my separate Linux firewall script/readme if for easy-script instructions).
- Example for Windows Firewall: You would typically create a new Inbound Rule allowing TCP traffic on port 12346 for Python or the specific script.
- The Receiver machine's firewall must allow incoming TCP connections on port
Once setup is complete:
-
Prepare Files (Sender):
- Place all the files and folders you want to send inside the
SEND_FOLDERlocated within the Sender'sSecureTransferdirectory.
- Place all the files and folders you want to send inside the
-
Run Receiver:
- On the Receiver machine, navigate to the
SecureTransferdirectory in your terminal. - Run
python receiver.pyor in an IDE loadpython receiver.py, and run it as Python file. - A window will appear showing:
- The Receiver's IP Address (verify this is the correct one the Sender can reach).
- The Connection Port (
12346). - A randomly generated 4-digit Auth Code.
- Communicate the Receiver's IP and the 4-digit Auth Code to the Sender user.
- The Receiver window will wait for you to enter the 16-character Decryption Key. You will get this key from the Sender user in the next steps. Keep this window open.
- On the Receiver machine, navigate to the
-
Run Sender:
- On the Sender machine, navigate to the
SecureTransferdirectory in your terminal. - Run
python sender.pyor in an IDE loadpython sender.py, and run it as Python file. - A window will prompt you for:
- The Target IP (enter the IP address shown by the Receiver).
- The 4-digit Auth Code (enter the code shown by the Receiver).
- Click "Submit".
- On the Sender machine, navigate to the
-
Perform Transfer:
- The Sender script will zip and encrypt the contents of
SEND_FOLDER. - A new window will appear on the Sender machine displaying the 16-character Decryption Key.
- IMPORTANT: Securely communicate this Decryption Key to the Receiver user (e.g., verbally, secure chat).
- The Sender will attempt to connect to the Receiver using mTLS and the Auth Code.
- The Receiver user must now enter the Decryption Key (communicated by the Sender) into their waiting prompt and click "Submit Decryption Key & Start Listening".
- If mTLS, Auth Code, and Decryption Key entry are successful, the encrypted file transfer will begin.
- Progress will be logged in the terminals of both scripts.
- The Sender script will zip and encrypt the contents of
-
Verify Transfer (Receiver):
- Once the transfer is complete, the Receiver script will automatically decrypt the data and unzip the contents into the
received_folderlocated on the Receiver's Desktop. - Check the
received_folderto ensure all files arrived correctly.
- Once the transfer is complete, the Receiver script will automatically decrypt the data and unzip the contents into the
- Private Keys (
_key.pem): These are extremely sensitive. Never share them. Protect them appropriately on each machine. If a private key is compromised, the security of that machine's identity is broken. - Initial Certificate Exchange: The security of mTLS relies on the initial exchange of public certificates (
.pemfiles) being secure. If an attacker intercepts and replaces certificates during this first exchange, they could potentially perform a man-in-the-middle attack later. - Decryption Key Exchange: The 16-character decryption key generated by the sender for each transfer must be transmitted securely to the receiver. Avoid sending it via unencrypted email or insecure chat. Verbal communication (in person or trusted phone call) or end-to-end encrypted chat are better options.
- Auth Code: The 4-digit code provides a very basic check after mTLS authentication. It's not a strong security measure on its own but helps prevent accidental connections if multiple receivers are running.
- Network Security: This tool assumes the network allows direct connection on the specified port. Use in untrusted networks requires careful firewall management.
- Self-Signed Certificates: While providing encryption and authentication between these specific sender/receiver pairs (once certs are exchanged), self-signed certificates are not inherently trusted by other systems or browsers like certificates from a public Certificate Authority (CA).
- Connection Refused/Timeout: Check firewalls on both machines (especially the Receiver's incoming rule for port 12346). Ensure the Receiver script is running. Verify the correct IP address was entered on the Sender. Check network connectivity.
- TLS/SSL Errors (
certificate verify failed,sslv3 alert handshake failure, etc.):- Most likely cause: Public certificates were not exchanged correctly or are missing. Double-check that
sender_cert.pemis on the Receiver andreceiver_cert.pemis on the Sender, both in the script's directory. - Ensure the corresponding
_key.pemfile exists alongside the.pemfile on its own machine. - Rare: Certificate might be corrupted. Try deleting the
.pemand_key.pemfiles on both machines and re-running the initial setup steps to regenerate them.
- Most likely cause: Public certificates were not exchanged correctly or are missing. Double-check that
- Authentication Failed (
Receiver rejected the authentication code): The wrong 4-digit Auth Code was entered on the Sender. - Decryption Failed (
InvalidToken): The wrong Decryption Key was entered on the Receiver, or the received.encfile was corrupted during transfer. - File Not Found Errors: Ensure the scripts are run from within their main
SecureTransferdirectory. Check thatSEND_FOLDERexists on the sender andreceived_folderexists on the receiver's Desktop. - Permission Denied: The script might lack permissions to read
SEND_FOLDER, write to the script directory (for certs/keys), or write to thereceived_folderon the Desktop. Check folder/file permissions. - Package Not Found: You may not have the Python package installed. Example
Cryptography.
This project is licensed under the MIT License.
#Copyright (c) [2025] [Crenta] [All rights reserved].
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. THIS SOFTWARE IS PROVIDED BY [Crenta] “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL [Crenta] BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.