[tutorial] esteganografia: ocultar texto dentro cores (LSB)

Postagem de conteúdo sobre codificação, criptografia, hashing, esteganografia
Post Reply
User avatar
Kodo no Kami
Admin
Admin
Posts: 725
Joined: Fri Jan 02, 2015 1:56 pm
Contact:

[tutorial] esteganografia: ocultar texto dentro cores (LSB)

Post by Kodo no Kami » Fri Oct 30, 2015 12:42 am

e ae galera esse é meu segundo tutorial de esteganografia e nele vamos aprender como esconder texto (ou qualquer outro tipo de byte) dentro de cores usando uma tecnica chamada lsb (Least Significant Bit) que significa o bit menos significativo, essa tecnica consiste da gente modificar o bit menos significativo do byte da cor na imagem com isso usando uma sequencia de bytes modificado podemos ocultar um texto ou ate mesmo um arquivo dentro das cores de uma imagem, porem a imagem em si precisa ser pelo menos 4x maior do que a quantide de caractere ou byte que vamos ocultar (esse maior seria a quantidade de pixels que ela composta e nao tamanho em bytes total da imagem), porem antes da gente enteder como a tecnica de estaganografia com base em lsb funciona vamos entender como os bytes e bit funciona pois sao extramamente importante para esse processo, um bit é menor sequencia numerica ou a menor quantidade de dados que uma maquina poderia processar e ela tem apenas dois estados que é 0 ou 1 (ou seja sao apenas 2 numeros que pode ser processado)

Code: Select all

0 = sou seu processador e digo que isso é 0
1 = sou seu processador e digo que isso é 1
tem poucas coisas que uma maquina poderia fazer com apenas dois numeros e uma delas é logica booleana que pode ser definido o numero 1 como verdadeiro e o 0 como falso (porem isso nao vem ao caso), um unico bit nao é possivel definir mais de 2 estados ou seja se a gente tivesse que usar um terceiro estado nessa logica booleana para definir um "talvez" nao seria possivel isso por que nao é possivel processar um terceiro estado ja que o mesmo so processa dois estados 0 e 1 (ou passado corrente alta ou corrente baixa ~ high e low)

Code: Select all

1 = verdadeiro (true)
0 = falso (false)
? = talvez
para contornar isso os arquitetos da computação pensaram da seguinte forma ao inves da gente processar um bit vamos processar uma sequencia de bits em conjunto e com isso podemos ter varios estados com varios bits juntos, por exemplo se a gente processar 8 bits em sequencia vamos ter 256 estados diferentes ja que 2 elevado a 8 é igual a 256 estados (0 ate 255)

Code: Select all

00000000 = 0
01100001 = 97 (tambem é a letra 'a' em ascii)
11111111 = 255
para facilitar existem nomes que define quantas sequencias de bits o computador esta trabalhando e elas sao

Code: Select all

1bit = bit (2 estados)
4bits = nimble (16 estados)
8bits = byte (256 estados)
16bits = word (65536 estados)
32bits = dword (4294967296 estados) daqui para frente eu usei a calculadora u.u
64bits = qword (1,844674407*10^19)
como podemos ver usamos bytes para definir o tamanho dos arquivos ou outras informações referente a ele ou seja dentro de um arquivo de 500Bytes tem 4000bits ou 500 vezes o numero 8 sendo que a cada 1byte tem 8bits, no caso é importante a gente saber a diferença entre bit e byte por que um byte que usamos para definir o tamanho de um arquivo é na verdade 8bits ou seja o processador teve que trabalhar 8 vezes para formar aquele byte, voltando para a parte de estaganografia agora a gente ja sabe que tecnica LSB modifica o bit e nao o byte no caso o bit menos significativo que é o numero que nao vai causar muitas mudanças nos demais ou naquilo que voce vai mudar digamos assim (um bom exemplo real disso seria se voce for em bar e compra um biscoito por R$1,10 mais tarde vai em outro bar acha o mesmo biscoito por R$1,15 no caso nao fez tanta diferença significativa para seu bolso nao é? , porem voce vai em um terceiro bar e acha o mesmo biscoito por R$6,50 veja que diferença significativa de um bar para outro), muitos formatos de imagem usa um padrao especifico de 3 cores juntas para formar uma nova cor para um pixel especifico e na maior parte das vezes é vermelho verde e azul no caso o padrao RGB, sendo essas 3 cores juntas pode forma as outras por exemplo vermelho e verde é igual a amarelo porem se voce pegar um vermelho forte e um verde fraco voce vai ter a cor laranja e nao um amarelo, no caso o padrao RGB define cada cor como um byte ou seja cada cor tem 256 estados para ser definido e quanto maior for o numero mais forte ele é

Code: Select all

r,g,b = vermelho, verde, azul
255,0,0 = vermelho
0,255,0 = verde
0,0,255 = azul
255,255,0 = amarelo
255,112,0 = laranja
128,128,128 = cinza
0,0,0 = preto
255,255,255 = branco
como eu disse antes que muitos formatos de imagem usa tres cores para definir um pixel e essas 3 cores sao nada mais nada menos que 3 bytes entao em um pixel a gente poderia manipular 3 bytes ou seja em um pixel podemos mudar 3bits menos significativo ja que o LSB muda o bit menos significativo correto?, para facilitar como vou esta mexendo com bit é mais facil transformar o numero em numero binario do que manipular ele em decimal (embora nao faça diferença nenhuma a unica diferença que em binario podemos ver os bits), no caso do exemplo vou mexer com a cor laranja ou (255,112,0)

#

Code: Select all

255,112,0 = laranja (decimal)
11111111,1110000,00000000 = laranja (binario)
nesse primeiro teste vou mudar a cor vermelha para e ver qual é o bit menos significativo entao mudei o primeiro bit do 11111111 (255) ficando 01111111 (127), o problema que a cor era laranja fico marrom meio verde ou seja esse nao era o bit menos significativo e sim o oposto o mais significativo kkkk

#

Code: Select all

01111111,1110000,00000000
127,112,0 
refiz o teste novamente porem agora mudei ultimo bit para ver se a mudança ia ser grande entao mudei 11111111 (255) para 11111110 (254), e bingo ainda continuo laranja ou seja o ultimo bit é menos significativo

#

Code: Select all

11111110,1110000,00000000
254,112,0 
agora ja sabemos que o bit menos significativo é o da direita nao precisamos fazer o mesmo com as outras cores ja que na maioria das vezes segue o mesmo padrao, a segunda parte é usar o padrao de tabela de caracteres ou criar um para armazenar no caso recomendo usar o ascii porem se voce vai apenas armazenar letrar e numeros sem ter simbolos especiais voce pode criar um vai economizar espaço com isso, se optar por usar o ascii voce vai ter que sempre ter 8bits de espaço para armazenar cada byte da tabela ou seja cada pixel é 3bytes que podemos usar 3bits entao a gente vai precisar de pelos menos 3pixel para armazenar um byte da tabela ascii, vamos supor temos uma imagem e os pixels dela em sequencia é verde, vermelho e amarelo

###

Code: Select all

(0,128,0) (255,0,0) (255,255,0)


(00000000,10000000,00000000) (11111111,00000000,00000000) (11111111,11111111,00000000) 
e com isso a gente queira ocultar a letra 'k' de acordo com a tabela ascii sendo ela o numero 107 em decimal ou 01101011 em binario, o que vamos fazer é mudar o bit menos significativo na imagem para o bit da letra, com isso as cores continua a mesma na imagem porem pelo bit menos significativo podemos recuperar nosso byte oculto depois

###

Code: Select all

(0,129,1) (254,1,0) (255,255,0)


(00000000,10000001,00000001) (11111110,00000001,00000000) (11111111,11111111,00000000) 

(???????0,???????1,???????1) (???????0,???????1,???????0) (???????1, ???????1) 

01101011
podemos perceber que ainda resto um bit sendo que um byte é igual a 8bits porem usamos 3 pixel que seria o minimo para armazenar um byte (3 pixel a gente ganha 9bit devido ser 3 cores cada pixel e a gente usa 1bit de cada cor), esse bit que resto nao poderia ser usado para nada nesse exemplo podemos aproveitar ele para iniciar o proximo bit ao inves de começar no proximo pixel podemos começar direto dele (assim a gente economiza um bit por pixel a e cada 3 bit economizado a gente ganha um novo espaço para armazenar um byte), tambem podemos usar compressão de dados porem é um assunto bem longo para esse tutorial vou deixar para um futuro tutorial, tambem nao posso deixar de citar uma coisa importante como sabemos precisamos de 3 pixeis para armazenar um byte correto? isso quer dizer que a imagem em si precisa ter uma dimensão suficiente para todos os bytes que vamos ocultar para ver isso basta calcular quantos pixeis tem uma imagem para isso basta multiplicar a dimensao dela exemplo uma imagem 400x200 tem 80000 pixeis e com 80000px usamos 3 para cada byte ou seja 80000 dividido por 3 daria para gente ocultar um texto de mais ou menos 26666 caracteres (porem a cada 3 pixel tambem resta 1 bit ou seja de 80000px ia sobrar 26666bit voce precisa de 8bit para ocultar um novo byte entao 26666/8 = 3333 totalizando 29999 de espaço para armazenar se voce usa o bit que sobro para inciar o proximo), bom galera dificilmente alguem ia descobrir que existe alguma coisa oculta ali e se voce usa criptografia nos bytes que serao oculto ou gravar de forma embaralhada em posiçoes aleatorias isso pode passar batido ate para um profissional dessa area pricipalmente se a imagem onde voce esta ocultando é sua e nao existe uma copia original dela para comparar com isso nao da para saber se foi modificada, recomendação do kodo use a esteganografia para ocultar aqueles links de sites que voce nao quer que os outros descubra ou para salvar suas senhas em imagens caso esqueça algum dia ou sei la para passar mensagem oculta para seus amigos por uma rede social \o

by kõdo no kami
Image

que desagradavel ~ mirai kuriyama

Post Reply

Return to “Criptografia / Esteganografia”