Saltar ao contido

Exponenciación modular

Na Galipedia, a Wikipedia en galego.

A exponenciación modular é a exponenciación realizada sobre un módulo. É útil en informática, especialmente no campo da criptografía de clave pública, onde se usa tanto no intercambio de claves Diffie-Hellman como nas claves públicas/privadas RSA.[1]

A exponenciación modular é o resto cando un enteiro b (a base) elévase á potencia e (o expoñente) e se divide por un enteiro positivo m (o módulo); é dicir, , onde 0 ≤ c < m .

Por exemplo, dados b = 5, e = 3 e m = 13, dividindo 53 = 125 por 13 deixa un resto de c = 8. Escrito modularmente.

A exponenciación modular pódese realizar cun expoñente negativo atopando a inversa multiplicativa modular d de b módulo m usando o algoritmo de Euclides estendido. É dicir:

sería con .

Por exemplo pois sendo .

O cálculo da exponenciación modular é eficiente, mesmo para enteiros moi grandes. Por outra banda, é difícil calcular o logaritmo discreto modular, é dicir, atopar o expoñente e cando se dan b, c e m. Este comportamento de función unidireccional fai que a exponenciación modular sexa candidata para o seu uso en algoritmos criptográficos.

Método de módulo próximo

[editar | editar a fonte]

Este método usa a propiedade modular seguinte

(ab) mod m = [(a mod m) ⋅ (b mod m)] mod m.

Consiste en procurar a potencia de b máis próxima ao módulo m, calcular o módulo de e calculando a división enteira dos expoñentes transformamos a expresión orixinal con cifras moito menores.

Exemplo:

e e tamén
.

Por tanto .

Se a base é maior que o módulo pódese aplicar primeiro o módulo á base, por exemplo: .

Este método tamén podería aproximar a equivalencias negativas, por exemplo para , temos:

e ,
e por tanto

Método directo

[editar | editar a fonte]

O método máis directo de calcular un expoñente modular é calcular be e despois tomar este número módulo m. Co exemplo anterior temos:

Calculando 413 = 67 108 864. Tomando este valor módulo 497, a resposta c determínase que é 445.

Teña en conta que b ten só un díxito de lonxitude e que e só ten dous díxitos de lonxitude, mais o valor be é de 8 díxitos. E no caso de se non reducimos a base previamente temos unha cifra de 35 díxitos.

Método de memoria eficiente

[editar | editar a fonte]

Manter os números máis pequenos require operacións de redución modulares adicionais, mais o tamaño reducido fai que cada operación sexa máis rápida, aforrando tempo (así como memoria) en xeral.

Este algoritmo tamén fai uso da identidade

(ab) mod m = [(a mod m) ⋅ (b mod m)] mod m

En resumo, este algoritmo aumenta e′ nunha unidade ata que sexa igual a e. En cada paso multiplicando o resultado da iteración anterior, c, por b e realizando unha operación de módulo sobre o produto resultante, mantendo así o c resultante nun número enteiro pequeno.

Preséntase de novo o exemplo b = 4, e = 13 e m = 497. O algoritmo realiza a iteración trece veces:

(e′ = 1) c = (4 ⋅ 1) mod 497 = 4 mod 497 = 4
(e′ = 2) c = (4 ⋅ 4) mod 497 = 16 mod 497 = 16
(e′ = 3) c = (4 ⋅ 16) mod 497 = 64 mod 497 = 64
(e′ = 4) c = (4 ⋅ 64) mod 497 = 256 mod 497 = 256
(e′ = 5) c = (4 ⋅ 256) mod 497 = 1024 mod 497 = 30
(e′ = 6) c = (4 ⋅ 30) mod 497 = 120 mod 497 = 120
(e′ = 7) c = (4 ⋅ 120) mod 497 = 480 mod 497 = 480
(e′ = 8) c = (4 ⋅ 480) mod 497 = 1920 mod 497 = 429
(e′ = 9) c = (4 ⋅ 429) mod 497 = 1716 mod 497 = 225
(e′ = 10) c = (4 ⋅ 225) mod 497 = 900 mod 497 = 403
(e′ = 11) c = (4 ⋅ 403) mod 497 = 1612 mod 497 = 121
(e′ = 12) c = (4 ⋅ 121) mod 497 = 484 mod 497 = 484
(e′ = 13) c = (4 ⋅ 484) mod 497 = 1936 mod 497 = 445

A resposta final para c é polo tanto 445, como no método directo e o método de módulo próximo.

Método binario de dereita a esquerda

[editar | editar a fonte]

Un cuarto método reduce drasticamente o número de operacións para realizar a exponenciación modular, mantendo o mesmo uso de memoria que no método anterior. É unha combinación do método anterior e un principio máis xeral chamado exponenciación binaria.

En primeiro lugar, é necesario que o expoñente e se converta en notación binaria. É dicir, e pódese escribir como:

En tal notación, a lonxitude de e é n bits. ai pode tomar o valor 0 ou 1 para calquera i tal que 0 ≤ i < n . Por definición, an − 1 = 1 .

O valor be escribirse como:

A solución c é polo tanto:

Neste exemplo, a base b elévase ata o expoñente e = 13 . O expoñente é 1101 en binario. Hai catro díxitos binarios, polo que o bucle execútase catro veces, cos valores a0 = 1, a1 = 0, a2 = 1 e a3 = 1 .

Primeiro, inicializa o resultado a 1 e garda o valor de b na variable x:

e .
Paso 1) o bit 1 é 1, así que se estabelece
 ;
agora .
Paso 2) o bit 2 é 0, polo que non recalculamos R;
así .
Paso 3) o bit 3 é 1, así que recalculamos R
;
agora .
Paso 4) o bit 4 é 1, así que recalculamos R
 ;

Resultado igual que nos métodos anteriores.

Xeneralizacións

[editar | editar a fonte]

O m-ésimo termo de calquera secuencia recursiva constante (como os números de Fibonacci ou os números de Perrin) onde cada termo é unha función linear de k termos anteriores pódese calcular eficientemente módulo n calculando Am mod n, onde A é matriz compañeira k×k correspondente . Os métodos anteriores adáptanse facilmente a esta aplicación. Isto pódese usar para os test de primalidade de grandes números n, por exemplo.

  1. "Weak Diffie–Hellman and the Logjam Attack". weakdh.org. Consultado o 2019-05-03. 

Véxase tamén

[editar | editar a fonte]

Bibliografía

[editar | editar a fonte]

Outros artigos

[editar | editar a fonte]

Ligazóns externas

[editar | editar a fonte]