Skip to content

Laboratório 8 - 🕵️ Missão Secreta: Operação Pixels Codificados

📝 Descrição - Peso 2

Agente,

Você foi convocado para uma missão ultrassecreta de segurança digital. A inteligência do MC404 interceptou imagens aparentemente inofensivas, mas que escondem mensagens confidenciais. Seu papel, como especialista em criptografia e arquitetura RISC-V, será decifrar essas mensagens... e escondê-las novamente, para despistar qualquer espião que esteja de olho.

Prepare seu ambiente de desenvolvimento — e sua atenção aos bits — pois cada detalhe importa nesta operação.


O que é esteganografia?

A esteganografia é uma técnica de ocultação de informações dentro de arquivos de mídia, como imagens, áudio ou vídeo, de forma que a presença da informação oculta não seja detectada facilmente. Em outras palavras, enquanto a criptografia se preocupa em tornar informações ilegíveis para aqueles sem a chave correta, a esteganografia se concentra em esconder a própria existência da informação confidencial.

example

Imagem retirada do seguinte site

🎯 Objetivo

Você deve desenvolver um programa em assembly RISC-V que:

  1. Extraia duas mensagens secretas escondidas nos bits menos significativos de uma imagem .pgm de 64×64 pixels.
  2. Decifre a segunda mensagem usando uma cifra de César, com o deslocamento revelado pela primeira.
  3. Esconda a segunda mensagem decifrada nos últimos pixels da imagem, manipulando novamente seus bits menos significativos.

🧠 Contexto Técnico

A Imagem

  • A imagem fornecida tem 4 096 pixels (64×64) e está no formato PGM (tons de cinza, 8 bits por pixel).
  • Cada valor de pixel varia entre 0 e 255.
  • O formato de entrada segue:
    P5
    64 64
    255
    [dados de 4 096 bytes]
    

📦 Mensagens Secretas

Nos primeiros bits menos significativos da imagem, excluindo o cabeçalho, você encontrará:

  • Mensagem 1: 31 caracteres (248 bits). É uma pista textual que indica o valor do shift para decifrar a segunda mensagem.
  • Mensagem 2: 24 caracteres (192 bits), criptografada via cifra de César.

Total de bits lidos do início da imagem: 440 bits (55 bytes).


🕹️ Entrada e Saída

Entrada

Processo

  1. Ler os 440 primeiros bits LSB para formar:
  2. Mensagem 1 (248 bits / 31 caracteres)
  3. Mensagem 2 (192 bits / 24 caracteres)
  4. Interpretar o shift a partir da Mensagem 1.
  5. Decifrar Mensagem 2 com a cifra de César.
  6. Reescrever os 192 bits da mensagem decifrada nos últimos 192 pixels (um bit por pixel), sem alterar o tamanho do arquivo.

Tip

Lembre-se que você não deve ignorar os bits do cabeçalho.

🔒 Cifra de César

Desloca cada letra do alfabeto por um número fixo de posições.
Para decifrar, aplique deslocamento inverso.

Example

Exemplo, shift = 3:

C  Z   (inverso: Z  C)
D  A   (inverso: A  D)
Pontuação e espaços permanecem inalterados.


🧪 Validação Automática

O script de avaliação irá testar:

  • Tamanho da imagem permanece idêntico.
  • Extração correta dos 440 bits iniciais.
  • Decifra correta da segunda mensagem.
  • Reinserção precisa nos 192 bits finais.

Dicas

  • Você em algum momente precisará usar o debuger do simulador para interpretar a primeira mensagem e descobrir o tamanho do shift da cifra de César.
  • Para testar no simulador, você deve carregar seu programa (arquivo .s) e o arquivo de imagem (nome 'image.pgm') simultaneamente.
  • Quando novos arquivos são carregados no simulador, os antigos são apagados, então você deve carregar o programa e os arquivos de imagem juntos todas as vezes.
  • Para usar o Canvas, você pode habilitá-lo no simulador. Para fazer isso, vá para a aba 'Hardware' -> tabela 'Dispositivos Externos' -> ícone '+' na linha do Canvas. Uma nova aba aparecerá onde o canvas pode ser visto. O link do teste já vem com ele configurado
  • Este exercício usa vários números de syscall. Esses valores sempre serão armazenados no registrador a7, e a função ecall terá um comportamento diferente para cada valor. Para verificar a syscall para uma funcionalidade específica, a tabela do simulador pode ser consultada (note que as syscalls relacionadas a dispositivos externos, como o Canvas, não são mostradas nesta tabela se o dispositivo não estiver habilitado).
  • Em todas as imagens, o valor máximo (Maxval) será 255.
  • O canvas é indexado começando do 0.
  • Para ver as imagens sendo geradas é preciso abrir o Canvas, quando estiver rodando manualmente é preciso reseta-lo antes de abrir novamente
  • Você precisa redimensionar o canvas (syscall setCanvasSize) de acordo com o cabeçalho do arquivo.
  • Exemplo "setPixel" para um pixel:
li a0, 100 # x coordinate = 100
li a1, 200 # y coordinate = 200
li a2, 0xFFFFFFFF # white pixel
li a7, 2200 # syscall setPixel (2200)
ecall
  • Exemplo "open": A chamada de sistema "open" retorna o descritor de arquivo (fd) para o arquivo em a0. Esse descritor de arquivo deve ser usado na chamada de sistema "read" para indicar o arquivo do qual o sistema operacional deve ler a fim de obter o conteúdo do arquivo.
    la a0, input_file    # address for the file path
    li a1, 0             # flags (0: rdonly, 1: wronly, 2: rdwr)
    li a2, 0             # mode
    li a7, 1024          # syscall open 
    ecall

input_file: .asciz "image.pgm"

Boa sorte, agente. A segurança digital está em suas mãos.

⚠️ Atenção

Como a imagem é 64x64 o programa irá demorar alguns minutos para executar. Tenha pasciencia e espere o programa terminar. Além disso

Valide seu código no simulador ALE aqui e envie o relatório como lab08_raXXXXXX.report substituindo XXXXXX pelo seu RA.

Warning

  • Qualquer alteração no arquivo de report será considerado fraude
  • Esta é uma atividade que deve ser realizada programando-se em linguagem de montagem - A submissão de programas em linguagem de programação de alto nível, como C, ou de programas gerados por ferramentas de compilação, serão considerados como fraude
  • Está é uma atividade individual, o qual deve ser desenvolvido individualmente, qualquer forma de cópia ou plágio será penalizada. Portanto, atividades que apresentarem semelhanças injustificadas serão atribuídas nota zero para todos os envolvidos