89 lines
3.0 KiB
Python
89 lines
3.0 KiB
Python
import socket
|
|
from Crypto.PublicKey import RSA
|
|
from Crypto.Cipher import PKCS1_OAEP as pkrsa
|
|
from Crypto.Cipher import AES
|
|
import zipfile
|
|
import os
|
|
import glob
|
|
import time
|
|
import requests
|
|
|
|
# global vars
|
|
endmessage = "---endmessage---"
|
|
servername = "http://10.25.10.177:63654"
|
|
HEADERSIZE = 20
|
|
BYTELEN = 1024
|
|
BYTELENBIG = 4096
|
|
verbose = True
|
|
|
|
# helper functions
|
|
def get_ip():
|
|
return [l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2]
|
|
if not ip.startswith("127.")][:1], [[(s.connect(('1.1.1.1', 53)),
|
|
s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET,
|
|
socket.SOCK_DGRAM)]][0][1]]) if l][0][0]
|
|
|
|
# returns the decompressed file
|
|
def decompress(filename):
|
|
zf = zipfile.ZipFile(filename, mode='r', compression=zipfile.ZIP_DEFLATED)
|
|
internalfile = zf.namelist()[0]
|
|
with open(filename[:-4], "wb+") as returnfile:
|
|
returnfile.write(zf.read(internalfile))
|
|
|
|
def decryptRSA(data):
|
|
key = RSA.import_key(open("privatekey.pem").read())
|
|
cipher = pkrsa.new(key)
|
|
return cipher.decrypt(data)
|
|
|
|
# simplifier helper function to call current publickey decryption method
|
|
def PKdecrypt(data):
|
|
return decryptRSA(data)
|
|
|
|
# decrypt files with given keyset
|
|
def decryptSet(keyset, vidset):
|
|
location = "videos/plaintext/" + str(int(time.time()))
|
|
os.mkdir(location)
|
|
if verbose:
|
|
print("Created folder to store files")
|
|
for i in range(len(vidset)):
|
|
file_in = open(vidset[i], "rb")
|
|
nonce, tag, ciphertext = [ file_in.read(x) for x in (16, 16, -1) ]
|
|
key = open(keyset[i], "rb").read()
|
|
key = PKdecrypt(key)
|
|
cipher = AES.new(key, AES.MODE_EAX, nonce)
|
|
data = cipher.decrypt_and_verify(ciphertext, tag)
|
|
with open(location + "/" + str(i+1) + ".mp4.zip", "wb+") as zp:
|
|
zp.write(data)
|
|
decompress(location + "/" + str(i+1) + ".mp4.zip")
|
|
if verbose:
|
|
print(f"Decrypted file ({i+1}/{len(vidset)})")
|
|
|
|
def downloadFromServer(urlWithPort):
|
|
url = urlWithPort + '/numFiles.txt'
|
|
r = requests.get(url, allow_redirects=True)
|
|
if verbose:
|
|
print("Downloading files...")
|
|
for i in range(int(r.content)):
|
|
url = urlWithPort + "/keys/" + str(i+1) + ".asc"
|
|
with open("keys/" + str(i+1) + ".asc", "wb+") as keyf:
|
|
keyf.write(requests.get(url, allow_redirects=True).content)
|
|
url = urlWithPort + "/videos/encrypted/" + str(i+1) + ".mpc"
|
|
with open("videos/encrypted/" + str(i+1) + ".mpc", "wb+") as vidf:
|
|
vidf.write(requests.get(url, allow_redirects=True).content)
|
|
if verbose:
|
|
print(f"Recieved ({i+1}/{int(r.content)})")
|
|
|
|
while True:
|
|
# download all videos
|
|
downloadFromServer(servername)
|
|
|
|
# get all video and key files in array (strings of file locations)
|
|
vidset = [file for file in glob.glob("videos/encrypted/*", recursive=False)]
|
|
keyset = [file for file in glob.glob("keys/*", recursive=False)]
|
|
decryptSet(keyset, vidset)
|
|
if(verbose):
|
|
print('Done')
|
|
exit()
|
|
|
|
# stitch files together (TODO later)
|