File size: 5,005 Bytes
c3a814a 0fd032c 1b6c6d6 c3a814a fa163a1 c3a814a 0fd032c c3a814a 1b6c6d6 c3a814a 0fd032c c3a814a 0fd032c c3a814a 0fd032c c3a814a 0fd032c c3a814a fa163a1 0940b20 c3a814a 42bca7e 0940b20 42bca7e 0940b20 c3a814a 0fd032c 42bca7e 0fd032c 42bca7e 0fd032c 42bca7e c3a814a 0fd032c c3a814a 1b6c6d6 0940b20 c3a814a 1b6c6d6 0940b20 a99a6f1 c3a814a 1b6c6d6 0940b20 fa163a1 c3a814a fa163a1 c3a814a 0940b20 fa163a1 c3a814a 0940b20 6727e6c 1b6c6d6 6727e6c c3a814a 1b6c6d6 fa163a1 0940b20 fa163a1 c3a814a eb9d562 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
import os
import io
import wave
import struct
import logging
import hashlib
from flask import Flask, render_template, request, send_file, jsonify
from werkzeug.utils import secure_filename
from pydub import AudioSegment
import magic
app = Flask(__name__)
logging.basicConfig(level=logging.DEBUG)
logger = app.logger
UPLOAD_FOLDER = '/tmp'
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'mp3', 'wav', 'txt', 'pdf', 'docx'}
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/')
def index():
return render_template('index.html')
@app.route('/process', methods=['POST'])
def process_file():
logger.info("Processing file request received")
if 'file' not in request.files:
logger.error("No file part in the request")
return jsonify({'error': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
logger.error("No selected file")
return jsonify({'error': 'No selected file'}), 400
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
logger.info(f"File saved: {filepath}")
factor = int(request.form['factor'])
is_decrypting = filename.lower().endswith('.mp3')
logger.info(f"Processing file: {'decrypting' if is_decrypting else 'encrypting'} with factor {factor}")
try:
if is_decrypting:
output, output_filename, mimetype = decrypt_file(filepath, factor)
else:
output, output_filename, mimetype = encrypt_file(filepath, factor)
logger.info(f"File processed successfully. Output size: {len(output)} bytes")
os.remove(filepath)
logger.info(f"Temporary file removed: {filepath}")
return send_file(
io.BytesIO(output),
mimetype=mimetype,
as_attachment=True,
download_name=output_filename
)
except Exception as e:
logger.error(f"Error processing file: {str(e)}")
os.remove(filepath)
return jsonify({'error': str(e)}), 500
logger.error("Invalid file type")
return jsonify({'error': 'Invalid file type'}), 400
def calculate_checksum(data):
return hashlib.md5(data).hexdigest()
def encrypt_file(filepath, factor):
logger.info(f"Encrypting file: {filepath}")
with open(filepath, 'rb') as file:
data = file.read()
# Calculate checksum
checksum = calculate_checksum(data)
# Convert data to audio samples
samples = [int(byte * factor) for byte in data]
# Add checksum to the beginning of the samples
checksum_samples = [ord(byte) for byte in checksum.encode('ascii')]
samples = checksum_samples + samples
# Create WAV file
wav_output = io.BytesIO()
with wave.open(wav_output, 'wb') as wav_file:
wav_file.setnchannels(1)
wav_file.setsampwidth(2)
wav_file.setframerate(44100)
wav_file.writeframes(struct.pack(f'{len(samples)}h', *samples))
# Convert WAV to MP3
wav_output.seek(0)
audio = AudioSegment.from_wav(wav_output)
mp3_output = io.BytesIO()
audio.export(mp3_output, format="mp3")
logger.info(f"Encryption complete. Output size: {mp3_output.getbuffer().nbytes} bytes")
return mp3_output.getvalue(), 'encrypted.mp3', 'audio/mpeg'
def decrypt_file(filepath, factor):
logger.info(f"Decrypting file: {filepath}")
# Convert MP3 to WAV
audio = AudioSegment.from_mp3(filepath)
wav_output = io.BytesIO()
audio.export(wav_output, format="wav")
wav_output.seek(0)
with wave.open(wav_output, 'rb') as wav_file:
params = wav_file.getparams()
frames = wav_file.readframes(wav_file.getnframes())
samples = struct.unpack(f'{len(frames)//2}h', frames)
# Extract checksum
checksum = ''.join(chr(sample // factor) for sample in samples[:32])
samples = samples[32:]
# Decrypt data
decrypted_bytes = bytearray()
for sample in samples:
byte_value = int(round(sample / factor))
decrypted_bytes.append(max(0, min(byte_value, 255)))
decrypted_data = bytes(decrypted_bytes)
# Verify checksum
if calculate_checksum(decrypted_data) != checksum:
raise ValueError("Checksum verification failed. The file may be corrupted or the wrong factor was used.")
# Detect original file type
mime = magic.Magic(mime=True)
file_type = mime.from_buffer(decrypted_data)
file_extension = file_type.split('/')[-1]
logger.info(f"Decryption complete. Output size: {len(decrypted_data)} bytes")
return decrypted_data, f'decrypted_file.{file_extension}', file_type
if __name__ == '__main__':
app.run(debug=True) |