Python dan steganografi

Belum lama ini, pilot Hackathon untuk siswa diadakan di sekolah saya. Topik tugas terkait dengan keamanan informasi, termasuk enkripsi data.



Salah satu tugas yang paling berwarna adalah TASK-10: steganografi .
Kami memberikan definisi.
Steganografi adalah cara mentransmisikan atau menyimpan informasi, dengan mempertimbangkan kerahasiaan fakta transfer tersebut (penyimpanan).
Dengan kata lain, jika kriptografi menyembunyikan informasi itu sendiri, maka steganografi menyembunyikan fakta penularannya.



Sayangnya, tim dan saya tidak punya waktu untuk menyelesaikan tugas ini tepat waktu, dan saya memutuskan untuk menyelesaikannya setelah acara.

Solusi yang paling jelas pada waktu itu adalah:

  1. Konversi ciphertext ke set bit.
  2. Lakukan hal yang sama dengan gambar.
  3. Tempatkan teks di tempat acak pada gambar dan simpan sebagai gambar.

Ini adalah sedikit kode untuk mengonversi teks menjadi set bit dan sebaliknya.

def text_to_binary(event): return [int(format(ord(elem),'b')) for elem in event] def binary_to_text(event): return [chr(int(str(elem),2)) for elem in event] 

Namun, setelah memberi tahu kolega saya yang lebih berpengalaman tentang pemikiran saya, saya dikirim untuk mengajar materiil.
Anda harus mulai dengan fakta bahwa byte dari file gambar tidak dapat diedit secara langsung jika bukan bmp.

{% - encoder acak%}
Setelah membaca sedikit tentang model warna, saya memutuskan untuk meninggalkan dekomposisi gambar menjadi 1 dan 0 demi modifikasi piksel sendiri dalam palet RGB. Untuk manipulasi ini, saya memilih perpustakaan Pillow, di sini ada artikel bagus tentang itu.

Jadi kita punya gambar. Gambar memiliki piksel. Piksel dibentuk dari warna primer - merah, hijau, dan biru.

Setiap warna dikodekan dengan angka dari 0 hingga 255.



Dan kami juga memiliki karakter ASCII yang disandikan juga.

Mari kita coba mengenkripsi beberapa teks dalam gambar ini.

Gambar:




Sedikit teks:
C memudahkan Anda menembak diri sendiri di kaki; C ++ membuatnya lebih sulit, tetapi ketika Anda melakukannya, itu akan menghancurkan seluruh kaki Anda
Hubungkan perpustakaan yang diperlukan.

 from PIL import Image, ImageDraw from random import randint 

Kemudian kita mendeklarasikan suatu fungsi dan memasukkan semua objek yang kita butuhkan ke dalamnya.

 def stega_encrypt(): keys = [] img = Image.open(input("path to image: ")) draw = ImageDraw.Draw(img) width = img.size[0] height = img.size[1] pix = img.load() f = open('keys.txt','w') 

Lebih menarik. Tugas yang paling penting adalah menemukan cara untuk mengenkripsi pesan. Saya telah mengusulkan metode ini :

  1. Ambil karakter, terjemahkan ke nomor ASCII
  2. Buat tuple dengan koordinat acak
  3. Kami mengumpulkan warna hijau dan biru dari piksel di koordinat
  4. Ganti rona merah dengan nomor karakter ASCII

 for elem in ([ord(elem) for elem in input("text here: ")]): key = (randint(1,width-10),randint(1,height-10)) g, b = pix[key][1:3] draw.point(key, (elem,g , b)) f.write(str(key)+'\n') 

Kami menyimpan kunci dan gambar.

 print('keys were written to the keys.txt file') img.save("newimage.png", "PNG") f.close() 

kode

Kami mencoba menjalankan skrip.

Hasilnya, kami mendapatkan gambar yang sama, tetapi dalam format png dan dengan beberapa piksel yang berubah.



Sekarang tetap entah bagaimana menguraikan semuanya.

Kami sedang menulis skrip untuk dekripsi!

Kami menghubungkan semua yang dibutuhkan.

 from PIL import Image from re import findall 

Kami mendeklarasikan fungsi untuk dekripsi, serta beberapa objek.

 def stega_decrypt(): a = [] keys = [] img = Image.open(input("path to image: ")) pix = img.load() f = open(input('path to keys: '),'r') y = str([line.strip() for line in f]) 

Algoritma dekripsi dasar:

 for i in range(len(findall(r'\((\d+)\,',y))): keys.append((int(findall(r'\((\d+)\,',y)[i]),int(findall(r'\,\s(\d+)\)',y)[i]))) for key in keys: a.append(pix[tuple(key)][0]) return ''.join([chr(elem) for elem in a]) 

Ekspresi reguler ini diperlukan untuk membaca tupel dari file teks.

Tindakan terakhir adalah menampilkan pesan terenkripsi di layar.

 print("you message: ", stega_decrypt()) 

kode

Sekarang cobalah untuk mendapatkan pesan kami.



Sebagaimana diminta untuk membuktikan, semuanya bekerja!

Kerugian utama: visibilitas dead pixel dalam gambar dalam hal enkripsi sejumlah besar karakter. Namun, cacat ini diperbaiki dengan sempurna dengan resolusi tinggi.

Referensi:

Source: https://habr.com/ru/post/id413803/


All Articles