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)