Não faz muito tempo, um
Hackathon piloto para estudantes foi realizado na minha
escola . O tópico de tarefas estava relacionado à segurança da informação, incluindo criptografia de dados.

Uma das tarefas mais coloridas foi a TAREFA-10:
esteganografia .
Nós damos uma definição.
A esteganografia é uma maneira de transmitir ou armazenar informações, levando em consideração a confidencialidade do fato de tal transferência (armazenamento).
Em outras palavras, se a criptografia oculta a informação em si, a esteganografia oculta o fato de sua transmissão.

Infelizmente, a equipe e eu não tivemos tempo para concluir esta tarefa a tempo e decidi concluí-la após o evento.
A solução mais óbvia na época parecia ser:
- Converter texto cifrado em conjuntos de bits.
- Faça o mesmo com a imagem.
- Coloque o texto em um local aleatório na imagem e salve-o como uma imagem.
Aqui está um pequeno código para converter texto em conjuntos de bits e vice-versa.
def text_to_binary(event): return [int(format(ord(elem),'b')) for elem in event] def binary_to_text(event): return [chr(int(str(elem),2)) for elem in event]
No entanto, depois de contar a meus colegas mais experientes sobre meus pensamentos, fui enviado para ensinar material.
Você precisa começar com o fato de que os bytes do arquivo de imagem não podem ser editados diretamente se não forem bmp.
{% - codificador aleatório%}
Depois de ler um pouco sobre os modelos de cores, decidi abandonar a decomposição da imagem para 1 e 0 em favor das modificações dos próprios pixels na paleta RGB. Para essas manipulações, escolhi a biblioteca Pillow, aqui está
um bom artigo sobre isso.
Então, temos uma imagem. A imagem possui pixels. Os pixels são formados a partir de cores primárias - vermelho, verde e azul.
Cada uma das cores é codificada com um número de 0 a 255.

E também temos caracteres ASCII que também são codificados.
Vamos tentar criptografar algum texto nesta imagem.
Imagem:
Um pouco de texto:C facilita o tiro no pé; O C ++ torna mais difícil, mas quando o faz, afasta toda a perna
Conecte as bibliotecas necessárias.
from PIL import Image, ImageDraw from random import randint
Então declaramos a função e colocamos nela todos os objetos que são úteis para nós.
def stega_encrypt(): keys = [] img = Image.open(input("path to image: ")) draw = ImageDraw.Draw(img) width = img.size[0] height = img.size[1] pix = img.load() f = open('keys.txt','w')
Mais interessante. A tarefa mais importante é criar uma maneira de criptografar as mensagens. Eu propus
este método :
- Pegue um personagem, traduza-o em um número ASCII
- Crie uma tupla com coordenadas aleatórias
- Coletamos tons de verde e azul de um pixel nas coordenadas
- Substitua a tonalidade vermelha pelo número de caractere ASCII
for elem in ([ord(elem) for elem in input("text here: ")]): key = (randint(1,width-10),randint(1,height-10)) g, b = pix[key][1:3] draw.point(key, (elem,g , b)) f.write(str(key)+'\n')
Nós salvamos as chaves e a imagem.
print('keys were written to the keys.txt file') img.save("newimage.png", "PNG") f.close()
códigoTentamos executar o script.
Como resultado, obtivemos a mesma imagem, mas no formato
png e com alguns pixels alterados.

Agora resta de alguma forma decifrar tudo.
Estamos escrevendo um script para descriptografia!
Nós conectamos tudo o que é necessário.
from PIL import Image from re import findall
Declaramos uma função para descriptografia, bem como vários objetos.
def stega_decrypt(): a = [] keys = [] img = Image.open(input("path to image: ")) pix = img.load() f = open(input('path to keys: '),'r') y = str([line.strip() for line in f])
Algoritmo básico de descriptografia:
for i in range(len(findall(r'\((\d+)\,',y))): keys.append((int(findall(r'\((\d+)\,',y)[i]),int(findall(r'\,\s(\d+)\)',y)[i]))) for key in keys: a.append(pix[tuple(key)][0]) return ''.join([chr(elem) for elem in a])
Essas expressões regulares são necessárias para ler tuplas de um arquivo de texto.
A última ação é exibir uma mensagem criptografada na tela.
print("you message: ", stega_decrypt())
códigoAgora tente receber nossa mensagem.

Conforme necessário para provar, tudo funciona!
A principal desvantagem: a visibilidade de pixels mortos na imagem no caso de criptografia de um grande número de caracteres. No entanto, essa falha é perfeitamente corrigida por alta resolução.
Referências: