Sei sulla pagina 1di 8

Álgebra Lineal (Ingeniería Informática Práctica 8 pág.

Práctica 8

Aritmética modular
En Matemática Discreta has estudiado la relación de congruencia módulo .
Ya sabes que ℤ = {0, 1, 2, … , − 1}
La función mod de Matlab sirve para trabajar en aritmética modular. Por ejemplo: mod(26, 3) = 2
Podemos observar, viendo la tabla de multiplicar de ℤ en la tabla 1, que todos los números no nulos
de ℤ son inversibles: para cada uno de ellos siempre hay otro que multiplicado por él da como
resultado la unidad. Así, el inverso de 2 módulo 5 es el 3 ya que 3 × 2 = 6 = 1(mod 5) .

0 1 2 3 4

0 0 0 0 0 0

1 0 1 2 3 4

2 0 2 4 1 3

3 0 3 1 4 2

4 0 4 3 2 1

Tabla 1: Tabla de multiplicar módulo 5

Sin embargo, como podemos ver con la tabla de multiplicar en ℤ mostrada en la tabla 2, no todos los
números no nulos en ℤ son inversibles.

× 0 1 2 3 4 5

0 0 0 0 0 0 0

1 0 1 2 3 4 5

2 0 2 4 0 2 4

3 0 3 0 3 0 3

4 0 4 2 0 4 2

5 0 5 4 3 2 1

Tabla 2: Tabla de multiplicar en ℤ

El 5 sí es inversible ya que 5 × 5 = 25 = 1(mod 6 ) y su inverso es el propio 5. Sin embargo, 2 no es


inversible, ya que no hay ningún número entre 0 y 5 que multiplicado por 2 dé como resultado 1, como
podemos ver en la tabla 2.
Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 2
Ejercicio 1 (ordenador)
Para averiguar si un número es inversible o no y, en caso afirmativo, calcular el inverso, se pueden
probar todas las posibilidades hasta dar con el inverso de un número x módulo m si es que existe.
Este método se llama método de la fuerza bruta.
Así, dado un número por ejemplo 120 y un módulo, por ejemplo, 131, el método de la fuerza bruta
consiste en comprobar si hay o no un número entre 0 y 130 que multiplicado por 120 nos dé 1 (módulo
131). En caso afirmativo, el número será inversible y podremos decir quién es su inverso. En caso
negativo, el número no será inversible.
Haz un programa que haga lo anterior: pida un número , pida un módulo y diga si es inversible o
no y en caso afirmativo quién es su inverso.
Por ejemplo, comprueba que para x = 120 y para m = 131 , el programa devuelve 119. Efectivamente
podemos ver que 120 × 119 = 1 (mod 131 ) .

Observación: Es fácil saber cuándo un número x es inversible en ℤ ya que puede demostrarse (visto
en Matemática Discreta) que basta con que sea primo relativo con el módulo m , o lo que es lo mismo
que el máximo común divisor de ambos sea 1, es decir: mcd ( m , x ) = 1 .
En el caso particular de que el módulo m sea un número primo, todos los elementos no nulos de ℤ
serán primos relativos con él y, por lo tanto, serán inversibles.
Matlab trae incorporada una función que calcula el máximo común divisor de dos números: la función
“gcd” (greatest common divisor). Así, por ejemplo: (2, 9) = 1

Ejemplo
Calcular el valor de la siguiente expresión módulo 31:
(7 − 2) (1 − 5) (23 + 4)
(2 − 3)(5 + 4)
Veamos:
(7 − 2) (1 − 5) (23 + 4) = 5 × (−4) × 27 = −540 = 18 ( 31)
(2 − 3)(5 + 4) = −9 = 22
Por lo tanto:
( !") (#! ) ("$%&) #'
= ""
("!$)( %&)

El inverso de 22 módulo 31 es 24 (calculado usando el ejercicio 1) así que:


18
= 22!# . 18 = 24. 18 = 432 = 29 ( 31)
22
Ejercicio 2 (lápiz y papel, aunque te puedes ayudar de Matlab para las operaciones)
a) Calcular el valor de la siguiente expresión módulo 31:
Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 3
(5 − 30). 20
23. 4 +
15
b) Calcular el valor de la siguiente expresión módulo 5:
2 13
+ + 22. 3
3 4
Inversa de una matriz módulo m

Sabemos que una matriz ) es inversible si y sólo si tiene determinante no nulo y que su inversa viene
#
dada por: )!# = |+| (, -())).

Por ejemplo, la inversa de una matriz de orden 2 se calcula de la siguiente forma:

a b  1  d − b
Si A =   y A ≠ 0 ⇒ A −1 =  
c d  A − c a 

Cuando trabajamos módulo también podremos aplicar la fórmula anterior pero será necesario que
#
|)| sea un número inversible módulo (porque aparece ) , por lo tanto, el |)| debe ser primo
|+|

relativo con . De esa forma existirá:

1
= |)|!# ( )
|)|

 4 2
Por ejemplo, la matriz: A =   no será inversible módulo 15 ya que el determinante vale 10 que
1 3
no es primo relativo con el módulo: el 10 no tiene inverso módulo 15.

 4 2
Sin embargo, la matriz A =   sí que será inversible módulo 7 ya que: A = 10 = 3 (mod 7) y 3
1 3
tiene inverso módulo 7 que es el 5 ya que: 3 × 5 = 1 (mod 7 ) .

 103 − 102 
En la aritmética habitual: A =  −1
−1
4 

 10 10 

La inversa módulo 7 se calcularía de la siguiente forma:

 3 − 102  1  3 − 2   3 − 2   15 − 10   1 4 
A −1 =  10 4 
 =   = 5  =   =   (mod 7)
 10 10  10  − 1 4   − 1 4   − 5 20   2 6 
−1

Ya que el inverso de 3 módulo 7 es 5. Podemos comprobar con Matlab cómo: A A −1 = I (mod 7) .


Bastaría ejecutar:
A=[4 2;1 3];B=[1 4;2 6];
mod(A*B, 7)
Matlab devuelve la matriz identidad, como tenía que ser.
Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 4
Ejercicio 3 (lápiz y papel)
1 1
Sea / = 0 1 ¿será inversible módulo 31? En caso afirmativo calcular su inversa.
4 7
23 10
(Sol. / !# =0 1)
9 21

Ejercicio 4 (lápiz y papel)

 2 1 3
 
Calcular la inversa de A =  2 1 2  módulo 5
0 4 1
 

Cifrado de imágenes digitales

Vamos a cifrar una imagen digital con escala de grises entre 0 y 255. El método que vamos a ver a
continuación está inspirado en un trabajo de Lester Hill publicado en 1929. Se sigue investigando
actualmente en este método de cifrado proponiendo distintos autores algunas variantes, como puedes
ver por Internet. Basta con escribas en un buscador: image encryption Hill.

Supongamos que indicamos por A a la matriz correspondiente a la imagen original. Vamos a coger los
niveles de gris de dos en dos, empezando en la esquina superior izquierda de la matriz y moviéndonos
de izquierda a derecha y de arriba a abajo: el primer bloque será {a11 , a12 }, el segundo bloque será
{a13 , a14 }, y así sucesivamente.
Cada bloque de dos niveles de gris de la imagen original se va a transformar en otros dos números
mediante un producto matricial con una matriz secreta K de tamaño 2 × 2 (esto por supuesto se puede
cambiar y elegir como queramos).

Supongamos que el bloque que estamos procesando es: {103, 101} que se corresponde con los dos
primeros niveles de gris de la imagen ), es decir: )(1,1) = 103, )(1,2) = 101

 21 35 
Supongamos que elegimos como clave la matriz secreta es: K =  
18 79 

103   21 35  103   5698 


Hacemos el producto matricial: K   =     =  
 101   18 79  101   9833 

Como vemos los números {5698, 9833} exceden el valor 255 (máximo nivel de gris) y por lo tanto no
se corresponden con niveles de gris de una imagen. Para conseguir que el resultado proporcione
números entre 0 y 255, tomaremos módulo 256:

 21 35  103   5698   66 
    =   =   (mod 256)
18 79  101   9833  105 
Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 5
Ahora el píxel que tenía nivel de gris 103 lo pondremos a 66 en la imagen cifrada y el píxel de al lado
que tenía nivel de gris 101 será puesto a 105. Es decir, si 2 es la imagen cifrada: 2(1,1) = 66,
2(1,2) = 105. De esta misma forma razonaremos con los dos píxeles siguientes, es decir el píxel
)(1,3), )(1,4). Y así sucesivamente.

De esta manera, vamos transformando cada par de valores de gris consecutivos por otro par de valores
de gris diferentes. De esta forma conseguimos cifrar la imagen. La imagen cifrada obtenida en este
caso se muestra en a continuación:

Fig. 1. Imagen cifrada


Observa que descifrar es sencillo. Porque:
103   66   66  103 
Si K   =   (mod 256) ⇒ K −1   =   (mod 256)
101  105  105  101 
Así, a partir de los niveles de gris cifrados {66, 105}, se podrán recuperar los niveles de gris
originales: {103, 101} siempre que se conozca la clave 4 que se usó para el cifrado.
Ejercicio 5 (ordenador)

Tu trabajo consistirá en tomar la imagen “matricial.png” de la página web y descifrarla sabiendo que
 21 35 
hemos empleado en el cifrado la matriz K =   y módulo 256.
18 79 

Necesitarás averiguar antes la inversa de 4 módulo 256.

AYUDA: Si pones A=imread(‘matricial.png’);

) será una matriz uint8 (como puedes ver con la orden whos A). Pues bien, para poder trabajar con
normalidad con los elementos de ) debes cambiar el tipo a double. Por eso las primeras órdenes del
código que debes hacer serán:

A=imread('matricial.png');
A=double(A);

Supongamos que 2 es una matriz del mismo tamaño que la original que usas para almacenar los
niveles de gris descifrados. Esa matriz 2 será double. Pues bien para mostrarla por pantalla como una
imagen es obligatorio convertirla antes en uint8, es decir, debes escribir:

imshow(uint8(B))
Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 6
67 249
(Sol. La matriz inversa de 4 es 4 !# = 0 1 ó . 256 )
150 209

Reparto de secretos: esquema de Shamir


Existen ocasiones donde una información secreta no es deseable que esté en manos de una sola
persona. Puede interesar que varias personas posean parte de dicha información y que sólo se consiga
recuperar la información secreta si juntamos a varias de estas personas. Por ejemplo, una empresa
puede que le interese que ningún empleado de la misma posea la clave que abre la caja fuerte. Por el
contrario, puede repartir entre 6 empleados, por ejemplo, parte de la información, de forma que para
conseguir la clave de la caja fuerte tengan que juntarse al menos 3 de los 6 empleados.
Este esquema se conoce con el nombre de “protocolo de Shamir”, ya que fue propuesto por el
criptógrafo Shamir del M.I.T. (Massachusetts Institute of Technology) en 1979 en un artículo llamado
“How to share a secret”. Shamir es uno de los autores del famoso sistema de cifrado RSA.
El esquema de reparto de secretos también se conoce con el nombre de esquema umbral ( n , t ) (se
necesitan al menos t participantes de los n que hay en total para poder recuperar la clave secreta).
La idea es muy sencilla. Supongamos que t = 3 y n = 6 . Eso quiere decir que hay 6 participantes y
que sólo al juntar al menos a 3 de ellos es posible recuperar el secreto.
Supongamos que la clave secreta es s = 1234 . El distribuidor del secreto escogerá dos números
cualesquiera, que indicaremos a 1 y a 2 , con los que construirá el polinomio de segundo grado:

P ( x) = s + a1 x + a 2 x 2

Supongamos que a1 = 166 y que a 2 = 94 , entonces:

P ( x) = s + a1 x + a 2 x 2 = 1234 + 166 x + 94 x 2
Calculamos 6 puntos cualesquiera del polinomio del polinomio, por ejemplo:
(1, 1494), (3, 2578), (4, 3402), (6, 5614), (8, 8578), (11, 14434)
El distribuidor reparte aleatoriamente estos puntos entre sus seis empleados de confianza. Sólo cuando
se junten al menos tres de ellos tendremos datos suficientes para poder construir el polinomio P (x ) .
Una vez construido el polinomio será fácil recuperar el secreto s ya que: s = P (0)
Supongamos que al empleado nº 1 se le da el primer punto, al empleado nº 2 el segundo punto, y así en
adelante.

Como el polinomio desconocido tiene 3 coeficientes a determinar hará falta un mínimo de tres puntos
para poder determinarlo. Ahora bien, si se juntan tres o más sí que podrán reconstruir el polinomio.
Por ejemplo, supongamos que se juntan los empleados 2, 3, 5 y 6. El sistema a resolver sería:
Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 7

s + 3 a1 + 9 a 2 = 2578 
s + 4 a1 + 16 a 2 = 3402 

s + 8 a1 + 64 a 2 = 8578 
s + 11a1 + 121 a 2 = 14434

Comprueba con Matlab/Octave, empleando la orden rank, que r ( A) = r ( A* ) = 3 = nº de incógnitas, por

lo tanto, el sistema tiene solución única. Además, como r ( A* ) = 3 , cualesquiera tres ecuaciones nos
sirven para obtener la solución del sistema (hay una ecuación redundante). Usando la orden A\B,
comprueba que se obtiene la solución correcta.
La idea de Shamir es sencilla, el secreto se hace coincidir con el término independiente del polinomio
y el grado del polinomio depende del número mínimo de empleados que deben juntarse para poder
obtenerlo.
Para un esquema (6, 3) como el anterior, el polinomio debía ser de grado 2, para que el polinomio a
determinar tenga 3 incógnitas y hagan falta como mínimo 3 puntos para poder determinarlo.

Ejercicio 6 (lápiz y papel; ordenador)


Consideremos un esquema de reparto de secretos (5, 4), donde los puntos repartidos han sido:

Nº empleado 1 2 3 4 5

Punto (-1, 5) (1/2, 115/2) (1, 73) (2, 200) (3/2, 115)

Con lápiz y papel averiguar el secreto, a través de planteamiento y la resolución de los sistemas de
ecuaciones lineales correspondientes, en los siguientes casos:

a) si se juntan los empleados 1, 2, 4 y 5


b) si se juntan los empleados 2, 3, 4 y 5.
Te puedes ayudar de Matlab para resolver los sistemas.

Reparto de una imagen secreta

Podríamos aplicar el método de reparto de secretos de Shamir, estudiado anteriormente, para el reparto
de una imagen digital. Sin embargo, vamos a hacer un esquema sencillo de reparto de secretos (2, 2)
con otro método diferente. La imagen original se muestra a la izquierda de la figura 3 y es de tamaño
256 × 256.

El dueño del secreto elegirá una matriz clave K inversible módulo 256 (bastará con que tenga
determinante impar) y la descompondrá en la suma de dos matrices: una K 1 formada por números

aleatorios entre 0 y 255 y la otra K 2 tal que: K = K 1 + K 2 (mod 256)


Álgebra Lineal (Ingeniería Informática Práctica 8 pág. 8
Supongamos que la matriz K es de orden 4, por ejemplo. Entonces, para cada bloque 4× 4 de la
imagen original, que indicaremos por A , haremos los siguientes cálculos:

B1 = K 1 A (mod 256)
B 2 = K 2 A (mod 256)

El bloque A de la imagen original se sustituye por B1 en la sombra 1 (imagen que proporcionaremos


al participante 1) y por B2 en la sombra 2 (imagen que proporcionaremos al participante 2).
Razonando de esta forma en cada bloque 4× 4 de la imagen original se obtienen los resultados de la
figura 2.

Figura 2: Imagen original y las dos sombras.

Los dos participantes conocerán la matriz K solamente y sus respectivas sombras. Cuando se junten
los dos podrán recuperar la imagen secreta ya que:

B1 + B2 = K 1 A + K 2 A = ( K 1 + K 2 ) A = K A ⇒ A = K −1 ( B1 + B2 ) (mod 256)

Ejercicio 7 (ordenador)

En Moodle encontrarás las imágenes sombra1.png y sombra2.png. Ambas imágenes son las dos
sombras del esquema (2, 2) anterior aunque para otra imagen secreta. La matriz clave empleada fue:

 3 121 206 47 
 
 45 0 155 25 
K =
164 97 253 135 
 
 53 41 211 0 
 

Esta matriz tiene la ventaja de ser autoinversible módulo 256, es decir, su inversa coincide con ella
misma, como puedes comprobar con Matlab con la orden mod(K*K, 256). Verás que te devuelve la
matriz identidad. Debes recuperar la imagen secreta a partir de las dos sombras.

Potrebbero piacerti anche