File size: 4,463 Bytes
c3a814a
 
 
 
0fd032c
c3a814a
 
fa163a1
 
c3a814a
 
 
0fd032c
 
 
c3a814a
0940b20
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
 
0940b20
 
 
 
c3a814a
0940b20
 
c3a814a
0940b20
fa163a1
 
 
 
 
 
c3a814a
fa163a1
 
 
 
 
 
 
 
c3a814a
0940b20
 
fa163a1
 
 
 
 
 
 
 
c3a814a
 
 
0940b20
6727e6c
 
 
 
 
 
 
 
 
c3a814a
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
import os
import io
import wave
import struct
import logging
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'}

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 encrypt_file(filepath, factor):
    logger.info(f"Encrypting file: {filepath}")
    with open(filepath, 'rb') as file:
        data = file.read()
    
    # Convert data to audio samples
    samples = [ord(byte) * factor for byte in data.decode('latin-1')]
    
    # 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)
    
    # Use a list comprehension with error handling
    decrypted_bytes = bytearray()
    for sample in samples:
        byte_value = int(round(sample / factor))
        # Ensure the byte value is within the valid range (0-255)
        decrypted_bytes.append(max(0, min(byte_value, 255)))
    
    decrypted_data = bytes(decrypted_bytes)
    
    # 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)