Una volta aghju scrittu u mo
Oghje avemu da pruvà à scavà un pocu più in fondu è fighjà l'algoritmu LSB. Sè vo site interessatu, vi sò benvenuti sottu cat. (Sutta u cut hè u trafficu: circa un megabyte.)
Prima di tuttu, hè necessariu di fà una breve introduzione. Tuttu u mondu sapi chì u scopu di a criptografia hè di rende impussibile di leghje l'infurmazioni secreti. Di sicuru, a criptografia hà e so applicazioni, ma ci hè un altru approcciu à a prutezzione di dati. Ùn avemu micca da criptà l'infurmazioni, ma pretendenu chì ùn l'avemu micca. Hè per quessa chì a steganografia hè stata inventata. Wikipedia ci assicura chì "a steganografia (da u grecu στεγανοσ - ammucciatu è u grecu γραφω - scrivu, letteralmente "scrittura segreta") hè a scienza di a trasmissione oculata di l'infurmazioni mantenendu u fattu stessu di a trasmissione secreta.
Di sicuru, nimu pruibisce di cumminà metudi criptografichi è steganografichi. Inoltre, in pratica facenu questu, ma u nostru compitu hè di capisce i principii. Se studiate attentamente l'articulu di Wikipedia, truverete chì l'algoritmi di steganografia includenu u chjamatu. cuntainer è missaghju. Un cuntinuu hè qualsiasi infurmazione chì aiuta à ammuccià u nostru missaghju sicretu.
In u nostru casu, u cuntinuu serà una maghjina in formatu BMP. Prima, fighjemu a struttura di stu schedariu. U schedariu pò esse divisu in 4 parti: l'intestazione di u schedariu, l'intestazione di l'imaghjini, a paleta è l'imaghjini stessu. Per i nostri scopi, avemu solu bisognu di sapè ciò chì hè scrittu in l'intestazione.
I primi dui bytes di l'intestazione sò a firma BM, dopu a dimensione di u schedariu in byte hè scritta in una parola doppia, i prossimi 4 byte sò riservati è deve cuntene zeri, è infine, una altra doppia parolla cuntene l'offset da u principiu di l'intestazione. file à i bytes attuali di l'imaghjini. In un schedariu bmp 24-bit, ogni pixel hè codificatu cù trè byte BGR.
Avà sapemu cumu ghjunghje à l'imaghjini, tuttu ciò chì resta hè di capisce cumu pudemu scrive l'infurmazioni chì avemu bisognu. Per questu avemu bisognu di u metudu LSB. L'essenza di u metudu hè a siguenti: rimpiazzà i bits menu significati in i bytes rispunsevuli di a codificazione di culore. Dicemu chì u prossimu byte di u nostru missaghju sicretu hè 11001011, è i byte in l'imaghjini sò ... 11101100 01001110 01111100 0101100111 ..., allora a codificazione serà cusì. Divideremu u byte di missaghju sicretu in 4 parti di dui bit: 11, 00, 10, 11, è rimpiazzà i bits di pocu ordine di l'imaghjini cù i frammenti resultanti: ...11101111 01001100 01111110 0101100111…. Un tali rimpiazzamentu ùn hè generalmente micca notu à l'ochju umanu. In più, assai vechji dispusitivi di pruduzzioni ùn sarà ancu capaci di vede tali cambiamenti minori.
Hè chjaru chì pudete cambià micca solu i 2 bits menu significativu, ma ogni numeru di elli. Ci hè u seguente mudellu: più bits cambiemu, più infurmazione pudemu ammuccià, è più interferenza questu pruvucarà in l'imaghjini originale. Per esempiu, quì sò dui imagine:
Malgradu i mo sforzi, ùn pudia vede a diffarenza trà elli, ma in ogni modu, in a seconda maghjina, cù u metudu descrittu, u puema di Lewis Carroll "A Caccia di Snark" hè oculatu. Sè avete lettu finu à quì, allora site probabilmente interessatu à amparà nantu à l'implementazione. Hè abbastanza sèmplice, ma vi avverteraghju subitu chì tuttu hè fattu in Delphi. Ci hè dui motivi per questu: 1. Pensu chì Delphi hè una bona lingua ; 2. Stu prugramma hè natu in u prucessu di priparà un corsu nantu à i principii di a visione di l'urdinatore, è i picciotti à quale sò insignatu stu corsu ùn sanu ancu nunda altru chè Delphi. Per quelli chì ùn sò micca familiarizati cù a sintassi, una cosa deve esse spiegata: shl x hè un shift bit à a manca da x, shr x hè un shift bit à a diritta da x.
Assumimu chì scrivemu testu guardatu in una stringa in u containeru è rimpiazzà i dui byte più bassi:
Codice di registrazione:
per i:=1 à longu (str) do
principia
l1:=byte(str[i]) shr 6;
l2:=byte(str[i]) shl 2; l2:=l2 shr 6;
l3:=byte(str[i]) shl 4; l3:=l3 shr 6;
l4:=byte(str[i]) shl 6; l4:=l4 shr 6;
f.ReadBuffer(tmp,1);
f.Position:=f.Position-1;
tmp:=((tmp shr 2) shl 2)+l1;
f.WriteBuffer(tmp,1);
f.ReadBuffer(tmp,1);
f.Position:=f.Position-1;
tmp:=((tmp shr 2) shl 2)+l2;
f.WriteBuffer(tmp,1);
f.ReadBuffer(tmp,1);
f.Position:=f.Position-1;
tmp:=((tmp shr 2) shl 2)+l3;
f.WriteBuffer(tmp,1);
f.ReadBuffer(tmp,1);
f.Position:=f.Position-1;
tmp:=((tmp shr 2) shl 2)+l4;
f.WriteBuffer(tmp,1);
fine;
codice da leghje:
per i:=1 à MsgSize do
principia
f.ReadBuffer(tmp,1);
l1:=tmp shl 6;
f.ReadBuffer(tmp,1);
l2:=tmp shl 6; l2:=l2 shr 2;
f.ReadBuffer(tmp,1);
l3:=tmp shl 6; l3:=l3 shr 4;
f.ReadBuffer(tmp,1);
l4:=tmp shl 6; l4:=l4 shr 6;
str:=str+char(l1+l2+l3+l4);
fine;
Ebbè, per i veramente pigri -
Спасибо.
Source: www.habr.com