Steganography sa GIF

Pasiuna

Mga pangomosta.
Dili pa lang dugay, sa dihang nagtuon ko sa unibersidad, adunay usa ka kurso sa disiplina nga "Software nga mga pamaagi sa seguridad sa impormasyon." Ang buluhaton nagkinahanglan kanamo sa paghimo og programa nga nag-embed sa usa ka mensahe sa GIF file. Nakahukom ko nga buhaton kini sa Java.

Niini nga artikulo akong ihulagway ang pipila ka teoretikal nga mga punto, ingon man kung giunsa kini nga gamay nga programa gibuhat.

Ang teoretikal nga bahin

GIF nga format

Ang GIF (Graphics Interchange Format - usa ka format alang sa pagbayloay og mga hulagway) kay usa ka pormat para sa pagtipig og mga graphic nga mga hulagway, nga makahimo sa pagtipig sa compressed data nga walay pagkawala sa kalidad sa format nga hangtod sa 256 ka kolor. Kini nga format gimugna niadtong 1987 (GIF87a) sa CompuServe alang sa pagpasa sa raster nga mga hulagway sa mga network. Sa 1989, ang format giusab (GIF89a), suporta alang sa transparency ug animation gidugang.

Ang mga file sa GIF adunay block structure. Kini nga mga bloke kanunay adunay usa ka piho nga gitas-on (o kini nagdepende sa pipila nga mga bandila), mao nga hapit imposible nga masayop kung diin nahimutang ang matag bloke. Ang istruktura sa pinakasimple nga non-animated GIF nga imahe sa GIF89a format:

Steganography sa GIF

Sa tanan nga mga bloke sa istruktura, sa kini nga kaso kita interesado sa global palette block ug ang mga parameter nga responsable sa palette:

  • CT - presensya sa usa ka global palette. Kung kini nga bandila gibutang, ang global palette kinahanglan magsugod dayon pagkahuman sa lohikal nga gunitanan sa screen.
  • Size β€” gidak-on sa palette ug gidaghanon sa mga kolor sa hulagway. Mga kantidad alang niini nga parameter:

Size
Gidaghanon sa mga kolor
Gidak-on sa palette, bytes

7
256
768

6
128
384

5
64
192

4
32
96

3
16
48

2
8
24

1
4
12

0
2
6

Mga pamaagi sa pag-encrypt

Ang mosunod nga mga pamaagi gamiton sa pag-encrypt sa mga mensahe sa mga file sa imahe:

  • LSB (Least Significant Bit) nga pamaagi
  • Pamaagi sa pagdugang sa palette

LSB nga pamaagi - usa ka komon nga pamaagi sa steganography. Naglangkob kini sa pag-ilis sa katapusang mahinungdanong mga tipik sa sudlanan (sa among kaso, ang global palette bytes) sa mga tipik sa tinago nga mensahe.

Ang programa mogamit sa katapusang duha ka mga bit sa global palette bytes isip kabahin niini nga pamaagi. Kini nagpasabot nga alang sa usa ka 24-bit nga hulagway, diin ang kolor sa palette tulo ka byte alang sa pula, asul, ug berde, human sa pag-embed sa usa ka mensahe ngadto niini, ang matag kolor nga component mausab sa maximum nga 3/255 gradations. Ang ingon nga pagbag-o, una, dili makita o lisud nga mamatikdan sa mata sa tawo, ug ikaduha, dili kini makita sa ubos nga kalidad nga mga aparato nga output sa impormasyon.

Ang gidaghanon sa impormasyon direktang magdepende sa gidak-on sa paleta sa hulagway. Tungod kay ang pinakataas nga gidak-on sa palette kay 256 ka kolor, ug kung duha ka message bit ang isulat sa component sa matag kolor, nan ang maximum message length (uban ang maximum palette sa hulagway) kay 192 bytes. Sa higayon nga ang mensahe na-embed sa imahe, ang gidak-on sa file dili mausab.

Pamaagi sa pagpalapad sa palette, nga magamit lamang alang sa istruktura sa GIF. Kini mahimong labing epektibo sa mga imahe nga adunay gamay nga palette. Ang esensya niini mao nga kini nagdugang sa gidak-on sa palette, sa ingon naghatag dugang nga luna alang sa pagsulat sa gikinahanglan nga mga byte puli sa mga color byte. Kung atong isipon nga ang minimum nga gidak-on sa palette kay 2 ka kolor (6 bytes), nan ang maximum nga gidak-on sa embedded nga mensahe mahimong 256 Γ— 3–6 = 762 bytes. Ang disbentaha mao ang ubos nga cryptographic nga seguridad; ang naka-embed nga mensahe mahimong basahon gamit ang bisan unsang text editor kung ang mensahe wala gipailalom sa dugang nga pag-encrypt.

Praktikal nga bahin

Disenyo sa programa

Ang tanan nga gikinahanglan nga mga himan alang sa pagpatuman sa encryption ug decryption algorithm iapil sa package com.tsarik.steganography. Kini nga pakete naglakip sa interface Encryptor uban sa mga pamaagi encrypt ΠΈ decrypt, Klase Binary, nga naghatag sa abilidad sa pagtrabaho uban sa mga bit arrays, ingon man usab sa mga klase sa eksepsiyon UnableToEncryptException ΠΈ UnableToDecryptException, nga kinahanglan gamiton sa mga pamaagi sa interface Encryptor sa kaso sa pag-encode ug pag-decode sa mga sayop matag usa.

Panguna nga pakete sa programa com.tsarik.programs.gifed maglakip sa usa ka runnable nga klase sa programa nga adunay static nga pamaagi main, nagtugot kanimo sa pagpadagan sa programa; usa ka klase nga nagtipig sa mga parameter sa programa; ug mga pakete sa ubang mga klase.

Ang pagpatuman sa mga algorithm mismo ipresentar sa package com.tsarik.programs.gifed.gif mga klase GIFEncryptorByLSBMethod ΠΈ GIFEncryptorByPaletteExtensionMethod. Ang duha niini nga mga klase magpatuman sa interface Encryptor.

Pinasukad sa istruktura sa format sa GIF, mahimo ka maghimo usa ka kinatibuk-ang algorithm alang sa pagpaila sa usa ka mensahe sa paleta sa imahe:

Steganography sa GIF

Aron mahibal-an ang presensya sa usa ka mensahe sa usa ka imahe, kinahanglan nga idugang ang usa ka piho nga han-ay sa mga tipik sa sinugdanan sa mensahe, nga gibasa una sa decoder ug gisusi ang katukma. Kung dili kini magkatugma, nan giisip nga wala’y tinago nga mensahe sa imahe. Sunod kinahanglan nimo nga itakda ang gitas-on sa mensahe. Unya ang text sa mensahe mismo.

Klase diagram sa tibuok aplikasyon:

Steganography sa GIF

Pagpatuman sa programa

Ang pagpatuman sa tibuok nga programa mahimong bahinon sa duha ka bahin: pagpatuman sa interface encryption ug decryption nga mga pamaagi Encryptor, sa mga klase GIFEncryptorByLSBMethod ΠΈ GIFEncryptorByPaletteExtensionMethod, ug ang pagpatuman sa user interface.

Hunahunaa ang klase GIFEncryptorByLSBMethod.

Steganography sa GIF

kaumahan firstLSBit ΠΈ secondLSBit naglangkob sa mga numero sa mga tipik sa matag byte sa imahe diin ang mensahe kinahanglan nga ipasulod ug gikan diin ang mensahe kinahanglan basahon. Natad checkSequence nagtipig og check bit sequence aron masiguro ang pag-ila sa naka-embed nga mensahe. Static nga pamaagi getEncryptingFileParameters ibalik ang mga parameter sa gipiho nga file ug ang mga kinaiya sa potensyal nga mensahe.

Algoritmo sa pamaagi encrypt grade GIFEncryptorByLSBMethod:

Steganography sa GIF

Ug ang iyang code:

@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 ug source code sa pamaagi decrypt grade GIFEncryptorByLSBMethod:

Steganography sa GIF

@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);
}

Implementasyon sa klase GIFEncryptorByPaletteExtensionMethod magkaparehas, lahi ra ang paagi sa pagtipig/pagbasa sa impormasyon.

Sa klase MainFrame Ang mga pamaagi sa pagputos gihulagway: encryptImage(Encryptor encryptor) ΠΈ decryptImage(Encryptor encryptor), pagproseso sa mga resulta sa mga pamaagi sa interface Encryptor ug pagpakig-uban sa user, i.e. pag-abli sa usa ka file selection dialog, pagpakita sa mga mensahe sa sayop, ug uban pa; ingon man usab sa ubang mga pamaagi: openImage(), nagtugot sa tiggamit sa pagpili og usa ka hulagway, exit(), nga mogawas sa aplikasyon. Kini nga mga pamaagi gitawag gikan sa Actionang katugbang nga mga butang sa menu. Kini nga klase dugang nga nagpatuman sa mga pamaagi sa auxiliary: createComponents() - paghimo sa mga sangkap sa porma, loadImageFile(File f) β€” pagkarga sa usa ka imahe sa usa ka espesyal nga sangkap gikan sa usa ka file. Implementasyon sa klase GIFEncryptorByPaletteExtensionMethod susama sa pagpatuman sa klase GIFEncryptorByLSBMethod, ang panguna nga kalainan mao ang paagi sa pagsulat ug pagbasa sa mga byte sa mensahe gikan sa palette.

Operasyon sa programa

LBS nga pamaagi

Ingnon ta nga adunay usa ka imahe nga sama niini:

Steganography sa GIF

Niini nga hulagway, ang palette naglangkob sa 256 ka mga kolor (sama sa Paint save). Ang unang upat ka mga kolor mao ang: puti, itom, pula, berde. Ang ubang mga kolor itom. Ang global palette bit sequence mao ang mosunod:

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

Steganography sa GIF

Sa higayon nga ma-embed na ang mensahe, ang mga gilinya nga mga piraso pulihan sa mga piraso gikan sa mensahe. Ang resulta nga hulagway halos walay kalainan sa orihinal.

Orihinal
Imahe nga adunay naka-embed nga mensahe

Steganography sa GIF
Steganography sa GIF

Pamaagi sa pagpalapad sa palette

Kung ablihan nimo ang usa ka imahe nga adunay sulud nga mensahe gamit kini nga pamaagi, imong makita ang mosunod nga litrato:

Steganography sa GIF

Klaro nga kini nga pamaagi dili molihok alang sa hingpit nga mga kalihokan sa espiya, ug mahimong magkinahanglan dugang nga pag-encrypt sa mensahe.

Ang pag-encrypt/pag-decryption sa mga animated nga mga hulagway naglihok sama sa regular nga static nga mga hulagway, apan ang animation wala maguba.

Mga tinubdan nga gigamit:

Pag-download:

Source: www.habr.com

Idugang sa usa ka comment