Steganography ann an GIF saor an asgaidh

Ro-ràdh

Beannachdan.
Chan eil cho fada air ais, nuair a bha mi ag ionnsachadh aig an oilthigh, bha obair-cùrsa anns a’ chuspair “Modhan bathar-bog tèarainteachd fiosrachaidh.” Dh'fheumadh an sònrachadh dhuinn prògram a chruthachadh a chuireas teachdaireachd ann am faidhlichean GIF. Cho-dhùin mi a dhèanamh ann an Java.

San artaigil seo bheir mi cunntas air cuid de phuingean teòiridheach, a bharrachd air mar a chaidh am prògram beag seo a chruthachadh.

Pàirt teòiridheach

Dealbh GIF format

Tha GIF (Cruth Eadar-iomlaid Grafaigean - cruth airson ìomhaighean iomlaid) na chruth airson ìomhaighean grafaigeach a stòradh, comasach air dàta teann a stòradh gun a bhith a’ call càileachd ann an cruth suas ri 256 dathan. Chaidh an cruth seo a leasachadh ann an 1987 (GIF87a) le CompuServe airson ìomhaighean raster a chuir thairis air lìonraidhean. Ann an 1989, chaidh an cruth atharrachadh (GIF89a), chaidh taic airson follaiseachd agus beòthalachd a chur ris.

Tha structar bloc aig faidhlichean GIF. Bidh fad stèidhichte aig na blocaichean sin an-còmhnaidh (no bidh e an urra ri cuid de bhrataichean), agus mar sin tha e cha mhòr do-dhèanta mearachd a dhèanamh a thaobh far a bheil gach bloc. Structar an ìomhaigh GIF neo-bheòthail as sìmplidh ann an cruth GIF89a:

Steganography ann an GIF saor an asgaidh

A-mach às a h-uile bloc den structar, anns a 'chùis seo bidh ùidh againn anns a' bhloc palette cruinne agus na crìochan a tha an urra ris a 'phalet:

  • CT - làthaireachd paileas cruinne. Ma thèid a’ bhratach seo a shuidheachadh, feumaidh am paileas cruinne tòiseachadh sa bhad às deidh làimhseachadh sgrion loidsigeach.
  • Size - meud paile agus an àireamh de dhhathan san dealbh. Luachan airson a’ pharamadair seo:

meud
Àireamh de dhathan
Meud 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

Dòighean crioptachaidh

Thèid na dòighean a leanas a chleachdadh gus teachdaireachdan a chrioptachadh ann am faidhlichean ìomhaigh:

  • Dòigh LSB (Bìos as lugha).
  • Modh cur-ris Palette

Modh LSB - dòigh cumanta steganography. Tha e a’ toirt a-steach pìosan den teachdaireachd fhalaichte a chuir an àite nam pìosan cudromach mu dheireadh anns a’ ghobhar (anns a’ chùis againn, na bytes paileas cruinne).

Cleachdaidh am prògram an dà phìos mu dheireadh anns na bytes paileas cruinne mar phàirt den dòigh seo. Tha seo a’ ciallachadh, airson ìomhaigh 24-bit, far a bheil an dath paileas trì bytes airson dearg, gorm is uaine, às deidh teachdaireachd fhighe a-steach ann, atharraichidh gach pàirt dath le ìrean 3/255 aig a’ char as àirde. Bidh atharrachadh mar seo, an toiseach, do-fhaicsinneach no duilich a thoirt fa-near dha sùil an duine, agus san dàrna àite, cha bhith e ri fhaicinn air innealan toraidh fiosrachaidh de chàileachd ìosal.

Bidh an ìre fiosrachaidh gu dìreach an urra ri meud paileas ìomhaigh. Leis gur e 256 dathan am meud as motha den paileas, agus ma tha dà phìos teachdaireachd air an sgrìobhadh a-steach don phàirt de gach dath, is e an fhad teachdaireachd as àirde (leis a’ phalet as àirde san ìomhaigh) 192 bytes. Aon uair ‘s gu bheil an teachdaireachd freumhaichte san ìomhaigh, chan atharraich meud an fhaidhle.

Modh leudachadh palette, a tha ag obair a-mhàin airson structar GIF. Bidh e nas èifeachdaiche air ìomhaighean le paileas beag. Is e a bhrìgh gu bheil e a’ meudachadh meud a’ phaileid, agus mar sin a’ toirt seachad àite a bharrachd airson na bytes riatanach a sgrìobhadh an àite nam bytes dath. Ma tha sinn den bheachd gur e 2 dhath (6 bytes) an ìre as lugha den phalet, faodaidh meud an teachdaireachd freumhaichte a bhith 256 × 3–6 = 762 bytes. Is e an ana-cothrom tèarainteachd criptografach ìosal; faodar an teachdaireachd freumhaichte a leughadh le deasaiche teacsa sam bith mura h-eil an teachdaireachd air a dhol tro chrioptachadh a bharrachd.

Pàirt làimhseachail

Dealbhadh prògram

Bidh a h-uile inneal riatanach airson a bhith a’ buileachadh algoirmean crioptachaidh is dì-chrioptachaidh air a ghabhail a-steach sa phacaid com.tsarik.steganography. Tha am pasgan seo a’ toirt a-steach an eadar-aghaidh Encryptor le dòighean-obrach encrypt и decrypt, Clas Binary, a bheir seachad comas a bhith ag obair le beagan arrays, a bharrachd air clasaichean eisgeachd UnableToEncryptException и UnableToDecryptException, a bu chòir a chleachdadh ann an dòighean eadar-aghaidh Encryptor ann an cùis mhearachdan còdaidh is dì-chòdaidh fa leth.

Pacaid prìomh phrògram com.tsarik.programs.gifed bheir e a-steach clas prògram a ghabhas ruith le modh statach main, a 'toirt cothrom dhut am prògram a ruith; clas a tha a 'stòradh crìochan phrògraman; agus pacaidean le clasaichean eile.

Thèid buileachadh nan algorithms fhèin a thaisbeanadh sa phacaid com.tsarik.programs.gifed.gif clasaichean GIFEncryptorByLSBMethod и GIFEncryptorByPaletteExtensionMethod. Cuiridh an dà chlas sin an eadar-aghaidh an gnìomh Encryptor.

Stèidhichte air structar cruth GIF, faodaidh tu algairim coitcheann a chruthachadh airson teachdaireachd a thoirt a-steach don phalet ìomhaigh:

Steganography ann an GIF saor an asgaidh

Gus faighinn a-mach a bheil teachdaireachd ann an ìomhaigh, feumar sreath sònraichte de phìosan a chur ri toiseach na teachdaireachd, a leughas an decoder an toiseach agus a nì cinnteach gu bheil e ceart. Mura h-eil e co-ionnan, thathas den bheachd nach eil teachdaireachd falaichte san ìomhaigh. An uairsin feumaidh tu fad an teachdaireachd a shònrachadh. An uairsin teacsa na teachdaireachd fhèin.

Diagram clas den tagradh gu lèir:

Steganography ann an GIF saor an asgaidh

Cur an gnìomh a’ phrògram

Faodar buileachadh a’ phrògraim gu lèir a roinn ann an dà phàirt: buileachadh dòighean crioptachaidh agus dì-chrioptachaidh eadar-aghaidh Encryptor, ann an clasaichean GIFEncryptorByLSBMethod и GIFEncryptorByPaletteExtensionMethod, agus buileachadh an eadar-aghaidh cleachdaiche.

Beachdaich air a 'chlas GIFEncryptorByLSBMethod.

Steganography ann an GIF saor an asgaidh

achaidhean firstLSBit и secondLSBit cuir a-steach na h-àireamhan de phìosan de gach byte den ìomhaigh anns am bu chòir an teachdaireachd a chuir a-steach agus cò às a bu chòir an teachdaireachd a leughadh. Achadh checkSequence a’ stòradh sreath seicichean gus dèanamh cinnteach gun aithnichear an teachdaireachd freumhaichte. Modh statach getEncryptingFileParameters a 'tilleadh crìochan an fhaidhle ainmichte agus feartan an teachdaireachd a dh'fhaodadh a bhith ann.

Algorithm dòigh-obrach encrypt clas GIFEncryptorByLSBMethod:

Steganography ann an GIF saor an asgaidh

Agus an còd aige:

@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 agus còd tùs an dòigh decrypt clas GIFEncryptorByLSBMethod:

Steganography ann an GIF saor an asgaidh

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

Cur an gnìomh a 'chlas GIFEncryptorByPaletteExtensionMethod bidh e coltach, chan eil ach an dòigh air fiosrachadh a shàbhaladh / leughadh eadar-dhealaichte.

Anns a ’chlas MainFrame Tha dòighean clò-bhualaidh air am mìneachadh: encryptImage(Encryptor encryptor) и decryptImage(Encryptor encryptor), a 'giollachd toraidhean dòighean eadar-aghaidh Encryptor agus ag eadar-obrachadh leis an neach-cleachdaidh, i.e. fosgladh còmhradh taghadh faidhle, a’ sealltainn teachdaireachdan mearachd, msaa; a bharrachd air dòighean eile: openImage(), a’ leigeil leis an neach-cleachdaidh dealbh a thaghadh, exit(), a thig a-mach às an tagradh. Canar na dòighean sin bho Action'na nithean clàr-taice co-fhreagarrach. Tha an clas seo cuideachd a’ cur an gnìomh dòighean taice: createComponents() - cruthachadh co-phàirtean cruth, loadImageFile(File f) - a’ luchdachadh ìomhaigh gu pàirt sònraichte bho fhaidhle. Cur an gnìomh a 'chlas GIFEncryptorByPaletteExtensionMethod coltach ri buileachadh clas GIFEncryptorByLSBMethod, tha am prìomh eadar-dhealachadh anns an dòigh anns a bheil bytes teachdaireachd air an sgrìobhadh agus air an leughadh bhon phalet.

Obrachadh prògram

Modh LBS

Canaidh sinn gu bheil ìomhaigh mar seo ann:

Steganography ann an GIF saor an asgaidh

Anns an ìomhaigh seo, tha am paileas air a dhèanamh suas de 256 dathan (mar a shàbhalas Paint). Tha a 'chiad ceithir dathan: geal, dubh, dearg, uaine. Tha dathan eile dubh. Bidh an t-sreath bit palette cruinne mar a leanas:

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

Steganography ann an GIF saor an asgaidh

Aon uair ‘s gu bheil an teachdaireachd freumhaichte, thèid na pìosan bhon teachdaireachd a chuir an àite na pìosan le loidhne. Cha mhòr nach eil an ìomhaigh a thàinig às a chèile eadar-dhealaichte bhon fhear thùsail.

Original
Ìomhaigh le teachdaireachd freumhaichte

Steganography ann an GIF saor an asgaidh
Steganography ann an GIF saor an asgaidh

Modh leudachadh palette

Nuair a dh’ fhosglas tu ìomhaigh anns a bheil teachdaireachd a’ cleachdadh an dòigh seo, chì thu an dealbh a leanas:

Steganography ann an GIF saor an asgaidh

Tha e soilleir nach obraich an dòigh seo airson gnìomhan brathaidh làn-chuimseach, agus is dòcha gum feum e an teachdaireachd a chrioptachadh a bharrachd.

Bidh crioptachadh / dì-chrioptachadh ann an ìomhaighean beòthail ag obair dìreach mar ann an ìomhaighean statach cunbhalach, ach chan eil am beòthalachd briste.

Stòran air an cleachdadh:

Luchdaich sìos:

Source: www.habr.com

Cuir beachd ann