Steganografija fil-GIF

Introduzzjoni

Awguri.
Ftit ilu, meta kont qed nistudja fl-università, kien hemm korsijiet fid-dixxiplina “Metodi tas-softwer tas-sigurtà tal-informazzjoni.” L-inkarigu kien jeħtieġ li noħolqu programm li jinkorpora messaġġ fil-fajls GIF. Iddeċidejt li nagħmilha f'Java.

F'dan l-artikolu ser niddeskrivi xi punti teoretiċi, kif ukoll kif inħoloq dan il-programm żgħir.

Parti teoretika

Format GIF

GIF (Graphics Interchange Format - format għall-iskambju ta' immaġini) huwa format għall-ħażna ta' immaġini grafiċi, li kapaċi jaħżen data kkompressata mingħajr telf ta' kwalità f'format sa 256 kulur. Dan il-format ġie żviluppat fl-1987 (GIF87a) minn CompuServe għat-trażmissjoni ta' immaġini raster fuq netwerks. Fl-1989, il-format ġie modifikat (GIF89a), ġie miżjud appoġġ għat-trasparenza u l-animazzjoni.

Il-fajls GIF għandhom struttura ta 'blokk. Dawn il-blokki dejjem għandhom tul fiss (jew jiddependi fuq xi bnadar), għalhekk huwa kważi impossibbli li jsir żball dwar fejn tinsab kull blokka. L-istruttura tal-aktar immaġni GIF sempliċi mhux animata fil-format GIF89a:

Steganografija fil-GIF

Mill-blokki kollha tal-istruttura, f'dan il-każ se nkunu interessati fil-blokk tal-paletta globali u l-parametri responsabbli għall-paletta:

  • CT — preżenza ta' paletta globali. Jekk din il-bandiera tkun issettjata, il-paletta globali trid tibda immedjatament wara l-manku tal-iskrin loġiku.
  • Size — daqs tal-paletta u numru ta' kuluri fl-istampa. Valuri għal dan il-parametru:

daqs
Numru ta 'kuluri
Daqs tal-paletta, 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

Metodi ta' kriptaġġ

Il-metodi li ġejjin se jintużaw biex jikkriptaw messaġġi fil-fajls tal-immaġni:

  • Metodu LSB (Least Sinifikanti Bit).
  • Metodu ta 'żieda tal-paletta

Metodu LSB - metodu komuni ta' steganografija. Tikkonsisti fis-sostituzzjoni tal-aħħar bits sinifikanti fil-kontenitur (fil-każ tagħna, il-bytes tal-paletta globali) bil-bits tal-messaġġ moħbi.

Il-programm se juża l-aħħar żewġ bits fil-bytes tal-paletta globali bħala parti minn dan il-metodu. Dan ifisser li għal immaġni ta '24-bit, fejn il-paletta tal-kulur hija ta' tliet bytes għall-aħmar, blu u aħdar, wara li daħħal messaġġ fiha, kull komponent tal-kulur jinbidel b'massimu ta '3/255 gradazzjoni. Bidla bħal din, l-ewwelnett, tkun inviżibbli jew diffiċli biex tinnota lill-għajn tal-bniedem, u t-tieni, mhux se tkun viżibbli fuq apparati ta 'produzzjoni ta' informazzjoni ta 'kwalità baxxa.

L-ammont ta 'informazzjoni jiddependi direttament fuq id-daqs tal-paletta tal-immaġni. Peress li d-daqs massimu tal-paletta huwa 256 kulur, u jekk żewġ bits tal-messaġġ jinkitbu fil-komponent ta 'kull kulur, allura t-tul massimu tal-messaġġ (bil-paletta massima fl-immaġini) huwa 192 bytes. Ladarba l-messaġġ ikun inkorporat fl-immaġni, id-daqs tal-fajl ma jinbidelx.

Metodu ta 'espansjoni tal-paletta, li jaħdem biss għall-istruttura GIF. Ikun l-aktar effettiv fuq immaġini b'paletta żgħira. L-essenza tagħha hija li żżid id-daqs tal-paletta, u b'hekk tipprovdi spazju addizzjonali għall-kitba tal-bytes meħtieġa minflok il-bytes tal-kulur. Jekk inqisu li d-daqs minimu tal-paletta huwa 2 kuluri (6 bytes), allura d-daqs massimu tal-messaġġ inkorporat jista 'jkun 256 × 3–6 = 762 bytes. L-iżvantaġġ huwa sigurtà kriptografika baxxa; il-messaġġ inkorporat jista 'jinqara bl-użu ta' kwalunkwe editur tat-test jekk il-messaġġ ma jkunx ġie soġġett għal kriptaġġ addizzjonali.

Parti prattika

Disinn tal-programm

L-għodda kollha meħtieġa għall-implimentazzjoni ta' algoritmi ta' encryption u decryption se jiġu inklużi fil-pakkett com.tsarik.steganography. Dan il-pakkett jinkludi l-interface Encryptor bil-metodi encrypt и decrypt, Klassi Binary, li jipprovdi l-abbiltà li taħdem ma 'arrays tal-bits, kif ukoll klassijiet ta' eċċezzjoni UnableToEncryptException и UnableToDecryptException, li għandhom jintużaw f'metodi ta 'interface Encryptor f'każ ta' żbalji ta' kodifikazzjoni u dekodifikazzjoni rispettivament.

Pakkett ewlieni tal-programm com.tsarik.programs.gifed se jinkludi klassi ta 'programm li jista' jitħaddem b'metodu statiku main, li jippermettilek tmexxi l-programm; klassi li taħżen il-parametri tal-programm; u pakketti bi klassijiet oħra.

L-implimentazzjoni tal-algoritmi nfushom se tiġi ppreżentata fil-pakkett com.tsarik.programs.gifed.gif klassijiet GIFEncryptorByLSBMethod и GIFEncryptorByPaletteExtensionMethod. Dawn iż-żewġ klassijiet se jimplimentaw l-interface Encryptor.

Ibbażat fuq l-istruttura tal-format GIF, tista 'toħloq algoritmu ġenerali għall-introduzzjoni ta' messaġġ fil-paletta tal-immaġni:

Steganografija fil-GIF

Biex tiddetermina l-preżenza ta 'messaġġ f'immaġini, huwa meħtieġ li tiżdied ċerta sekwenza ta' bits fil-bidu tal-messaġġ, li d-decoder jaqra l-ewwel u jiċċekkja għall-korrettezza. Jekk ma taqbilx, allura jitqies li m'hemm l-ebda messaġġ moħbi fl-immaġni. Sussegwentement trid tispeċifika t-tul tal-messaġġ. Imbagħad it-test tal-messaġġ innifsu.

Dijagramma tal-klassi tal-applikazzjoni kollha:

Steganografija fil-GIF

Implimentazzjoni tal-programm

L-implimentazzjoni tal-programm kollu tista 'tinqasam f'żewġ komponenti: implimentazzjoni ta' metodi ta 'kodifikazzjoni ta' interface u deċifrar Encryptor, fil-klassijiet GIFEncryptorByLSBMethod и GIFEncryptorByPaletteExtensionMethod, u l-implimentazzjoni tal-interface tal-utent.

Ikkunsidra l-klassi GIFEncryptorByLSBMethod.

Steganografija fil-GIF

oqsma firstLSBit и secondLSBit fihom in-numri ta’ bits ta’ kull byte tal-immaġni li fih għandu jiddaħħal il-messaġġ u minn fejn għandu jinqara l-messaġġ. Qasam checkSequence jaħżen sekwenza tal-bit tal-kontroll biex jiżgura r-rikonoxximent tal-messaġġ inkorporat. Metodu statiku getEncryptingFileParameters jirritorna l-parametri tal-fajl speċifikat u l-karatteristiċi tal-messaġġ potenzjali.

Algoritmu tal-metodu encrypt klassi GIFEncryptorByLSBMethod:

Steganografija fil-GIF

U l-kodiċi tiegħu:

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

Algoritmu u kodiċi tas-sors tal-metodu decrypt klassi GIFEncryptorByLSBMethod:

Steganografija fil-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);
}

Implimentazzjoni tal-klassi GIFEncryptorByPaletteExtensionMethod se jkun simili, il-metodu biss ta 'ffrankar/qari ta' informazzjoni huwa differenti.

Fil-klassi MainFrame metodi tat-tgeżwir huma deskritti: encryptImage(Encryptor encryptor) и decryptImage(Encryptor encryptor), l-ipproċessar tar-riżultati tal-metodi ta ' l-interface Encryptor u l-interazzjoni mal-utent, jiġifieri l-ftuħ ta 'djalogu tal-għażla tal-fajl, li juri messaġġi ta' żball, eċċ.; kif ukoll metodi oħra: openImage(), li tippermetti lill-utent jagħżel immaġini, exit(), li joħroġ mill-applikazzjoni. Dawn il-metodi jissejħu minn Actionoġġetti tal-menu korrispondenti ta '. Din il-klassi timplimenta wkoll metodi awżiljarji: createComponents() - ħolqien ta' komponenti tal-forma, loadImageFile(File f) — tagħbija ta' immaġni f'komponent speċjali minn fajl. Implimentazzjoni tal-klassi GIFEncryptorByPaletteExtensionMethod simili għall-implimentazzjoni tal-klassi GIFEncryptorByLSBMethod, id-differenza ewlenija hija fil-mod kif il-bytes tal-messaġġ jinkitbu u jinqraw mill-paletta.

Operazzjoni tal-programm

Metodu LBS

Ejja ngħidu li hemm immaġini bħal din:

Steganografija fil-GIF

F'din l-immaġni, il-paletta tikkonsisti f'256 kulur (kif iż-Żebgħa jsalva). L-ewwel erba 'kuluri huma: abjad, iswed, aħmar, aħdar. Kuluri oħra huma suwed. Is-sekwenza tal-bit tal-paletta globali se tkun kif ġej:

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

Steganografija fil-GIF

Ladarba l-messaġġ ikun inkorporat, il-bits issottolinjati jiġu sostitwiti bil-bits mill-messaġġ. L-immaġni li tirriżulta kważi mhix differenti mill-oriġinal.

Original
Immaġni b'messaġġ inkorporat

Steganografija fil-GIF
Steganografija fil-GIF

Metodu ta 'espansjoni tal-paletta

Meta tiftaħ immaġini li jkun fiha messaġġ billi tuża dan il-metodu, tara l-istampa li ġejja:

Steganografija fil-GIF

Huwa ċar li dan il-metodu mhux se jaħdem għal attivitajiet ta 'spjunaġġ sħiħ, u jista' jeħtieġ kriptaġġ addizzjonali tal-messaġġ.

Encryption/decryption f'immaġini animati jaħdem bħal f'immaġini statiċi regolari, iżda l-animazzjoni mhix miksura.

Sorsi użati:

Niżżel:

Sors: www.habr.com

Żid kumment