Изучение возможности передачи данных по звуковому каналу

В рамках эксперимента перед нами стояла задача выявления дополнительных способов передачи сигналов с одного персонального компьютера (далее — ПК) на другой. В данной статье речь пойдет про один из найденных экзотических способов – передаче файлов-инструкций через аудио разъем ПК.

22

import sounddevice as sd
import binascii
import re
import numpy as np
import scipy.io.wavfile as wavfile

# Частоты звукового кода (от 27.5 Гц до 4000 Гц)
frequencies = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']

# Создаем шаблон для преобразования шестнадцатеричных данных в аудиоформу
def create_audio_template():
# Создаем пустой массив для хранения частотных значений
audio_template = []

# Проходимся по всем возможным комбинациям шестнадцатеричных символов
for hex_char in frequencies:
# Преобразуем шестнадцатеричный символ в частоту
frequency = 27.5 + (float(int(hex_char, 16)) * (4000 - 27.5) / 15)
audio_template.append(frequency)

return audio_template

# Функция для записи аудио данных в виде шестнадцатеричного кода
def accept_hex_input():
# Создаем пустую строку для хранения шестнадцатеричного кода
hex_code = ""

# Создаем шаблон аудиоформы
audio_template = create_audio_template()

# Определяем обратный вызов для обработки аудиоданных
def callback(indata, frames, time, status):
nonlocal hex_code
# Преобразуем аудиоданные в шестнадцатеричный код и добавляем к строке
hex_code += convert_to_hex(indata, audio_template)

# Начинаем запись с микрофона
sd.InputStream(callback=callback, samplerate=44100).start()

# Ждем ввода пользователя для остановки записи
input("Нажмите Enter, чтобы остановить запись...")

# Останавливаем запись
sd.stop()

# Записываем шестнадцатеричные данные в текстовый файл
write_hex_data(hex_code)

print("Шестнадцатеричные данные сохранены в файл text1.txt.")

# Функция для преобразования аудиоданных в шестнадцатеричный код
def convert_to_hex(audio_data, audio_template):
hex_code = ""
# Проходимся по каждому сэмплу аудиоданных
for sample in audio_data:
# Находим ближайший индекс в шаблоне частот
idx = (np.abs(audio_template - sample)).argmin()
# Преобразуем индекс в шестнадцатеричный символ
hex_char = frequencies[idx]
hex_code += hex_char
return hex_code

# Функция для записи шестнадцатеричных данных в текстовый файл
def write_hex_data(hex_data):
# Удаляем символы, не являющиеся шестнадцатеричными
hex_data = re.sub('[^0-9a-fA-F]', '', hex_data)

# Проверяем, имеет ли шестнадцатеричный код нечетную длину
if len(hex_data) % 2 != 0:
hex_data += '0'

# Записываем шестнадцатеричные данные в текстовый файл
with open('text1.txt', 'w') as file:
formatted_hex_data = ' '.join(hex_data[i:i+2] for i in range(0, len(hex_data), 2))
file.write(formatted_hex_data)

# Функция для преобразования шестнадцатеричных данных в аудиоформу
def convert_to_audio():
# Читаем шестнадцатеричные данные из текстового файла
with open('text.txt', 'r') as file:
hex_data = file.read().strip()

# Преобразуем шестнадцатеричные данные в аудиоформу
audio_data = convert_to_audio_data(hex_data)

# Сохраняем аудиоформу в файл WAV
write_audio_data('audio.wav', audio_data)

print("Текстовые данные преобразованы в audio.wav.")

# Функция для преобразования шестнадцатеричных данных в аудиоформу
def convert_to_audio_data(hex_data):
# Удаляем символы, не являющиеся шестнадцатеричными
hex_data = re.sub('[^0-9a-fA-F]', '', hex_data)

# Проверяем, имеет ли шестнадцатеричный код нечетную длину
if len(hex_data) % 2 != 0:
hex_data += '0'

# Преобразуем шестнадцатеричные данные в двоичные данные
binary_data = binascii.unhexlify(hex_data)

# Убедимся, что размер двоичных данных делится на 2
if len(binary_data) % 2 != 0:
binary_data += b'\x00'

# Преобразуем двоичные данные в аудиоформу
audio_data = np.frombuffer(binary_data, dtype=np.int16)

return audio_data

# Функция для записи аудиоформы в файл WAV
def write_audio_data(filename, audio_data):
wavfile.write(filename, 44100, audio_data)

# Запрашиваем у пользователя действие
action = input("Введите 'accept', чтобы принять шестнадцатеричные данные, или 'convert', чтобы преобразовать текст в аудио: ")

if action == 'accept':
accept_hex_input()
elif action == 'convert':
convert_to_audio()
else:
print("Недопустимое действие. Пожалуйста, попробуйте еще раз.")