Decripte!
Criptografia é uma área da Ciência da Computação que estuda os métodos de comunicação secreta que transformam uma mensagem (plaintext) em uma mensagem cifrada (ciphertext), de forma que apenas o real receptor da mensagem seja capaz de restaurar o seu conteúdo original. O ato de transformar uma mensagem em uma mensagem cifrada é chamado de encriptação e o ato contrário é chamado de decriptação. Um método bastante simples de encriptação é o método Twist, que requer que ambos remetente e receptor combinem uma chave secreta k, que deve ser um inteiro positivo.
O método Twist utiliza quatro vetores: plaintext, ciphertext, plaincode e ciphecode; sendo plaintext e ciphertext vetores de caracteres e plaincode e ciphercode vetores de inteiros. Todos os vetores são de tamanho n, onde n é o tamanho da mensagem a ser encriptada. Os vetores são iniciados na posição zero, de forma que os seus elementos são numerados de 0 a n-1. Para este problema, as mensagens apenas conterão letras minúsculas, pontos e underscores (representando espaços).
A mensagem a ser encriptada é armazenada no vetor plaintext. Dada a chave k, a encriptação é feita da seguinte forma. Primeiro, as letras em plaintext são convertidas em códigos inteiros que são armazenados em plaincode. A conversão é feita da seguinte forma: ‘_’ = 0, ‘a’ = 1, ‘b’ = 2, ..., ‘z’ = 26 e ‘.’ = 27. Depois, cada código em plaincode é convertido em um código encriptado em ciphercode através da seguinte fórmula: para todo i de 0 a n-1,
ciphercode[i] = (plaincode[(k*i) mod n] - i) mod 28.
(Aqui x mod y é o resto positivo da divisão de x por y. Por exemplo, 3 mod 7 = 3, 22 mod 8 = 6 e -1 mod 28 = 27. Você pode usar o operador ‘%’ do C, desde que você some y caso o resultado seja negativo.) Por último, os códigos obtidos em ciphercode são convertidos novamente em letras (pela mesma regra descrita anteriormente) e são armazenadas em ciphertext.
A encriptação pelo método Twist da mensagem ‘
cat’ com chave 5 é ilustrada na tabela a seguir:
Vetor |
[0] |
[1] |
[2] |
plaintext |
‘c’ |
‘a’ |
‘t’ |
plaincode |
3 |
1 |
20 |
ciphercode |
3 |
19 |
27 |
ciphertext |
‘c’ |
‘s’ |
‘.’ |
1. Tarefa
A sua tarefa é escrever um programa que decripta uma mensagem encriptada pelo método Twist. Por exemplo, dado o texto cifrado ‘
cs.’ e a chave 5, o seu programa deve dar como resposta o texto original ‘cat’.2. Entrada de Dados
O arquivo DECRYPT.IN conterá uma ou mais instâncias do problema, seguidas por uma linha contendo somente o número 0. Cada instância estará contida em uma linha do arquivo e consistirá de uma chave k, um espaço e a mensagem cifrada com tamanho n entre 1 e 70 caracteres. A chave k será um inteiro positivo menor ou igual a 300 tal que mdc(k, n) = 1.
Exemplo de Entrada
11 cbmowxbkg
5 edrykonnklupposembjnugujqwki
29 edcnkjyzmjrpianvbyzo
0
3. Saída de Dados
Para cada instância do arquivo de entrada, o arquivo DECRYPT.OUT deve conter uma linha contendo a mensagem original.
Exemplo de Saída
cachorro.
este_e_um_teste_muito_chato.
espero_que_funcione.