Substitution
Para este problema, você escreverá um programa que implementa uma cifra de substituição, conforme abaixo.
$ ./substitution JTREKYAVOGDXPSNCUIZLFBMWHQ
plaintext: HELLO
ciphertext: VKXXN
Problema a Resolver
Em um arquivo chamado substitution.c
em uma pasta chamada
substitution
, crie um programa que permite criptografar
mensagens usando uma cifra de substituição. No momento em que o usuário executa o programa, ele deve decidir,
fornecendo um argumento de linha de comando, qual deve ser a chave na mensagem secreta que fornecerá em tempo de
execução.
Começando
Passo a Passo
Eis aqui um passo a passo para a resolução do problema.
Contexto
Em uma cifra de substituição, "criptografamos" (ou seja, ocultamos de maneira reversível) uma mensagem substituindo cada letra por outra letra. Para isso, usamos uma chave: nesse caso, um mapeamento de cada uma das letras do alfabeto para a letra que ela deve corresponder quando criptografada. Para "descriptografar" a mensagem, o receptor da mensagem precisaria conhecer a chave, para que possa reverter o processo: traduzindo o texto criptografado (geralmente chamado de ciphertext) de volta à mensagem original (geralmente chamada de plaintext).
Uma chave, por exemplo, pode ser a string NQXPOMAFTRHLZGECYJIUWSKDVB
. Essa chave de 26 caracteres
significa que A
(a primeira letra do alfabeto) deve ser
convertida em N
(o primeiro caractere da chave), B
(a segunda letra do alfabeto) deve ser convertida em Q
(o segundo caractere da chave), e assim por diante.
Uma mensagem como HELLO
, então, seria criptografada
como FOLLE
, substituindo cada uma das letras de acordo
com o mapeamento determinado pela chave.
Vamos escrever um programa chamado substitution
que
permita criptografar mensagens usando uma cifra de substituição. No momento em que o usuário executa o programa,
ele deve decidir, fornecendo um argumento de linha de comando, qual será a chave na mensagem secreta que ele
fornecerá em tempo de execução.
Aqui estão alguns exemplos de como o programa pode funcionar. Por exemplo, se o usuário inserir uma chave de
YTNSHKVEFXRBAUQZCLWDMIPGJO
e um plaintext de
HELLO
:
$ ./substitution YTNSHKVEFXRBAUQZCLWDMIPGJO
plaintext: HELLO
ciphertext: EHBBQ
Veja como o programa pode funcionar se o usuário fornecer uma chave de VCHPRZGJNTLSKFBDQWAXEUYMOI
e um texto simples de hello, world
:
$ ./substitution VCHPRZGJNTLSKFBDQWAXEUYMOI
plaintext: hello, world
ciphertext: jrssb, ybwsp
Observe que nem a vírgula nem o espaço foram substituídos pelo cifrador. Apenas substitua os caracteres alfabéticos! Observe também que o caso da mensagem original foi preservado. Letras minúsculas permanecem minúsculas e letras maiúsculas permanecem maiúsculas.
Se os caracteres na chave em si são maiúsculos ou minúsculos, não importa. Uma chave de VCHPRZGJNTLSKFBDQWAXEUYMOI
é funcionalmente idêntica a uma
chave de vchprzgjntlskfbdqwaxeuymoi
(assim como, aliás,
VcHpRzGjNtLsKfBdQwAxEuYmOi
).
E se um usuário não fornecer uma chave válida? O programa deve explicar com uma mensagem de erro:
$ ./substitution ABC
Key must contain 26 characters.
Ou se o usuário não colaborar, não fornecendo nenhum argumento de linha de comando? O programa deve lembrar o usuário como usar o programa:
$ ./substitution
Usage: ./substitution key
Ou realmente, realmente não coopera, fornecendo muitos argumentos de linha de comando? O programa também deve lembrar o usuário de como usar o programa:
$ ./substitution 1 2 3
Usage: ./substitution key
Demo
Especificação
Projete e implemente um programa, substitution
, que
criptografa mensagens usando um cifra de substituição.
- Implemente seu programa em um arquivo chamado
substitution.c
em um diretório chamadosubstitution
. - Seu programa deve aceitar um único argumento de linha de comando, a chave a ser usada para a substituição. A chave em si deve ser insensível a maiúsculas e minúsculas, portanto, se algum caractere na chave estiver em maiúscula ou minúscula, isso não afetará o comportamento do seu programa.
- Se o seu programa for executado sem argumentos de linha de comando ou com mais de um argumento
de linha de comando, seu programa deve imprimir uma mensagem de erro de sua escolha (com
printf
) e retornar demain
um valor de1
(que tende a significar um erro) imediatamente. - Se a chave for inválida (por não conter 26 caracteres, conter qualquer caractere que não seja
um caractere alfabético, ou não conter cada letra exatamente uma vez), seu programa deve imprimir uma mensagem
de erro de sua escolha (com
printf
) e retornar demain
um valor de1
imediatamente. - Seu programa deve exibir
plaintext:
(sem uma nova linha) e, em seguida, solicitar ao usuário umastring
de texto simples (usandoget_string
). - Seu programa deve exibir
ciphertext:
(sem uma nova linha) seguido do texto cifrado correspondente ao texto simples fornecido, com cada caractere alfabético do texto simples substituído pelo caractere correspondente no texto cifrado; caracteres não alfabéticos devem ser exibidos inalterados. - Seu programa deve preservar a caixa: letras maiúsculas devem permanecer letras maiúsculas; letras minúsculas devem permanecer letras minúsculas.
- Após a exibição do texto cifrado, você deve imprimir uma nova linha. Seu programa deve então
sair, retornando
0
a partir demain
.
Você pode achar uma ou mais funções declaradas em ctype.h
úteis, conforme manual.cs50.io.
Como Testar o Seu Código
Execute o código abaixo para avaliar a correção do seu código usando o check50
. Mas certifique-se de compilar e testá-lo você mesmo
também!
check50 cs50/problems/2024/x/substitution
Execute o comando abaixo para avaliar o estilo do seu código usando style50
.
style50 substitution.c
Como Usar debug50
Procurando executar o debug50
? Você pode fazê-lo da
seguinte forma, depois de compilar seu código com sucesso usando o make
,
debug50 ./substitution KEY
onde KEY
é a chave que você dá como argumento de
linha de comando para o seu programa. Note que ao executar
debug50 ./substitution
Isso (idealmente!) fará com que o programa termine solicitando uma chave ao usuário.
Como Enviar
No seu terminal, execute abaixo para enviar seu trabalho.
submit50 cs50/problems/2024/x/substitution