Este módulo ocultará arquivos dentro de imagens (atualmente PNG) e exportará a imagem modificada para o disco
. O tamanho máximo do arquivo que pode ser oculto dentro de uma imagem depende da dimensão da imagem.
max_file_size = ( height_of_image * width_of_image * 6 / 8 ) bytes
'100k words.txt' está oculto em 'original_image.png' nomeado como 'image_with_100k words.png'. Vá e check -out se você puder identificar a diferença entre essas duas imagens. Você pode usar este módulo para extrair '100k words.txt' do 'image_with_100k words.png'
Exemplo
de imagem original
Imagem Modificada
Esta imagem tem 100 mil palavras escondidas dentro dela!
Como funciona?
É baseado em um princípio simples de que, se alterarmos o LSB (Least Significant Bits) de cada pixel, a alteração não será significativa e não será percebida pelos olhos.
Então, este módulo pega 2 bits de dados do arquivo a ser oculto e substitui os últimos 2 bits de um pixel por esses 2 bits e, em seguida, passa para o próximo pixel. A mudança máxima no pixel pode ser de 4 unidades e a faixa de valores em uma imagem PNG se (0,255), portanto essa alteração não será significativa.
Em uma imagem PNG, cada pixel possui 3 canais vermelhos, verdes e azuis. (Algumas imagens PNG têm 1 ou 4 canais, mas esse programa as converterá em 3 canais) Um pixel típico em uma imagem PNG se parece:
a_pixel = (17,32,11) # (RED, GREEN, BLUE)
Assim, podemos economizar 3 vezes 2 bits em um pixel, ou seja, 6 bits por pixel. Isso nos leva ao limite superior do tamanho do arquivo, que pode ser ocultado em uma imagem:
max_file_size = ( height_of_image * width_of_image * 6 / 8 ) bytes
Vamos entender tomando um exemplo. Os dados a ocultar são:
binary_data = 0b100111
Vamos pegar os dois primeiros bits e substituí-los pelo canal RED do nosso 'a_pixel'.
a_pixel = (0b10001, 0b100000, 0b1011) # binary representation of a_pixel values
# Let's change a_pixel's RED Channel
# 0b10001 -> 0b10010 ( First 2 bits are 10 )
a_pixel = (0b10010, 0b100000, 0b1011) # modified pixel
Vamos novamente pegar 2 bits de binary_data e substituir os últimos 2 bits do Canal VERDE por eles.
a_pixel = (0b10010, 0b100000, 0b1011)
# Let's change a_pixel's GREEN Channel
# 0b100000 -> 0b100001 ( The 2 bits are 01 )
a_pixel = (0b10010, 0b100001, 0b1011) # modified pixel
Vamos fazer isso mais uma vez com o BLUE Channel e terminaremos.
a_pixel = (0b10010, 0b100001, 0b1011)
# Let's change a_pixel's BLUE Channel
# 0b1011 -> 0b1011 ( The 2 bits are 11 ) ; Notice that the value wasn't changed this time
a_pixel = (0b10010, 0b100001, 0b1011) # pixel wasn't modified this time
Então, escondemos nossa mensagem de 6 bits em um pixel, vamos ver as mudanças no pixel
a_pixel = (0b10001, 0b100000, 0b1011) = (17, 32, 11)
a_pixel_with_data = (0b10010, 0b100001, 0b1011) = (18, 33, 11)
Como podemos ver, a mudança nem é perceptível no nível do pixel. O Módulo faz isso repetidamente até que todos os nossos dados sejam salvos na imagem.
NOTA: O ruído na foto é aumentado e se usarmos qualquer software de edição de fotos e compararmos com a imagem original, essa imagem terá muito mais ruído do que a imagem original.
Solução para este problema: Nunca carregue/compartilhe a imagem original na Internet
Todos
Adicionar suporte para imagens JPEG
Adicionar criptografia opção
Adicionar detecção automática do nome do arquivo a ser extraído