Steganography i le GIF

Faatomuaga

Fa'afeiloa'i.
E leʻi leva atu, a o ou aʻoga i le iunivesite, sa i ai se aʻoaʻoga i le aʻoaʻiga "Metotia polokalame o le saogalemu o faʻamatalaga." O le tofiga na manaʻomia ai matou e fai se polokalame e faʻapipiʻi ai se feʻau i faila GIF. Na ou filifili e fai i Java.

I lenei tusiga o le a ou faʻamatalaina nisi o manatu faʻapitoa, faʻapea foʻi ma le auala na faia ai lenei polokalama laʻititi.

Vaega fa'ata'ita'i

GIF fa'atulagaina

GIF (Graphics Interchange Format - o se faatulagaga mo le fesuiaiga o ata) o se faatulagaga mo le teuina o ata kalafi, e mafai ona teuina faʻamaumauga faʻapipiʻi e aunoa ma le leiloa o le lelei i se faatulagaga e oʻo atu i le 256 lanu. O lenei faatulagaga na atiaʻe i le 1987 (GIF87a) e CompuServe mo le faʻasalalauina o ata raster i luga o fesoʻotaʻiga. I le 1989, na suia le faatulagaga (GIF89a), lagolago mo le manino ma le animation na faaopoopo.

O faila GIF e iai se fausaga poloka. O nei poloka e iai lava le umi tumau (pe faʻalagolago i nisi o fuʻa), o lea e toetoe lava a le mafai ona faia se mea sese e uiga i le mea o loʻo i ai poloka taʻitasi. Le faʻatulagaina o le ata GIF e le faʻafiafiaina sili ona faigofie ile GIF89a format:

Steganography i le GIF

Mai poloka uma o le fausaga, i lenei tulaga o le a tatou fiafia i le poloka poloka o le lalolagi ma mea e nafa ma le paleti:

  • CT - i ai o se paleti lalolagi. Afai e setiina lenei fu'a, e tatau ona amata vave le paleti lalolagi pe a uma le au lau mata.
  • Size — lapo'a paleti ma numera o lanu i le ata. Tau mo lenei parakalafa:

fua
Numera o lanu
Lapo'a paleti, paita

7
256
768

6
128
384

5
64
192

4
32
96

3
16
48

2
8
24

1
4
12

0
2
6

auala fa'ailoga

O auala nei o le a fa'aogaina e fa'ailoga ai fe'au i faila ata:

  • LSB (Least Significant Bit) metotia
  • auala fa'aopoopo paleti

LSB auala - o se auala masani o steganography. E aofia ai le suiina o pito pito sili ona taua i totonu o le koneteina (i la matou tulaga, o le palette bytes o le lalolagi) ma fasipepa o le savali natia.

O le polokalame o le a faʻaogaina pito mulimuli e lua i le lalolagi palette bytes o se vaega o lenei metotia. O lona uiga mo se ata 24-bit, lea o le lanu lanu e tolu paita mo le mumu, lanumoana, ma le lanumeamata, pe a uma ona faʻapipiʻi se feʻau i totonu, o vaega lanu taʻitasi o le a suia i le maualuga o le 3/255 gradations. O sea suiga, muamua, o le a le vaaia pe faigata ona matauina i le mata o le tagata, ma lona lua, o le a le mafai ona vaaia i luga o masini e maua ai faamatalaga maualalo.

Ole aofa'i ole fa'amatalaga ole a fa'alagolago sa'o ile tele ole ata ole ata. Talu ai o le maualuga maualuga o le paleti e 256 lanu, ma afai e lua fasi feʻau e tusia i totonu o vaega o lanu taʻitasi, o le maualuga o le umi o le feʻau (faʻatasi ai ma le pito sili ona maualuga i le ata) o le 192 bytes. O le taimi lava e faʻapipiʻi ai le feʻau i le ata, e le suia le tele o le faila.

Metotia faʻalautele paleti, lea e aoga mo le fausaga GIF. O le a sili ona aoga i ata ma se tamai paleti. O lona uiga e faʻateleina le tele o le paleti, ma maua ai avanoa faaopoopo mo le tusiaina o bytes talafeagai e sui ai le paita lanu. Afai tatou te manatu o le laʻititi laʻititi o le paleti e 2 lanu (6 paita), ona maualuga lea o le tele o le feʻau faʻapipiʻi e mafai ona 256 × 3-6 = 762 bytes. O le tulaga le lelei o le maualalo o le puipuiga o le cryptographic; e mafai ona faitau le feʻau faʻapipiʻi e faʻaaoga ai soʻo se tusitala tusitusiga pe afai e leʻi faia le feʻau i faʻamatalaga faaopoopo.

Vaega faʻatatau

Fuafuaga o polokalame

O mea faigaluega uma e manaʻomia mo le faʻaogaina o faʻamalamalamaga ma faʻauiga algorithms o le a aofia i totonu o le afifi com.tsarik.steganography. O lenei afifi e aofia ai le atinaʻe Encryptor ma metotia encrypt и decrypt, Vasega Binary, lea e maua ai le tomai e galue ai ma faʻasologa o mea, faʻapea foʻi ma vasega faʻapitoa UnableToEncryptException и UnableToDecryptException, lea e tatau ona faʻaaogaina i auala faʻaoga Encryptor i le tulaga o le fa'ailoga ma le fa'avasegaina o mea sese.

Autu polokalame afifi com.tsarik.programs.gifed o le a aofia ai se vasega polokalame faʻatautaia ma se auala faʻapitoa main, fa'atagaina oe e fa'atino le polokalame; se vasega e teu ai fa'asologa o polokalame; ma afifi ma isi vasega.

O le faʻatinoga o algorithms lava ia o le a tuʻuina atu i totonu o le afifi com.tsarik.programs.gifed.gif vasega GIFEncryptorByLSBMethod и GIFEncryptorByPaletteExtensionMethod. O nei vasega uma e lua o le a faʻatinoina le atinaʻe Encryptor.

Faʻavae i luga o le fausaga o le GIF format, e mafai ona e fatuina se algorithm lautele mo le faʻalauiloaina o se feʻau i totonu o le ata ata:

Steganography i le GIF

Ina ia iloa le i ai o se feʻau i se ata, e tatau ona faʻaopoopo se faʻasologa o vaega i le amataga o le savali, lea e faitau muamua e le decoder ma siaki le saʻo. Afai e le fetaui, ona manatu lea e leai se savali natia i le ata. O le isi e tatau ona e faʻamaonia le umi o le savali. Ona sosoo ai lea ma le anotusi o le savali lava ia.

Vasega ata o le talosaga atoa:

Steganography i le GIF

Fa'atinoina o le polokalame

O le faʻatinoga o le polokalame atoa e mafai ona vaevaeina i ni vaega se lua: faʻatinoga o faʻamatalaga faʻamatalaga ma auala faʻafefe Encryptor, i vasega GIFEncryptorByLSBMethod и GIFEncryptorByPaletteExtensionMethod, ma le faʻatinoina o le faʻaoga faʻaoga.

Mafaufau i le vasega GIFEncryptorByLSBMethod.

Steganography i le GIF

fanua firstLSBit и secondLSBit o lo'o i ai numera o bits o paita ta'itasi o le ata e tatau ona tu'u i ai le fe'au ma le mea e tatau ona faitau ai le fe'au. fanua checkSequence teu se fa'asologa o siaki siaki ina ia mautinoa le iloa o le fe'au fa'apipi'i. Metotia static getEncryptingFileParameters toe fa'afo'i fa'amaufa'ailoga o le faila fa'amaonia ma uiga o le fe'au e ono mafai.

Metotia algorithm encrypt taʻiala GIFEncryptorByLSBMethod:

Steganography i le GIF

Ma lona 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 ma le puna code o le metotia decrypt taʻiala GIFEncryptorByLSBMethod:

Steganography i le 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);
}

Fa'atinoga o le vasega GIFEncryptorByPaletteExtensionMethod o le a tutusa, naʻo le auala e teu ai / faitau faʻamatalaga e ese.

I le vasega MainFrame o loʻo faʻamatalaina auala afifi: encryptImage(Encryptor encryptor) и decryptImage(Encryptor encryptor), fa'agaioiina i'uga o metotia fa'aoga Encryptor ma fegalegaleai ma le tagata faʻaoga, o lona uiga o le tatalaina o se talanoaga filifiliga faila, faʻaalia savali sese, ma isi; faʻapea foʻi ma isi metotia: openImage(), fa'atagaina le tagata fa'aoga e filifili se ata, exit(), lea e alu ese mai le talosaga. O nei metotia e taʻua mai Actionmea fa'aitu fa'atatau. O lenei vasega o loʻo faʻaogaina foʻi metotia fesoasoani: createComponents() - faia o vaega fomu, loadImageFile(File f) — utaina se ata i se vaega faapitoa mai se faila. Fa'atinoga o le vasega GIFEncryptorByPaletteExtensionMethod tutusa ma le faatinoga o vasega GIFEncryptorByLSBMethod, o le eseesega tele o le auala e tusia ma faitau ai bytes savali mai le palette.

Fa'agaioiga polokalame

LBS auala

Sei faapea o loo i ai se ata faapenei:

Steganography i le GIF

I lenei ata, o le paleti e aofia ai lanu e 256 (e pei ona faʻasaoina e le vali). O lanu muamua e fa: paepae, uliuli, mumu, lanu meamata. O isi lanu e uliuli. Ole fa'asologa ole pa'u ole lalolagi ole a fa'apea:

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

Steganography i le GIF

O le taimi lava e faʻapipiʻi ai le feʻau, o le a suia fasipepa o loʻo vase lalo i fasipepa mai le feʻau. O le ata e maua e toetoe lava a leai se eseesega mai le ata muamua.

Uluai
Ata ma fe'au fa'apipi'i

Steganography i le GIF
Steganography i le GIF

Metotia faʻalautele paleti

A e tatalaina se ata o loʻo i ai se feʻau e faʻaaoga ai lenei metotia, o le a e vaʻai i le ata lea:

Steganography i le GIF

E manino lava o lenei metotia o le a le aoga mo gaioiga faʻatautaia atoa, ma e ono manaʻomia ai faʻamatalaga faaopoopo o le feʻau.

Fa'ailogaina/fa'alia i ata fa'aola e galue e pei lava o ata masani, ae e le motusia le fa'afiafiaga.

Punavai fa'aaogaina:

Faʻalogo:

puna: www.habr.com

Faaopoopo i ai se faamatalaga