Java :)
Exercício D Os serviços secretos da Universidade de Coimbra receberam via
email a seguinte mensagem encriptada:
mamfcjkm ayzvojáfagvm é i pojxge namgaptayk qu gedlx o tihi i pojxge taywlkwcj ho ghuwhijiçãu
Receberam também uma chave de desencriptação por outra via. Esta chave consiste
numa matriz de números e num algoritmo que permite desencriptar a mensagem,
usando a chave recebida. A chave é:
11 9 7 14 3 26 23 4 1 21 5 20 10 25 22 16 18 15 13 6 12 17 8 2 19 24
6 15 7 14 23 3 16 21 10 9 20 17 18 1 24 26 2 4 12 8 5 11 25 19 13 22
9 17 7 13 14 23 3 26 2 20 22 5 12 1 21 15 25 18 24 6 16 8 4 10 11 19
3 19 17 8 15 6 1 24 25 14 2 10 16 23 7 11 12 5 13 18 21 26 9 4 22 20
9 16 6 17 13 12 23 20 25 4 24 15 10 19 21 7 18 8 22 26 5 1 14 2 11 3
O algoritmo é descrito pelos seguintes passos:
1. Considerar como palavras as sequências de caracteres delimitada por 1 espaço;
2. Para cada palavra, identificar a 1ª vogal;
3. Com base na 1ª vogal identificada seleccionar uma linha da matriz, ou seja uma sub-‐‑
chave:
a) A vogal “a” permite seleccionar a 1ª linha;
b) A vogal “e” permite seleccionar a 2ª linha;
c) A vogal “i” permite seleccionar a 3ª linha;
d) A vogal “o” permite seleccionar a 4ª linha;
e) A vogal “u” permite seleccionar a 5ª linha.
4. Para cada palavra aplicar a sub-‐‑chave identificada da seguinte forma:
a) Para cada caractere calcular o seu código Unicode
b) Subtrair 96 ao código calculado
c) Se o resultado da subtração for um número no intervalo [1,26] então: Obter o
índice (posição) na sub-‐‑chave cujo valor iguala o resultado da subtração.
Somar 1 ao valor do índice e guardar o valor resultante.
d) Senão: Simplesmente guardar o resultado da subtração
e) Finalmente, para obter o caractere desencriptado basta:
i. Voltar a somar 96 ao código guardado em c) ou d)
ii. Converter o resultado da soma num caractere Unicode
Implemente o algoritmo descrito e desencripte a mensagem recebida pelos serviços
secretos da UC. Note que deve retirar os espaços extra por forma a delimitar de forma
adequada as palavras (neste caso, não deve usar nenhuma função já existente para
remover os espaços extra). Na página seguinte encontra um exemplo de aplicação do
algoritmo.
exemplo
Exemplo
Imagine que pretende desencriptar a palavra “duãu”.
Temos uma única palavra e o passo seguinte será identificar a 1ª vogal, que neste caso é
“u”. De seguida temos que seleccionar a sub-‐‑chave na matriz chave. Para a vogal “u” a
sub-‐‑chave corresponde à ultima linha da matriz:
9 16 6 17 13 12 23 20 25 4 24 15 10 19 21 7 18 8 22 26 5 1 14 2 11 3
Uma vez identificada a sub-‐‑chave, vamos considerar cada caractere individualmente.
Para cada um calculamos o seu código Unicode e subtraímos 96. Então para o 1º
caractere (“d”) temos que o seu código é 100, subtraindo 96 ficamos com 4. Como o
resultado da subtração está no intervalo 1-‐‑26 então vamos procurar o índice
correspondente ao valor 4 na sub-‐‑chave. Chegamos à conclusão que o índice para o
valor 4 é o 9. Somamos 1 e obtemos 10.
Valores 9 16 6 17 13 12 23 20 25 4 24 15 10 19 21 7 18 8 22 26 5 1 14 2 11 3
Índice 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
O passo seguinte é somar 96 a 10 e transformar o código Unicode no caractere
correspondente. Neste caso temos que 96 + 10 = 106 é o caractere correspondente é “j”.
Agora repetimos o mesmo processo para os outros caracteres. Para “u” obtemos o
código Unicode 117, subtraindo 96 ficamos com o valor 21, cujo índice correspondente é
o 14. Somando 1 a 14 e finalmente 96 obtemos o código Unicode 111, ou seja o caractere
“o”.
O caractere “ã” é um caso especial pois subtraindo 96 ao seu código Unicode não
resulta num número entre 1 e 26 (resulta em 227-‐‑96=131). Consequentemente e de novo
somado 96 e não sofre qualquer desencriptação. Finalmente temos de novo o caractere
“u”, que como vimos anteriormente resulta no caractere “o” desencriptado. Então para
a string “duãu” temos a string desencriptada “joão”.
Let's code:
public class ExercicioD
{
public static void main(String[] args)
{
int[][] matrix = { {11,9,7,14,3,26,23,4,1,21,5,20,10,25,22,16,18,15,13,6,12,17,8,2,19,24} ,
{6,15,7,14,23,3,16,21,10,9,20,17,18,1,24,26,2,4,12,8,5,11,25,19,13,22} ,
{9,17,7,13,14,23,3,26,2,20,22,5,12,1,21,15,25,18,24,6,16,8,4,10,11,19} ,
{3,19,17,8,15,6,1,24,25,14,2,10,16,23,7,11,12,5,13,18,21,26,9,4,22,20} ,
{9,16,6,17,13,12,23,20,25,4,24,15,10,19,21,7,18,8,22,26,5,1,14,2,11,3} };
String entrada = " mamfcjkm ayzvojáfagvm é i pojxge namgaptayk qu gedlx o tihi i pojxge taywlkwcj ho ghuwhijiçãu";
String[] temp = entrada.split(" "); // separamos as palavras da mensagem a partir do espaço.
char[] vogais = {'a', 'e', 'i', 'o', 'u'};
int min = 0, resletra = 0, pos = 0, validacao = 0;
String palavra = " "; char letra;
for (int i = 0; i < temp.length; i++ )
{
palavra = temp[i];
for (int j = 0; j < palavra.length(); j++)
{
validacao = 0;
for (int k = 0; k < 5 ; k++)
{
if (palavra.charAt(j) == vogais[k])
{
min = k;
validacao = 1;
}
}
if (validacao == 1)
{
break;
}
}
for (int l = 0; l < palavra.length() ; l++)
{
letra = palavra.charAt(l);
resletra = (int) letra;
resletra = resletra - 96;
if (resletra >= 1 && resletra <= 26)
{
for(int x = 0; x < 26; x++)
{
if(matrix[min][x] == resletra)
{
pos = x;
}
}
resletra = pos + 1;
}
resletra = resletra + 96;
System.out.print((char) resletra);
}
System.out.print(" "); }
}
}
email a seguinte mensagem encriptada:
mamfcjkm ayzvojáfagvm é i pojxge namgaptayk qu gedlx o tihi i pojxge taywlkwcj ho ghuwhijiçãu
Receberam também uma chave de desencriptação por outra via. Esta chave consiste
numa matriz de números e num algoritmo que permite desencriptar a mensagem,
usando a chave recebida. A chave é:
11 9 7 14 3 26 23 4 1 21 5 20 10 25 22 16 18 15 13 6 12 17 8 2 19 24
6 15 7 14 23 3 16 21 10 9 20 17 18 1 24 26 2 4 12 8 5 11 25 19 13 22
9 17 7 13 14 23 3 26 2 20 22 5 12 1 21 15 25 18 24 6 16 8 4 10 11 19
3 19 17 8 15 6 1 24 25 14 2 10 16 23 7 11 12 5 13 18 21 26 9 4 22 20
9 16 6 17 13 12 23 20 25 4 24 15 10 19 21 7 18 8 22 26 5 1 14 2 11 3
O algoritmo é descrito pelos seguintes passos:
1. Considerar como palavras as sequências de caracteres delimitada por 1 espaço;
2. Para cada palavra, identificar a 1ª vogal;
3. Com base na 1ª vogal identificada seleccionar uma linha da matriz, ou seja uma sub-‐‑
chave:
a) A vogal “a” permite seleccionar a 1ª linha;
b) A vogal “e” permite seleccionar a 2ª linha;
c) A vogal “i” permite seleccionar a 3ª linha;
d) A vogal “o” permite seleccionar a 4ª linha;
e) A vogal “u” permite seleccionar a 5ª linha.
4. Para cada palavra aplicar a sub-‐‑chave identificada da seguinte forma:
a) Para cada caractere calcular o seu código Unicode
b) Subtrair 96 ao código calculado
c) Se o resultado da subtração for um número no intervalo [1,26] então: Obter o
índice (posição) na sub-‐‑chave cujo valor iguala o resultado da subtração.
Somar 1 ao valor do índice e guardar o valor resultante.
d) Senão: Simplesmente guardar o resultado da subtração
e) Finalmente, para obter o caractere desencriptado basta:
i. Voltar a somar 96 ao código guardado em c) ou d)
ii. Converter o resultado da soma num caractere Unicode
Implemente o algoritmo descrito e desencripte a mensagem recebida pelos serviços
secretos da UC. Note que deve retirar os espaços extra por forma a delimitar de forma
adequada as palavras (neste caso, não deve usar nenhuma função já existente para
remover os espaços extra). Na página seguinte encontra um exemplo de aplicação do
algoritmo.
exemplo
Exemplo
Imagine que pretende desencriptar a palavra “duãu”.
Temos uma única palavra e o passo seguinte será identificar a 1ª vogal, que neste caso é
“u”. De seguida temos que seleccionar a sub-‐‑chave na matriz chave. Para a vogal “u” a
sub-‐‑chave corresponde à ultima linha da matriz:
9 16 6 17 13 12 23 20 25 4 24 15 10 19 21 7 18 8 22 26 5 1 14 2 11 3
Uma vez identificada a sub-‐‑chave, vamos considerar cada caractere individualmente.
Para cada um calculamos o seu código Unicode e subtraímos 96. Então para o 1º
caractere (“d”) temos que o seu código é 100, subtraindo 96 ficamos com 4. Como o
resultado da subtração está no intervalo 1-‐‑26 então vamos procurar o índice
correspondente ao valor 4 na sub-‐‑chave. Chegamos à conclusão que o índice para o
valor 4 é o 9. Somamos 1 e obtemos 10.
Valores 9 16 6 17 13 12 23 20 25 4 24 15 10 19 21 7 18 8 22 26 5 1 14 2 11 3
Índice 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
O passo seguinte é somar 96 a 10 e transformar o código Unicode no caractere
correspondente. Neste caso temos que 96 + 10 = 106 é o caractere correspondente é “j”.
Agora repetimos o mesmo processo para os outros caracteres. Para “u” obtemos o
código Unicode 117, subtraindo 96 ficamos com o valor 21, cujo índice correspondente é
o 14. Somando 1 a 14 e finalmente 96 obtemos o código Unicode 111, ou seja o caractere
“o”.
O caractere “ã” é um caso especial pois subtraindo 96 ao seu código Unicode não
resulta num número entre 1 e 26 (resulta em 227-‐‑96=131). Consequentemente e de novo
somado 96 e não sofre qualquer desencriptação. Finalmente temos de novo o caractere
“u”, que como vimos anteriormente resulta no caractere “o” desencriptado. Então para
a string “duãu” temos a string desencriptada “joão”.
Let's code:
public class ExercicioD
{
public static void main(String[] args)
{
int[][] matrix = { {11,9,7,14,3,26,23,4,1,21,5,20,10,25,22,16,18,15,13,6,12,17,8,2,19,24} ,
{6,15,7,14,23,3,16,21,10,9,20,17,18,1,24,26,2,4,12,8,5,11,25,19,13,22} ,
{9,17,7,13,14,23,3,26,2,20,22,5,12,1,21,15,25,18,24,6,16,8,4,10,11,19} ,
{3,19,17,8,15,6,1,24,25,14,2,10,16,23,7,11,12,5,13,18,21,26,9,4,22,20} ,
{9,16,6,17,13,12,23,20,25,4,24,15,10,19,21,7,18,8,22,26,5,1,14,2,11,3} };
String entrada = " mamfcjkm ayzvojáfagvm é i pojxge namgaptayk qu gedlx o tihi i pojxge taywlkwcj ho ghuwhijiçãu";
String[] temp = entrada.split(" "); // separamos as palavras da mensagem a partir do espaço.
char[] vogais = {'a', 'e', 'i', 'o', 'u'};
int min = 0, resletra = 0, pos = 0, validacao = 0;
String palavra = " "; char letra;
for (int i = 0; i < temp.length; i++ )
{
palavra = temp[i];
for (int j = 0; j < palavra.length(); j++)
{
validacao = 0;
for (int k = 0; k < 5 ; k++)
{
if (palavra.charAt(j) == vogais[k])
{
min = k;
validacao = 1;
}
}
if (validacao == 1)
{
break;
}
}
for (int l = 0; l < palavra.length() ; l++)
{
letra = palavra.charAt(l);
resletra = (int) letra;
resletra = resletra - 96;
if (resletra >= 1 && resletra <= 26)
{
for(int x = 0; x < 26; x++)
{
if(matrix[min][x] == resletra)
{
pos = x;
}
}
resletra = pos + 1;
}
resletra = resletra + 96;
System.out.print((char) resletra);
}
System.out.print(" "); }
}
}
Comentários