¿problema con la criptografia, aritmetica modular.?
resulta que estoy estudiando criptografia con la aritmetica modular.
tengo las letras de la A a la Z numeradas del 1 al 26.
segun lo que vi en internet, la mejor forma es multiplicar (o sumar, dividir, restar etc.) cada letra a codificar por un numero aleatorio, por lo cual, multiplico el valor de "S" que es 20, por 3.
s = 20
20*3 = 60
pero lo que yo quiero es que ese 60 sea un numero menor o igual a 26 para poder reemplazar a 60 por una letra diferente, de aqui la aritmetica modular:
60 mod 26 = 8.
pero luego cuando vaya a decodificar el mensaje, como se yo que 8 lo puedo convertir en 20, sabiendo que:
34 mod 26 = 8
osea, da el mismo resultado, como se yo si ese numero es 34 o 60?. segun lo que he pensado hasta el momento, me surgio la teoria de que si divido ese 34 por 3 (34/3), no me dara un numero entero sino decimal, pero quiero saber si en todos los casos se cumple esto o tengo que hacerlo de otra forma, para convertir ese 60 (o cualquier otro numero mayor a 26) en otro menor a 26 gracias por leer.
1 respuesta
- hace 1 décadaRespuesta preferida
Bien, ese es un problema clásico al querer encriptar (codificar) datos. Ciertos algoritmos son un camino de ida, pero no de vuelta.
Es como decir: Tengo 2 numeros, para hacer 1 solo numero los sumo, ej tengo 2 y 3, los sumo y tengo el 5, pero después querés volver a tener 2 numeros a partir de uno solo... y cuales son esos numeros??: 0+5, 1+4, 2+3, ...? Dado que todos ellos suman 5.
Tendrías que fijarte de crear alguna funcion matematica (llamemosle F), de manera que para codificar un numero A, aplicás F(A), y obtenes B, y luego para decodificar, aplicar INV_F(B) para obtener A nuevamente. (Llámese INV_F a la función inversa de F)
Vos querés, en este caso en particular, una funcion F cuyos valores de entrada y de salida (es decir, dominio e imagen) caigan en el rango [1-26]
Que tal esto?:
y = 27-x --> F(X) = 27-X
Luego, para encontrar la funcion inversa despejamos la ecuación en términos de la otra variable:
y+x = 27
x = 27-y --> INV_F(Y) = 27-Y
Entonces, para codificar:
Si A=1 --> F(A) = F(1) = 26 = Z
Si B=2 --> F(B) = F(2) = 25 = Y
Luego, para decodificar:
Si Z=26 --> INV_F(Z) = INV_F(26) = 1 = A
Si Y=25 --> INV_F(Y) = INV_F(25) = 2 = B
IMPORTANTE!!
Si realmente es NECESARIO utilizar la función módulo para encriptar/desencriptar, entonces podés usar la Función del César:
El Código de César dice que se asigna a cada letra (de la A a la Z, incluyendo Ñ) un número (de 1 a 26 y 0), así:
a=1
b=2
c=3
d=4
e=5
f=6
g=7
h=8
i=9
j=10
k=11
l=12
m=13
n=14
ñ=15
o=16
p=17
q=18
r=19
s=20
t=21
u=22
v=23
w=24
x=25
y=26
z=0
F(X) = (X+3) mod 27
INV_F(Y) = (Y+24) mod 27
Ejemplo:
--------
Encripto:
MAYO --> 13.1.26.16 ---[(X+3) mod 27]---> 16.4.2.19 --> ODBR
Desencripto:
ODBR --> 16.4.2.19 ---[(X+24) mod 27]---> 13.1.26.16 --> MAYO
Por si te quedaron dudas, se puede demostrar que INV_F es inversa de F. Sabiendo que si a un numero X le aplico F y luego le aplico INV_F entonces obtengo X nuevamente.
Demostracion:
INV_F( F(X) ) mod 27 =
INV_F( X+3 ) mod 27 =
[(X+3)+24] mod 27 =
(X+27) mod 27 = X
Verificación:
(X+27) mod 27 = X
1 + 27 = 28 -> 28 mod 27 = 1
2 + 27 = 29 -> 29 mod 27 = 2
3 + 27 = 30 -> 30 mod 27 = 3
...
Espero que te siva de ayuda.
Saludos desde Argentina,
Leo.
Fuente(s): Mis conocimientos Criptografía y Aritmética Modular (descargable en: http://foro.portalhacker.net/index.php/topic,67396...