-
Notifications
You must be signed in to change notification settings - Fork 0
/
descifrado.m
62 lines (50 loc) · 2.08 KB
/
descifrado.m
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
function mensaje_des = descifrado(mensaje, publica, privada)
% Funcion que descifra un mensaje cifrado utilizando las claves privada y
% publica.
% Compruebo el mensaje introducido
if(~ischar(mensaje))
disp('Error [descifrado]: el mensaje introducido no es una cadena.');
mensaje_des = 0;
return;
end
% Compruebo el mensaje introducido
if(~ischar(publica))
disp('Error [descifrado]: la clave publica no es una cadena.');
mensaje_des = 0;
return;
end
% Compruebo el mensaje introducido
if(~ischar(privada))
disp('Error [descifrado]: la clave privada no es una cadena.');
mensaje_des = 0;
return;
end
privada = upper(privada);
privada = unique(privada,'stable');
% Dividimos el mensaje cifrado en bloques de longitud del mensaje /
% longitud de la clave privada.
tam_bloque = length(mensaje)/length(privada);
matriz = char(zeros(tam_bloque,length(privada))+'0');
bloque = '';
for i=1:length(privada)
bloque = mensaje(1:tam_bloque);
matriz(:,i)=bloque';
mensaje = erase(mensaje,bloque);
end
% Concatenamos verticalmente la clave privada ordenada para poder
% deshacer las permutaciones realizadas.
priv_ordenada = sort(privada);
matriz = vertcat(priv_ordenada,matriz);
% Utilizamos una matriz auxiliar para deshacer la permutación
matriz_desordenada = char(zeros(tam_bloque,length(privada))+'0');
for i=1:length(privada)
[~,columna] = find(matriz(1,:)==privada(i));
matriz_desordenada(:,i)=matriz(2:end,columna);
end
% Leemos la matriz por filas para deshacer la sustitucion realizada.
cadena_sustituida = reshape(matriz_desordenada',1,numel(matriz_desordenada));
% Obtenemos la matriz de cifrado utilizada a partir de la clave publica
matriz_descifrado = init_matrix(publica);
% Obtenemos el mensaje descifrado
mensaje_des = deshacer_sustitucion(matriz_descifrado,cadena_sustituida);
end