نوشتن اسکریپت مخفی کردن اطلاعات پشت آهنگ در پایتون :: Mr Python | مستر پایتون

نوشتن اسکریپت مخفی کردن اطلاعات پشت آهنگ در پایتون

  • ۱۵۲۰

نوشتن اسکریپت مخفی کردن اطلاعات پشت آهنگ در پایتون

 

درود به همه !

وقتی بحث پنهان نگاری اطلاعات (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

 

  • سلام اینجا متن ذخیره کردیم اگر بخوایم کد ذخیره بشه و بعد رو سیستم کاربر اجرا بشه باید چیکار کنیم ؟

    پاسخ:
    سلام .
    اینکه اون کد خودکار اجرا بشه ملزم اینه که مثلا خود برنامه ای که فایل mp3 رو باز میکنه آسیب پذیری داشته باشه تا با بهره گیری از اون کد پشت آهنگمون اجرا بشه . وگرنه خود به خود چیزی رو جایی اجرا نمیشه .
  • سلام خسته نباشید خدایی سایتتون عالیه

    یه سوال

    ما چطوری میتونیم یه فایل زیپ رو پشت عکس مخفی کنیم بعد اون عکس رو پشت اهنگ مخفی کنیم؟

    ممنون میشم راهنماییم کنید 

    پاسخ:
    درود بر شما . ممنونم خداروشکر که مفید هستند مطالب .

    ببینید این چیزی که میگم رو باید تست کنم چون ممکنه با کتابخونه ای که مورد نظرمه کار نده . شما فایل zip رو به صورت Read Binary یا همون مد rb با استفاده از دستور open باز کنید . سپس اطلاعات باینری فایل زیپ  رو با استفاده از تابع read بدست بیارید و اونا رو پشت عکس مخفی کنید و ادامه کار یعنی مخفی کردن پشت آهنگ رو طبق همین آموزشی که منتشر کردیم طی کنید . ممکنه این روش جواب بده ممکنم هست با ارور هایی رو به رو بشید چون امکان داره نتونه اطلاعات باینری رو به صورت کامل دیکود کنه . ولی به هر حال تست کردنش ضرر نداره . انشالله در پست های آینده بررسی ها انجام میشه و روشی مطمئن برای اینکار ارائه میشه :)
    موفق باشید :)
  • محمد حسین رحیمی

    شما اینجای پست گفتید ک میتونیم کاور اهنگ رو ذخیره کنیم:
    (اما اینها به چه درد ما میخوره ؟ ما اینجا فقط با یک Tag در فایل صوتی کار داریم اونم کاور آهنگ یا عکسی هستش که به عنوان کاور برای فایل صوتی ، داخلش ذخیره میشه . ما با استفاده از یک اسکریپت پایتون میتونیم هر عکسی رو به عنوان کاور فایل صوتی داخلش ذخیره کنیم . """همچنین میشه کاور یک فایل صوتی رو به صورت یک فایل عکس ، از فایل صوتی استخراج کرد و ذخیره کرد""")

    میخاستم ببینم با این کتابحونه میشه این کار رو کرد؟ و اگه میشه لطفا دستورش رو بگید
    ممنون

    پاسخ:
    سلام مجدد .
    بابت تاخیر پوزش :)
    آهان متوجه شدم چی میگید میخواید کاور آهنگ رو در قالب فایل تصویری ذخیره کنید . ببینید خود همون سورس بازگشایی اطلاعات که در پست نوشتیم اینکارو انجام میده فقط یه جایی از سورس هست با تابع system میایم عکسی که ذخیره کردیم رو پاک میکنیم . شما این خط دستور رو کامنت کنید تا اون کاور که ذخیره میکنه پاک نشه .
  • محمد حسین رحیمی

    با سلام. چجوری میتونم کاور پست رو باز کنم و ذخیرش کنم؟

    پاسخ:
    سلام
    منظورتون رو از کاور پست متوجه نمیشم !
  • بسیار جالب و حرفه ای

    پاسخ:
    درود .
    ممنونم :)
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی