Steganography muGIF

Nhanganyaya

Kwaziwai.
Nguva pfupi yapfuura, pandakanga ndichidzidza kuyunivhesiti, pakanga paine kosi yekuranga "Software nzira dzekuchengetedza ruzivo." Basa racho raida kuti tigadzire chirongwa chinomisikidza meseji mumafaira eGIF. Ndakasarudza kuzviita muJava.

Muchikamu chino ini ndichatsanangura mamwe mapoinzi edzidziso, pamwe nekuti chirongwa chidiki ichi chakagadzirwa sei.

Theoretical chikamu

GIF format

GIF (Graphics Interchange Format - chimiro chekuchinjana mifananidzo) chimiro chekuchengetedza mifananidzo yemifananidzo, inokwanisa kuchengetedza data yakamanikidzwa pasina kurasikirwa kwemhando mufomati inosvika mazana maviri nemakumi mashanu nenhanhatu mavara. Iyi fomati yakagadziridzwa muna 256 (GIF1987a) neCompuServe yekufambisa mifananidzo ine raster pamusoro pemanetiweki. Muna 87, iyo fomati yakagadziridzwa (GIF1989a), tsigiro yekujeka uye mifananidzo yakawedzerwa.

GIF mafaira ane block structure. Aya mabhuroki anogara aine hurefu hwakatarwa (kana zvinoenderana nemamwe mireza), saka hazvigoneke kuita chikanganiso pamusoro penzvimbo yega yega. Chimiro cheiyo yakapfava isina-animated GIF mufananidzo muGIF89a fomati:

Steganography muGIF

Pakati pemabhuraki ese echimiro, mune ino kesi isu tichave tichifarira iyo yepasi rose palette block uye maparamita ane basa repalette:

  • CT - kuvapo kwepalette yepasi rose. Kana mureza uyu wakasetwa, pasi rose palette inofanira kutanga pakarepo mushure memubato une musoro wescreen.
  • Size - saizi yepalette uye nhamba yemavara ari pamufananidzo. Kukosha kweiyi parameter:

zera
Nhamba yemavara
Saizi yePalette, mabheti

7
256
768

6
128
384

5
64
192

4
32
96

3
16
48

2
8
24

1
4
12

0
2
6

Encryption nzira

Nzira dzinotevera dzichashandiswa encrypt meseji mumafaira emufananidzo:

  • LSB (Zvishoma Zvishoma Zvishoma) nzira
  • Palette yekuwedzera nzira

LSB nzira - nzira yakajairika ye steganography. Inosanganisira kutsiva ekupedzisira akakosha mabhiti mumudziyo (munyaya yedu, iyo pasi rose palette bytes) nemabits emeseji yakavanzika.

Chirongwa chichashandisa mabhiti maviri ekupedzisira mupasi rose palette bytes sechikamu cheiyi nzira. Izvi zvinoreva kuti pamufananidzo we24-bit, apo pendi yeruvara ine mabhayiti matatu kune tsvuku, yebhuruu, uye yegirini, mushure mekuisa meseji mairi, chikamu chega chega chemavara chinoshanduka nekupfuura 3/255 gradations. Shanduko yakadaro, yekutanga, ichave isingaonekwe kana yakaoma kuona kune ziso remunhu, uye chechipiri, haizoonekwe pane yakaderera-yemhando yekuburitsa ruzivo michina.

Huwandu hwemashoko huchaenderana zvakananga nehukuru hwechifananidzo palette. Sezvo hukuru hukuru hwepalette huri 256 mavara, uye kana maviri mabhiti emashoko akanyorwa muchikamu chemavara ega ega, ipapo iyo yakareba meseji kureba (neiyo yakawanda palette mumufananidzo) ndeye 192 bytes. Kana iyo meseji yaiswa mumufananidzo, saizi yefaira haichinji.

Palette yekuwedzera nzira, iyo inongoshanda kune iyo GIF chimiro. Ichanyanya kushanda pamifananidzo ine palette diki. Chimiro chayo ndechekuti inowedzera saizi yepalette, nekudaro ichipa imwe nzvimbo yekunyora mabheti anodiwa panzvimbo yemavara mabheti. Kana tikafunga kuti huwandu hushoma hwepalette ndeye 2 mavara (6 bytes), saka hukuru hwemashoko akaiswa mukati hunogona kuva 256 Γ— 3-6 = 762 bytes. Izvo zvisingabatsiri ndeye yakaderera cryptographic chengetedzo; iyo yakamisikidzwa meseji inogona kuverengerwa uchishandisa chero mameseji edhita kana meseji isati yaiswa kune imwe encryption.

Chikamu chinoshanda

Chirongwa chekugadzira

Ese maturusi anodiwa ekushandisa encryption uye decryption algorithms anozoverengerwa mupakeji com.tsarik.steganography. Iyi pasuru inosanganisira iyo interface Encryptor nenzira encrypt ΠΈ decrypt, Kirasi Binary, iyo inopa kukwanisa kushanda ne bit arrays, pamwe chete nemakirasi akasiyana UnableToEncryptException ΠΈ UnableToDecryptException, iyo inofanirwa kushandiswa mumashandisirwo maitiro Encryptor mune encoding uye decoding zvikanganiso zvakateerana.

Main program package com.tsarik.programs.gifed ichasanganisira runnable chirongwa kirasi ine static nzira main, kukubvumira kuti uite purogiramu; kirasi inochengeta zvirongwa zvepurogiramu; uye mapakeji nemamwe makirasi.

Kuitwa kwealgorithms pachayo kuchaunzwa mupakeji com.tsarik.programs.gifed.gif zvidzidzo GIFEncryptorByLSBMethod ΠΈ GIFEncryptorByPaletteExtensionMethod. Ose maviri makirasi aya anozoshandisa iyo interface Encryptor.

Zvichienderana nechimiro cheiyo GIF fomati, unogona kugadzira yakajairika algorithm yekuunza meseji mumufananidzo palette:

Steganography muGIF

Kuti uone kuvepo kwemeseji mumufananidzo, zvinodikanwa kuwedzera imwe nhevedzano yebhiti pakutanga kwemeseji, iyo iyo decoder inotanga kuverenga uye kuongorora kuti ndeyechokwadi. Kana isingaenderane, zvino inofungidzirwa kuti hapana meseji yakavanzika mumufananidzo. Next unofanira kutsanangura kureba meseji. Ipapo rugwaro rwemeseji pachayo.

Kirasi dhizaini yechishandiso chose:

Steganography muGIF

Kuitwa kwepurogiramu

Kuitwa kwechirongwa chese kunogona kukamurwa kuita zvikamu zviviri: kuitisa interface encryption uye decryption nzira Encryptor, mumakirasi GIFEncryptorByLSBMethod ΠΈ GIFEncryptorByPaletteExtensionMethod, uye kuitwa kweiyo mushandisi interface.

Funga nezvekirasi GIFEncryptorByLSBMethod.

Steganography muGIF

minda firstLSBit ΠΈ secondLSBit ine nhamba dzebhiti dzebhaiti yega yega yemufananidzo umo meseji inofanira kupinzwa uye kubva panofanira kuverengerwa meseji. Munda checkSequence inochengeta cheki bit sequence kuti ive nechokwadi chekuzivikanwa kwemeseji yakamisikidzwa. Static nzira getEncryptingFileParameters inodzorera maparamendi efaira rakatarwa uye hunhu hweiyo inogona meseji.

Nzira algorithm encrypt kirasi GIFEncryptorByLSBMethod:

Steganography muGIF

Uye kodhi yake:

@Override
public void encrypt(File in, File out, String text) throws UnableToEncodeException, NullPointerException, IOException {
	if (in == null) {
		throw new NullPointerException("Input file is null");
	}
	if (out == null) {
		throw new NullPointerException("Output file is null");
	}
	if (text == null) {
		throw new NullPointerException("Text is null");
	}
	
	// read bytes from input file
	byte[] bytes = new byte[(int)in.length()];
	InputStream is = new FileInputStream(in);
	is.read(bytes);
	is.close();
	
	// check format
	if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
		throw new UnableToEncodeException("Input file has wrong GIF format");
	}
	
	// read palette size property from first three bits in the 10-th byte from the file
	byte[] b10 = Binary.toBitArray(bytes[10]);
	byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
	
	// calculate color count and possible message length
	int bOrigColorCount = (int)Math.pow(2, bsize+1);
	int possibleMessageLength = bOrigColorCount*3/4;
	int possibleTextLength = possibleMessageLength-2;// one byte for check and one byte for message length
	
	if (possibleTextLength < text.length()) {
		throw new UnableToEncodeException("Text is too big");
	}
	
	int n = 13;
	
	// write check sequence
	for (int i = 0; i < checkSequence.length/2; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		ba[firstLSBit] = checkSequence[2*i];
		ba[secondLSBit] = checkSequence[2*i+1];
		bytes[n] = Binary.toByte(ba);
		n++;
	}
	
	// write text length
	byte[] cl = Binary.toBitArray((byte)text.length());
	for (int i = 0; i < cl.length/2; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		ba[firstLSBit] = cl[2*i];
		ba[secondLSBit] = cl[2*i+1];
		bytes[n] = Binary.toByte(ba);
		n++;
	}
	
	// write message
	byte[] textBytes = text.getBytes();
	for (int i = 0; i < textBytes.length; i++) {
		byte[] c = Binary.toBitArray(textBytes[i]);
		for (int ci = 0; ci < c.length/2; ci++) {
			byte[] ba = Binary.toBitArray(bytes[n]);
			ba[firstLSBit] = c[2*ci];
			ba[secondLSBit] = c[2*ci+1];
			bytes[n] = Binary.toByte(ba);
			n++;
		}
	}
	
	// write output file
	OutputStream os = new FileOutputStream(out);
	os.write(bytes);
	os.close();
}

Algorithm uye sosi kodhi yenzira decrypt kirasi GIFEncryptorByLSBMethod:

Steganography muGIF

@Override
public String decrypt(File in) throws UnableToDecodeException, NullPointerException, IOException {
	if (in == null) {
		throw new NullPointerException("Input file is null");
	}
	
	// read bytes from input file
	byte[] bytes = new byte[(int)in.length()];
	InputStream is = new FileInputStream(in);
	is.read(bytes);
	is.close();
	
	// check format
	if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
		throw new UnableToDecodeException("Input file has wrong GIF format");
	}
	
	// read palette size property from first three bits in the 10-th byte from the file
	byte[] b10 = Binary.toBitArray(bytes[10]);
	byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
	
	// calculate color count and possible message length
	int bOrigColorCount = (int)Math.pow(2, bsize+1);
	int possibleMessageLength = bOrigColorCount*3/4;
	int possibleTextLength = possibleMessageLength-2;	// one byte for check and one byte for message length
	
	int n = 13;
	
	// read check sequence
	byte[] csBits = new byte[checkSequence.length];
	for (int i = 0; i < 4; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		csBits[2*i] = ba[firstLSBit];
		csBits[2*i+1] = ba[secondLSBit];
		n++;
	}
	byte cs = Binary.toByte(csBits);
	
	if (cs != Binary.toByte(checkSequence)) {
		throw new UnableToDecodeException("There is no encrypted message in the image (Check sequence is incorrect)");
	}
	
	// read text length
	byte[] cl = new byte[8];
	for (int i = 0; i < 4; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		cl[2*i] = ba[firstLSBit];
		cl[2*i+1] = ba[secondLSBit];
		n++;
	}
	byte textLength = Binary.toByte(cl);
	
	if (textLength < 0) {
		throw new UnableToDecodeException("Decoded text length is less than 0");
	}
	if (possibleTextLength < textLength) {
		throw new UnableToDecodeException("There is no messages (Decoded message length (" + textLength + ") is less than Possible message length (" + possibleTextLength + "))");
	}
	
	// read text bits and make text bytes
	byte[] bt = new byte[textLength];
	for (int i = 0; i < bt.length; i++) {
		byte[] bc = new byte[8];
		for (int bci = 0; bci < bc.length/2; bci++) {
			byte[] ba = Binary.toBitArray(bytes[n]);
			bc[2*bci] = ba[firstLSBit];
			bc[2*bci+1] = ba[secondLSBit];
			n++;
		}
		bt[i] = Binary.toByte(bc);
	}
	
	return new String(bt);
}

Kuitwa kwekirasi GIFEncryptorByPaletteExtensionMethod ichave yakafanana, nzira chete yekuchengetedza / kuverenga ruzivo ndiyo yakasiyana.

Mukirasi MainFrame nzira dzekuputira dzinotsanangurwa: encryptImage(Encryptor encryptor) ΠΈ decryptImage(Encryptor encryptor), kugadzirisa mhedzisiro yeinterface nzira Encryptor uye kushamwaridzana nemushandisi, kureva kuvhura dialog yekusarudza faira, kuratidza mameseji ekukanganisa, nezvimwewo; pamwe nedzimwe nzira: openImage(), kubvumira mushandisi kusarudza mufananidzo, exit(), iyo inobuda pachikumbiro. Nzira idzi dzinodanwa kubva Action's zvinoenderana menyu zvinhu. Iyi kirasi inoshandisawo nzira dzekubatsira: createComponents() - kusikwa kwezvikamu zvefomu, loadImageFile(File f) - kurodha chifananidzo muchikamu chakakosha kubva mufaira. Kuitwa kwekirasi GIFEncryptorByPaletteExtensionMethod zvakafanana nekushandiswa kwekirasi GIFEncryptorByLSBMethod, musiyano mukuru uri munzira manyorerwo emeseji mabhayiti uye anoverengwa kubva papalette.

Chirongwa chekushanda

LBS nzira

Ngatitii pane mufananidzo wakadai:

Steganography muGIF

Mumufananidzo uyu, palette ine 256 mavara (sePaint inochengetedza). Mavara mana ekutanga ndeaya: chena, dema, tsvuku, girini. Mamwe mavara matema. Iyo yepasi rose palette bit sequence ichave seizvi:

11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...

Steganography muGIF

Kana meseji yaiswa, mabhiti akaiswa mutsetse anotsiviwa nemabits kubva mumeseji. Mufananidzo unoguma unenge usina kusiyana nepakutanga.

Chekutanga
Mufananidzo une meseji yakamisikidzwa

Steganography muGIF
Steganography muGIF

Palette yekuwedzera nzira

Paunovhura mufananidzo une meseji uchishandisa nzira iyi, uchaona mufananidzo unotevera:

Steganography muGIF

Zviripachena kuti nzira iyi haishande kune yakazara-yakazara espionage zviitiko, uye ingangoda kuwedzera encryption yemeseji.

Encryption/decryption mumifananidzo ine animated inoshanda sezvakangoita mumifananidzo yakamira, asi iwo animation haina kuputswa.

Nzvimbo dzakashandiswa:

Dhawunorodha:

Source: www.habr.com

Voeg