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.

Imagem retirada do seguinte site
🎯 Objetivo
Você deve desenvolver um programa em assembly RISC-V que:
- Extraia duas mensagens secretas escondidas nos bits menos significativos de uma imagem
.pgm
de 64×64 pixels. - Decifre a segunda mensagem usando uma cifra de César, com o deslocamento revelado pela primeira.
- 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
- Ler os 440 primeiros bits LSB para formar:
- Mensagem 1 (248 bits / 31 caracteres)
- Mensagem 2 (192 bits / 24 caracteres)
- Interpretar o shift a partir da Mensagem 1.
- Decifrar Mensagem 2 com a cifra de César.
- 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.
Exemplo, shift = 3
:
C → Z (inverso: Z → C)
D → A (inverso: A → D)
🧪 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