-
سه شنبه, ۷ ارديبهشت ۱۴۰۰، ۱۱:۳۴ ق.ظ
-
۱۷۴۰

نوشتن اسکریپت مخفی کردن اطلاعات پشت آهنگ در پایتون
درود به همه !
وقتی بحث پنهان نگاری اطلاعات (Steganography) در فایل های صوتی پیش میاد همیشه نظر ها میره به سمت روش هایی مثل LSB و ... که در اصل میان بیت های مربوط به فرکانس های آهنگ ها رو دستکاری میکنند تا بتوانند اطلاعات مورد نظر رو داخل فایل جاسازی کنند . اما امروز میخوایم روشی بسیار ساده برای مخفی کردن اطلاعات پشت عکس رو یادبگیریم که اصلا مانند روش هایی مثل LSB و تغییر فرکانس های آهنگ نیست. بلکه این روش بسیار ساده تر از بقیه روش ها برای اینکار هستش . با ما همراه باشید .
پنهان نگاری (Steganography) : شاخه ای از علم هکینگ است که شامل روش هایی برای مخفی کردن اطلاعات پشت اطلاعاتی دیگر هستش . برای مثال مخفی کردن اطلاعات پشت عکس یا مخفی کردن اطلاعات پشت ویدیو و .....
اگه یادتون باشه قبلا در مورد Steganography یا همون پنهان نگاری اطلاعات پست هایی منتشر کردیم .
پیش نیاز این پست ، پست (نوشتن اسکریپت مخفی کننده ی اطلاعات در فایل های تصویری PNG در پایتون) میباشد . بنابراین قبل از خواندن این پست مطمئن بشید که پستی که معرفی کردیم رو خونده باشید .
اما چجوری میخوایم اطلاعات رو پشت یک فایل صوتی مخفی کنیم ؟
همینطور که میدونید هر فایل صوتی یه سری Tag هایی داخلش میتونه داشته باشه که اطلاعات مربوط به آهنگ رو داخلش ذخیره میکنند . مثلا نام هنرمند ، نام آلبوم یا حتی کاور آهنگ (تصویری که وقتی آهنگ رو با موزیک پلیر ها پخش میکنید نمایش داده میشه) . این اطلاعات در قالب Tag هایی در فایل های صوتی ذخیره میشن و پخش کننده های فایل های صوتی از طریق خواندن این Tag ها میتوانند اطلاعات آهنگ مثل نام هنرمند ، آلبوم و تصویر آهنگ و ... رو به ما نشون بدن .
اما اینها به چه درد ما میخوره ؟ ما اینجا فقط با یک Tag در فایل صوتی کار داریم اونم کاور آهنگ یا عکسی هستش که به عنوان کاور برای فایل صوتی ، داخلش ذخیره میشه . ما با استفاده از یک اسکریپت پایتون میتونیم هر عکسی رو به عنوان کاور فایل صوتی داخلش ذخیره کنیم . همچنین میشه کاور یک فایل صوتی رو به صورت یک فایل عکس ، از فایل صوتی استخراج کرد و ذخیره کرد .
اگه یادتون باشه در پستی که به عنوان پیشنیاز معرفی شد یاد گرفته بودیم چه شکلی اطلاعات رو با استفاده از پایتون پشت یک عکس با فرمت PNG ذخیره کنیم .
فکر میکنم دیگه تا ته خطو رفتید که میخوایم چیکار کنیم :) . آفرین ! قراره یه سری اطلاعات رو پشت یک عکس دلخواه ذخیره کنیم سپس این عکسی که اطلاعات پشتش ذخیره شده رو به عنوان کاور یک فایل صوتی تنظیم کنیم . اینطوری عکس و در نتیجه اطلاعات مخفی پشتش بر روی فایل صوتی ذخیره میشن . خیلی شیک و مجلسی !
تا اینجا اطلاعات رو مخفی کردیم . حالا چطوری اطلاعات رو از پشت آهنگ در بیاریم ؟ خیلی سادس همون الگوریتم مخفی کردن رو برعکس میریم . یعنی اول کاور فایل صوتی رو به صورت یک فایل عکس استخراج میکنیم . حالا این همون عکسی هستش که اطلاعات رو پشتش ذخیره کردیم . پس اطلاعت رو از پشت عکس در میاریم .
خب حالا که الگوریتم کار رو میدونیم بریم سراغ کد نویسی و البته ذکر یک نکته مهم .
نکته مهم : این روش کاملا با تصاویر PNG سازگاره . بنابراین بهترین حالت این هستش که فایل تصویری (فایل کاور) در فرمت PNG و فایل صوتی در فرمت mp3 باشه . در غیر این صورت به هر حال ممکنه با ارور های غیر منتظره ای مواجه بشیم که فعلا ازشون خبر نداریم . ممکنم هست با هیچ اروری مواجه نشیم :)
برای نوشتن این سورس ما نیاز به سه کتابخونه داریم .
1 - کتابخونه ی eyed3 برای تنظیم کردن کاور بر روی فایل صوتی و استخراج کردن کاور از روی اون :
نصب eyed3 در لینوکس :
MrPython@debian:~$ sudo pip3 install eyed3
نصب eyed3 در ویندوز :
C:\> pip install eyed3
2 - کتابخونه ی stepic برای مخفی کردن اطلاعات پشت عکس و خواندن اطلاعات مخفی پشت عکس :
نصب stepic در لینوکس :
MrPython@debian:~$ sudo pip3 install stepic
نصب stepic در ویندوز :
C:\> pip install stepic
3 - کتابخونه ی Pillow برای باز کردن و خواندن فایل های تصویری :
نصب Pillow در لینوکس :
MrPython@debian:~$ sudo pip3 install Pillow
نصب Pillow در ویندوز :
C:\> pip install Pillow
خیلی خب تا اینجا کتابخونه هامون رو نصب کردیم . بریم سراغ سورس کد . ما دوتا سورس کد داریم . اولین سورس ، سورسی هستش که اطلاعات رو مخفی میکنه پشت آهنگ (Encoder) و دومین سورس ، سورسی هستش که اطلاعات مخفی شده رو از دل آهنگ میکشه بیرون(Decoder) :)
سورس مخفی کننده اطلاعات (Encoder) :
# https://mrpython.blog.ir
from eyed3 import load from stepic import encode from PIL import Image
data = "this is The Secret Data ha ha ha haaaaaa. https://mrpython.blog.ir"
audio = input("Audio : ") img_name = input("Image : ") audio = load(audio) # Opening the audio file
img = Image.open(img_name) img_steg = encode(img , data.encode()) # Encode data into Image img_steg.save(img_name) # save encoded image
audio.initTag() audio.tag.images.set(3 , open(img_name,"rb").read() , "image/png") # set cover to audio file audio.tag.save() # save changes in audio file
print("ok") # The END :) input()
توضیح سورس : در ابتدا ایمپورت های لازم رو انجام دادیم . از کتابخونه ی eyed3 تابع load برای باز کردن فایل صوتی و تغییر کاور و ... . تابع encode از کتابخونه ی stepic برای پنهان کردن اطلاعات پشت عکس PNG و تابع Image برای باز کردن و خواندن فایل عکس از کتابخونه ی Pillow .
پس از ایمپورت ها اومدیم یه متغییر به اسم data تعریف کردیم . در اصل محتویات این متغییر متنی هستش که قراره مخفی بشه پشت عکس و در نتیجه اهنگ .بعد از اون یه input از کاربر گرفتیم و مسیر فایل آهنگی که قراره اطلاعات پشتش مخفی بشه رو ازش پرسیدیم . پس از اون یه ورودی دیگه گرفتیم و مسیر تصویری که قراره اطلاعات پشتش مخفی بشه و به عنوان کاور اهنگ تنظیم بشه رو پرسیدیم .
سپس با استفاده از تابع load فایل صوتی که کاربر معرفی کرده بود رو باز کردیم و ریختیم داخل متغییر audio .
سپس با استفاده از تابع Image.open فایل تصویری که کاربر معرفی کرده بود رو باز کردیم و ریختیم داخل متغییر img
پس از اون با استفاده از تابع encode اومدیم اطلاعات متغییر data رو پشت عکسی که باز کردیم (img) ذخیره کردیم و حاصل اینکار یعنی عکس جدیدی که اطلاعات پشتش مخفی شده رو ریختیم داخل متغییر img_steg . سپس این عکس رو در خط بعد با استفاده از تابع save ذخیره کردیم .
تا اینجا اطلاعات رو پشت عکس ذخیره کردیم . حالا باید این عکس رو کاور فایل آهنگ بکنیم . ابتدا با فراخوانی تابع initTag فایل صوتی رو برای تعریف Tag کاور آماده کردیم .
در خط بعد با استفاده از تابع audio.tag.images.set اومدیم فایل تصویری که ساختیم رو به عنوان کاور روی اهنگ تنظیم کردیم . سه تا ورودی به این تابع دادیم . اولین ورودی عدد 3 هستش که نشون دهنده اینه که ما میخوایم یه فایل عکس به عنوان کاور برای آهنگ انتخاب کنیم. ورودی دوم محتویات باینری فایل عکسی هستش که میخوایم روی آهنگ بزاریم . همینطور که میبینید برای اینکار از تابع open در مد rb (Read Binary) استفاده کردیم . و نهایتا در ورودی سوم فرمت فایل تصویری رو مشخص کردیم . چون فایلمون PNG هستش نوشتیم image/png .
در خط بعد تغییرات کاور رو در فایل صوتی save کردیم و تمامممم . تا اینجا تمام کاری که میخواستیمو کردیم . یعنی اطلاعاتو پشت عکس گذاشتیم و عکس رو به عنوان کاور فایل صوتی تنظیم کردیم .
بریم سراغ سورس بیرون کشیدن اطلاعات از پشت آهنگ .
# https://mrpython.blog.ir
from stepic import decode from PIL import Image from eyed3 import load from os import system
audio = input("audio : ") audio = load(audio) # Opening the audio file
img = open("temp_img.png", "wb") img.write(audio.tag.images[0].image_data) # Extract the Cover of audio file img.close()
img = Image.open("temp_img.png") text = decode(img) # Decode data from the extracted image system("del {}".format("temp_img.png")) print("Data : {}".format(text)) input()
توضیح سورس : خب تا اونجایی که فایل صوتی رو میپرسیم آدرسشو و باز میکنیم رو که در سورس قبل توضیح دادیم . پس از اینکه توسط تابع load فایل صوتی رو باز کردیم ، اومدیم یک فایل تصویری با فرمت PNG و با نام temp_img.png رو در مد WB (Write Binary) باز کردیم . قراره در اصل تصویری که از کاور فایل صوتی استخراج میکنیم داخل این فایل نوشته و ذخیره بشه . در خط بعد با استفاده از تابع write اومدیم محتویات باینری استخراج شده از کاور آهنگ رو داخل فایلی که باز کردیم (temp_img.png) نوشتیم . اگه دقت کنید خط زیر در اصل محتویات باینری کاور فایل صوتی رو بر میگردونه :
audio.tag.images[0].image_data
در خط بعد با استفاده از تابع close فایل تصویریمون رو ذخیره کردیم و بستیم .
تا اینجای کار ما کاور رو استخراج کردیم و در قالب یک فایل PNG ذخیره کردیم . حالا بریم اطلاعات پشت این عکس رو بکشیم بیرون .
با استفاده از تابع Image.open اومدیم فایل کاور عکس که استخراج کردیم رو باز کردیم و ریختیم داخل متغییر img . سپس در خط بعد با استفاده از تابع decode از کتابخونه ی stepic اطلاعات مخفی پشتش رو درآوردیم و ریختیم داخل متغییر text . تا اینجا اطلاعاتو کشیدیم بیرون . دیگه نیازی به فایل کاور نداریم . بنابراین در خط بعد اونو با استفاده از یک دستور cmd پاکش کردیم (البته اگه لینوکس دارید باید به جای دستور del از دستور rm استفاده کنید)
نهایتا هم اطلاعاتی که بیرون کشیدیم رو چاپ کردیم برای کاربر :))
خب بریم سمّی که ساختیمو تست کنیم :)
من یه فایل mp3 به نام music.mp3 دارم
یه فایل تصویر به نام picture.png دارم
همچنین میخوام متن i am here رو پشت آهنگ ذخیره کنم
پس اسکریپت encoder رو باز میکنم و این دو فایل رو بهش میدم :
خب همینطور که میبینید اروری نداد و تا اینجا اطلاعات پشت آهنگ مخفی شد .
حالا اسکریپت decoder رو باز میکنم و فایل آهنگ (music.mp3) رو بهش میدم :
yeahhhhh ! همینطور که میبینید اطلاعات رو کاملا صحیح کشید بیرون .
امیدوارم لذت برده باشید . سوالی بود مطرح کنید
یا حق !
Telegram Channel : @mrpythonblog