Как стать автором
Обновить

Прячем текст в MP3

Время на прочтение 4 мин
Количество просмотров 21K
В мире все люди делятся на два типа: одни хотят, что -то спрятать, другие же наоборот хотят, что то найти. Сегодня мы будем на стороне первых. Мы будем прятать.
О том как спрятать файлы в системе многие наверняка и так знают. А вот о том, как спрятать текст в файлы, но так что бы его не было видно, знают немногие. И так приступим.
Скрывать мы будем обычный текст из «txt» файла. А записывать его мы будем в mp3 файлы. Многие знаю что в mp3 файлах есть теги. Но вряд ли кто то задумывался какова их длинна и что с ними можно сделать. В Википедии сказано что длина тегов
  • название
  • исполнитель
  • альбом

равна 30 символам. Еще есть тег Комментарий, но мы не будем его трогать.
Теги можно изменять с помощью специальных программ. Таких как например Mp3Tag .
Что и куда мы будем писать разобрались. Теперь решим на чем мы будем писать. Для этих целей я выбрал PHP и PEAR package MP3_Id. К этому набору нам надо добавить виртуальный сервер, Denwer или XAMPP или еще какой. Кому как нравится.
Наш инструмент будет состоят из двух скриптов, один из которых будет записывать, а другой соответственно считывать MP3 теги.

Для начала надо установить модуль PEAR MP3_Id:

  1. Start Menu->Run->CMD
  2. Переходим в деректорию где установлен интерпретатор php -> pear install MP3_Id

Приступим к разбору скриптов.

Скрипт номер один. read.php


Ниже будут перечислены и разобраны функции использующиеся в этом скрипте.

Нам нужна функция которая подсчитает количество строк по 30 символов в файле.

function CalcSize($f) //рассчитываем количество строк по 30 символов
{
	$size = 0; //количествое символов в файле
	while(!feof($f))
	{
		fread($f, 1);
		$size++;
	}
	$dataCount = floor($size / 30) + 1;
//на 30 без остатка не получится разделить поэтому на всякий случай прибавляем еще одну сточку.
	fclose($f);
	return $dataCount; 
// возвращаем количество строк по 30 символов
}


Функция читающая данные по 30 символов из файла в массив.

function ReadDataFiles($size) 
{
	$arr = array();
	$f = fopen('data.txt','rb');
	for($i = 0; $i < $size; $i++)
	{
		$arr[$i] = fread($f, 30);//пишем в строчку по 30 смволов
	}
	fclose($f);
	return $arr;
}


Функции для работы с тегами.
Чтение:
function ReadTags($file) 
{
	echo $file.' ';
	$mp3 = &new MP3_Id();
	$result = $mp3->read($file);
	
	echo $mp3->getTag('name');
	echo $mp3->getTag('artists');
	echo $mp3->getTag('album');
}


Запись:
function SetTags($file, $data1,$data2,$data3) 
{
	$mp3 = &new MP3_Id();
	$result = $mp3->read($file);
	$mp3->setTag('name', $data1);
	$mp3->setTag('artists', $data2);
	$mp3->setTag('album', $data3);
	$result = $mp3->write();
}


Также нам потребуется создавать произвольные имена файлов. Мы просто будем брать один исходный и копировать его.

function GenerateName()
{
	$abc = array('q','w','e','r','t','y',
         			 'u','i','o','p','a','s',
				 'd','f','g','h','j','k',
				 'l','z','x','c','v','b',
				 'n','m','1','2','3','4',
				 '5','6','7','8','9','0');
	$name="";
	for($i = 0; $i < 8; $i++)
	{
		$index = rand(0, count($abc) - 1);
		$name .= $abc[$index];
	}
	return $name;
}


И так все необходимые функции у нас есть. Можно составлять структуру скрипта.
Подключим только что установленный модуль.
require_once 'MP3/Id.php';


$fileSize = CalcSize(); // количество строк по 30 символов
$words = ReadDataFiles($fileSize);// массив со строками


И вот функция которая прячет текст в теги. Ей на вход подаются: массив со строками, и количество строк.

function HideData($arr, $number)
{
        $numberMp3Files = floor($number / 3) + 1;
//количество мп3 файлов для заливки(делаем на один больше потому что округление происходит в меньшую //сторону
	mkdir('files');//создаем дерикторию для файлов
	
        for($i = 0; $i < $numberMp3Files; $i++) // создаем файлы
	{
		$name = GenerateName();	
		$name .= '.mp3';
		copy('file.mp3','files/'.$name);// копируем 
	} 
		
        chdir('files');// переходим в нее
	$list = glob('*.mp3'); // получаем список mp3 файлов
	
	sort($list);	//сортируем по увеличению
		
		
	$a = 0; // счетчик для слов
	$b = 0; // стечик для записаных файлов
		
	for($i = 0; $i < count($list); $i++)
	{
		SetTags($list[$i],$arr[$a],$arr[$a+1],$arr[$a+2]);
		$a +=3; 
		if($b < count($list))$b++; //если количество записаных файлов меньше то продолжаем
		else break; // иначе брейк
	}
}	


Вот и весь скрипт для записи текста в теги mp3 файлов. Хочу добавить, что MP3 файл для копирования желательно брать маленького размера. И называть его file.mp3.

Осталось написать скрипт который вернет нам все обратно. Из тегов mp3 в текстовый файл.

Скрипт номер два. write.php



Опять подключаем модуль PEAR
require_once 'MP3/Id.php';


Создаем файл для записи.
$handle = fopen("new_data.txt","w");


Уже знакомая нам функция для чтения тегов. Слегка изменная.
function ReadTags($file, $fo)
{
	$mp3 = &new MP3_Id();
	$result = $mp3->read($file);
	
	$name = $mp3->getTag('name');
	$srtists = $mp3->getTag('artists');
	$album = $mp3->getTag('album');
		
	fputs($fo, "$name");
	fputs($fo,"$artists");
	fputs($fo, "$album");
	}


Переходим в дерикторию с файлами.
chdir('files');


создаем список файлов MP3
$list = glob('*.mp3');


Сортируем его
sort($list);


И для каждого файла вызываем функцию ReadTags
foreach($list as $a)
{
	ReadTags($a, $handle);
}


Как работать с PEAR MP3_Id лучше посмотреть на оффсайте. Я врядли понятно объясню. Во время опытов было выявлено, что если исходный файл имеет какие то теги, то в windows созданые файлы имеют теже самые теги. Но при этом наша информация в них записывается и прекрасно читается. А если же нет тегов, то пишутся наши, которые прекрасно видны в проводнике. Так что лучше использовать файл с тегами, и тогда все точно будет супер секретно.
Если найдете какие-то ошибки, или знаете как можно улучшить скрипт, обязательно пишите. Буду только рад. За ошибки в оформлении поста прошу извинить, он первый.
Теги:
Хабы:
+2
Комментарии 19
Комментарии Комментарии 19

Публикации

Истории

Работа

PHP программист
175 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн