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:
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:
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:
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.
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.
@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:
@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:
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:
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
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:
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.