Criptografia e Segurança

Transcrição

Criptografia e Segurança
Criptografia e Segurança
Paulo J. Almeida
Departamento de Matemática da Universidade de Aveiro
18 de Julho de 2012
Conteúdo
1 Preliminares
1.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Vocabulário . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 História . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
4
6
2 Complexidade
12
2.1 Estimativas de tempo . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 P versus NP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 Criptografia Simétrica
3.1 Introdução . . . . . . . . . . . . . . . . . . . . .
3.2 Cifra de Substituição . . . . . . . . . . . . . . .
3.3 Criptoanálise clássica . . . . . . . . . . . . . . .
3.4 Criptoanálise da Cifra de Substituição . . . . .
3.5 Cifra de Deslocamento . . . . . . . . . . . . . .
3.6 Algoritmo de Euclides e inversos mod n . . . .
3.7 Cifra Afim . . . . . . . . . . . . . . . . . . . . .
3.8 Função φ de Euler . . . . . . . . . . . . . . . .
3.9 Criptoanálise da Cifra Afim . . . . . . . . . . .
3.10 Cifra de Vigenère . . . . . . . . . . . . . . . . .
3.11 Criptoanálise da cifra de Vigenere . . . . . . . .
3.12 Cifra de Hill . . . . . . . . . . . . . . . . . . . .
3.13 Ataque à cifra de Hill . . . . . . . . . . . . . . .
3.14 Cifra de Permutação . . . . . . . . . . . . . . .
3.15 Cifras de Fluxo . . . . . . . . . . . . . . . . . .
3.16 Cifra de Fluxo baseada no LFSR . . . . . . . .
3.17 Criptoanálise da cifra de fluxo baseada no LFSR
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
18
18
19
20
22
25
26
32
33
34
36
37
42
43
43
44
45
46
4 Criptografia de chave pública
4.1 Teorema Chinês dos Restos . . . . . . . . . .
4.2 Lagrange, Euler e Fermat . . . . . . . . . . .
4.3 Raı́zes primitivas . . . . . . . . . . . . . . . .
4.4 Exponenciação modular rápida . . . . . . . .
4.5 RSA . . . . . . . . . . . . . . . . . . . . . . .
4.5.1 Ataque do expoente público pequeno .
4.6 Resı́duos quadráticos . . . . . . . . . . . . . .
4.7 Algoritmo de Tonelli-Shanks . . . . . . . . . .
4.8 Cifra de Rabin . . . . . . . . . . . . . . . . .
4.9 Protocolo Diffie-Hellman . . . . . . . . . . . .
4.9.1 Ataque do homem no meio . . . . . . .
4.10 Sistema ElGamal . . . . . . . . . . . . . . . .
4.10.1 Ataque da repetição da chave efemera .
4.11 Sistema Merkle-Hellman . . . . . . . . . . . .
5 Primalidade
5.1 Teste de Fermat . . . . . .
5.2 Teste de Miller-Rabin . . .
5.3 Teste de Solovay-Strassen
5.4 Teste n − 1 de Lucas . . .
6 Factorização
6.1 Método p − 1 de Pollard
6.2 Método ró de Pollard . .
6.3 Factorização de Fermat .
6.4 Crivo quadrático . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
49
49
53
53
54
55
56
57
65
66
69
70
71
72
72
.
.
.
.
75
76
77
79
80
.
.
.
.
82
82
83
85
90
7 Logaritmo Discreto
94
7.1 Enumeração . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.2 Algoritmo passos de bebé passos de gigante . . . . . . . . . . . 95
7.3 Cálculo de ı́ndices . . . . . . . . . . . . . . . . . . . . . . . . . 96
8 Assinaturas digitais
8.1 Introdução . . . . . . . .
8.2 Assinatura RSA . . . . .
8.3 Assinatura ElGamal . .
8.3.1 Forjar assinaturas
. . . . . .
. . . . . .
. . . . . .
ElGamal
2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
99
99
100
101
102
8.4
8.3.2 Falhas de protocolo . . . . . . . . . . . . . . . . . . . . 104
DSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
9 Funções de sı́ntese
9.1 Ataque do Aniversário . . . . . . . . . . . . . . . . . .
9.2 Funções de sı́ntese comprovadamente seguras . . . . . .
9.2.1 Função de sı́ntese Chaum-van Heijst-Pfitzmann
9.2.2 VSH . . . . . . . . . . . . . . . . . . . . . . . .
3
.
.
.
.
.
.
.
.
.
.
.
.
109
. 110
. 111
. 113
. 115
Capı́tulo 1
Preliminares
1.1
Introdução
Alice deseja enviar uma mensagem a Bob sem que Olga a perceba, no caso
desta interceptar a mensagem. Com este objectivo, Alice pode cifrar a
mensagem antes de a enviar a Bob. Bob recebe a mensagem e decifra-a.
Critografia é a ciência que estuda estas duas acções. Se Carla intercepta
a mensagem cifrada, pode tentar quebrar a cifra e ler a mensagem. Criptoanálise é a ciência em que se estuda métodos ou processos para quebrar
cifras. Criptologia engloba tanto a Criptografia como a Criptoanálise.
Durante este curso iremos aprender vários sistemas criptográficos, alguns dos quais são correntemente usados nas diversas comunicações de mensagens (militares, espionagem, números de PIN, conversações telefónicas,
transacções bancárias, Internet, e-mail, etc.). Ao mesmo tempo, Estudaremos métodos para quebrar certos cifras e a razão pela qual alguns dos sistemas criptográficos são considerados inquebráveis. Iremos também estudar
funções de sı́ntese (que são uma espécie de impressão digital), assinaturas
e identificação digital e diversos protocolos de segurança. As ferramentas
essenciais deste curso serão Teoria dos Números e algumas noções de Álgebra.
1.2
Vocabulário
Mensagem original (ou texto plano) - Mensagem que se pretende tornar secreta, por exemplo OLA;
Mensagem cifrada - A mensagem secreta que se obtém após ter sido
4
cifrada, por exemplo ROD (usando o sistema criptográfico utilizado por Júlio
César);
Emissor - Quem envia a mensagem;
Receptor - Quem recebe a mensagem;
Cifrar - Transformar a mensagem original numa mensagem cifrada;
Decifrar - Transformar a mensagem cifrada na mensagem original;
Cifra - Conjunto de procedimentos e conjunto de sı́mbolos (letras, nomes,
sinais, etc) usados para cifrar uma mensagem;
Codificação simples - Transformar a mensagem original em números ou
bits1 . Por exemplo, se fizermos a transformação 2 → 0, A→ 1, ..., Z→ 26
então a palavra OLA passava a 15 12 1. Usualmente utiliza-se o código
ASCII, que representa cada sı́mbolo por 8 bits (byte): A→ 01000001, B→
01000010, a→ 01100001, 0 → 00110000, ? → 00111111, etc;
Descodificar - Transformar números ou bits em mensagens;
Monogrâmica (ou monográfica) - Uma cifra que traduz um a um os
sı́mbolos do texto original em texto cifrado;
Poligrâmica (ou poligráfica - Uma cifra que traduz vários sı́mbolos do
texto original, em grupo e ao mesmo tempo, em texto cifrado;
Cifra de transposição ou permutação - Uma cifra que re-arranja e/ou
permuta as letras, sı́mbolos ou bits do texto plano;
Cifra de substituição - Uma cifra que substitui letras, sı́mbolos ou bits
por outros sem lhes alterar a ordem;
Sistema criptográfico - Conjunto de procedimentos para cifrar e decifrar
uma mensagem;
Chave - Num sistema criptográfico, corresponde a um nome, uma palavra,
uma frase, etc, que permite cifrar ou decifrar uma mensagem.
Sistema criptográfico de chave simétrica - Necessita de uma chave secreta
partilhada pelo emissor e pelo receptor. O emissor e o receptor têm que
concordar com uma chave antes do inı́cio da transmissão da mensagem;
Sistema criptográfico de chave pública - Cada utilizador tem uma chave
para cifrar que é pública e foi publicada e uma chave para decifrar que é
secreta (normalmente só utilizadores autorizados têm a chave secreta);
Assinatura - Processo pelo qual o emissor pode certificar o receptor da sua
identidade. Nos sistemas de chave pública este processo evita que utilizadores
inimigos enviem mensagens enganosas;
1
bits é o plural de bit - binary digit
5
Criptoanálise - É o processo pelo qual o inimigo (quem não está autorizado
a decifrar a mensagem) tenta transformar a mensagem cifrada na mensagem
original.
Os processos para cifrar e decifrar devem ser fáceis de aplicar para os
utilizadores autorizados mas deve ser difı́cil um inimigo ou utilizador não
autorizado decifrar as mensagens. Teoria dos números é uma excelente fonte
de problemas com alguns mecanismos fáceis e alguns mecanismos difı́ceis,
portanto aparenta ser uma óptima área para ser usada em criptologia.
1.3
História
A história da criptografia aparenta ter sido iniciada no antigo Egipto, cerca
de 1900 a.C. pelo arquitecto Khnumhotep II, na tempo do faraó Amenemhet
II. O escriba de Khnumhotep II substituiu alguns trechos e palavras de documentos importantes por sı́mbolos estranhos de modo a dificultar que ladrões
chegassem a tesouros reportados nesses documentos.
Alguns séculos mais tarde aparecem outros métodos de transmitir mensagens de modo secreto, por exemplo na Mesopotâmia, Assı́ria, China, India
e Egipto. Exemplos desses métodos são:
Tatuagens com mensagens na cabeça de escravos. Infelizmente
era preciso esperar o cabelo crescer antes de ”enviar”a mensagem.
A decifração era feita no barbeiro;
Marcas na madeira de placas de cera. As marcas eram escondidas
com cera nova. Para decifrar, bastava derreter a cera;
Mensagens dentro do estômago de animais de caça.
Este tipo de ocultação de mensagens toma o nome de esteganografia e
distingue-se da criptografia porque neste caso a mensagem não é alterada e
baseia-se no facto de um interceptor não saber da existência da mensagem.
Quando se utiliza criptografia, sabe-se que está a ser enviada uma mensagem,
mas o seu sentido é obscuro. Como exemplos modernos de esteganografia,
temos a ocultação de mensagens em imagens digitais, através da alteração de
alguns bits em cada componente da cor e marcas ocultas nas notas bancárias
6
para evitar a sua falsificação. Apesar da sua aparente semelhança com criptografia, os métodos de esteganografia são muito distintos dos utilizados em
criptografia e não serão estudados durante este curso.
Cerca de 600 a.C., os hebreus criaram alguns sistemas criptográficos
aquando da escrita do livro de Jeremias, nomeadamente o Atbash, que consiste de uma troca simples entre as letras do hebraico, por ordem inversa.
O primeiro sistema criptográfico de uso militar terá sido o Scytale ou
Bastião de Licurgo, utilizado pelo general espartano Pasanius, em 475 a.C..
O scytale consiste em escrever a mensagem numa tira estreita de couro ou
pergaminho quando esta está enrolada em torno de um bastião de madeira.
A mensagem original é escrita no sentido do comprimento do bastião e, portanto, quando a tira é desenrolada obtém-se a mensagem cifrada. Para voltar
a obter a mensagem original, deve-se enrolar outra vez a tira num bastião
com o mesmo perı́metro e forma. Este é um exemplo de uma cifra de transposição. Esta é ainda a ideia de muitas técnicas populares actuais.
Na India, por volta de 300 a. C., apareceu um livro intitulado Arthasastra, atribuı́do a Kautilya, onde são referidos os primeiros métodos de
criptoanálise. Estes processos são recomendados para diplomatas. O famoso
Kama Sutra de Vatsayana, menciona a criptografia nas artes (yogas) 44 e
45, de entre a sua lista de 64 artes e ciências que todos devem saber (Part I,
capı́tulo 3, http://www.sacred-texts.com/sex/kama/index.htm).
Júlio César utilizou uma cifra que consistia em substituir cada letra pela
letra que se encontra três posições depois no alfabeto. Este é um exemplo de
uma cifra de deslocamento.
No século VIII, al-Khalil, escreveu o livro Kitab al Mu’amma (que significa ”O livro das mensagens criptográficas”). Infelizmente este livro desapareceu. al-Khalil decifrou um criptograma bizantino antigo quando supôs,
correctamente, que o inı́cio do criptograma era ”Em nome de Deus”. Este
método, conhecido como o método da palavra provável, foi usado para ajudar a decifrar mensagens cifradas pelo Enigma, durante a Segunda Guerra
Mundial. Cerca de 100 anos depois, al-Kindi, escreveu um outro livro sobre
criptografia, ainda existente, intitulado Risalah fi Istikhraj al Mu’amma (Escritos sobre a decifração de mensagens criptográficas). al-Kindi considerou
análises estatı́sticas para quebrar cifras, processo ainda usado na actualidade.
Em 1466, Leon Battista Alberti, escreveu um ensaio, no qual menciona
uma cifra em disco, criando a noção de cifra poli-alfabética.
Giovan Batista Belaso inventou, em 1553, um sistema criptográfico polialfabético a que actualmente se chama cifra de Vigenère, por ter sido fal7
samente atribuı́do a Blaise de Vigenère durante o século XIX. Este sistema
tem uma chave e uma série de diferentes cifras de César e foi considerado
indecifrável durante muito tempo, porém é facilmente quebrado utilizando
análise estatı́stica. Em 1585, Vigenère criou a noção de auto-chave, processo
ainda hoje utilizado, por exemplo no sistema DES.
Durante os séculos XVIII e XIX, assistiu-se à proliferação de Cameras
Escuras, gabinetes de espionagem, onde se utilizava a criptologia para fins
militares e fins civis, nomeadamente para decifrar mensagens diplomáticas.
Em Viena, é criada uma das mais eficientes cameras escuras, onde se decifrava cerca de 100 mensagens diplomáticas internacionais, por dia. França,
Inglaterra e Alemanha também criam os seus centros de criptoanálise, tendo
empregado diversos matemáticos famosos.
Durante a Primeira Guerra Mundial assiste-se a uma proliferação de sistemas criptográficos para usos militares. Como exemplos, temos o Playfair e
o ADFGVX.
A cifra inglesa Playfair (guerra dos Boers e Primeira Guerra Mundial)
consiste em escrever a palavra chave (que não pode ter letras repetidas)
seguida das restantes letras num quadrado cinco por cinco. Se considerarmos
a palavra chave Palmerston, obtemos
P
R
B
H
V
A L
S T
C D
IJ K
W X
M E
O N
F G
Q U
Y Z
Para cifrar um par de letras, forma-se um rectângulo do qual as letras são
vértices. A mensagem cifrada consiste dos outros dois vértices. Por exemplo,
PI é cifrado em AH. Se duas letras estão na mesma linha (resp. mesma
coluna), toma-se as letras seguintes, e. g. EU é cifrado em NZ e ME fica EP.
Se a mensagem original tiver duas letras iguais consecutivas, coloca-se um X
a separá-las, e. g. a mensagem ASSIM passa a ser AS XS IM.
A cifra alemã ADFGVX (Primeira Guerra Mundial), utiliza uma tabela
fixa para efectuar uma substituição da mensagem original. Cada letra é
transformada no par de letras correspondente à linha e coluna onde a letra
original está.
8
A
D
F
G
V
X
A
K
9
K
E
8
U
D F
Z W
B 6
7 J
V Y
O D
4 I
G
R
C
P
3
H
S
V X
1 F
L 5
G X
A N
0 2
T M
Assim, ACHTUNG é primeiro cifrado em GV DG VG XV XA GX FV.
Esta é a parte da substituição da cifra.
Em seguida, efectua-se um deslocamento, utilizando uma chave sem letras repetidas, neste caso a chave é DEUTSCH. Constrói-se uma tabela em
que, na primeira linha está a palavra chave, na segunda linha o numeral correspondente à ordem alfabética de cada letra da primeira linha e, nas linhas
seguintes é escrita a mensagem que resultou do processo de substituição efectuado anteriormente. A mensagem cifrada é obtida, escrevendo as letras das
colunas seguindo a ordem indicada na segunda linha.
D E U T S C H
2 3 7 6 5 1 4
G V D G V G X
V X A G X F V
No nosso exemplo, a mensagem cifrada correspondente à mensagem original ACHTUNG é GF GV VX XV VX GG DA.
A grande fraqueza da cifra ADFGVX é usar uma tabela fixa para a parte
da substituição. A alternância entre substituições e deslocações permite obter
cifras bastante seguras, sendo este processo a base do DES (Data Encryption
Standard) e do AES (Advanced Encryption Standard).
Após esta guerra começam a aparecer as primeiras máquinas cifrantes que
usam rotores mecânicos. Em 1923, Arthur Scherbius, desenvolve o ENIGMA,
talvez a mais famosa máquina cifrante. O ENIGMA é utilizado pelos alemães
durante a Segunda Guerra Mundial para comunicações com os submarinos
e para deslocar as suas tropas. O ataque criptoanalı́tico ao ENIGMA foi
iniciado pelo matemático polaco Marian Rejewski (juntamente com Jerzy
Rozycki e Henryk Zygalski), que após a Polónia ter sido invadida conseguiu
passar a sua informação para França. Esta informação acabou por chegar
a Inglaterra, onde Turing e o seu grupo de criptoanalı́ticos trabalhavam.
Estes conseguiram decifrar o ENIGMA o que permitiu descobrir planos mil-
9
itares dos alemães e o envio mensagens enganosas para os alemães localizados
em França, conseguindo assim facilitar a invasão por Dunquerque. Japão
tinha a Máquina Púrpura, cujo sistema foi quebrado por equipa liderada
por William Frederick Friedman (criador da palavra criptoanálise). O sistema criptográfico utilizado pelos EUA durante Segunda Guerra Mundial,
encontra-se ainda classificado.
Nos anos 60, o Dr. Horst Feistel, liderando um projecto de pesquisa no
IBM Watson Research Lab, desenvolve a cifra Lucifer. Em 1974, a IBM apresenta Lucifer ao NBS (National Bureau of Standards), o qual, após algumas
alterações, adopta esta cifra como cifra padrão nos EUA, criando assim o
DES (Data Encryption Standard). Este sistema foi criticado desde o inı́cio
por vários investigadores e acabou por ser quebrado, usando força bruta, em
1997.
Whitfield Diffie e Martin Hellman publicam, em 1976, o artigo ”New Directions in Cryptography”, onde introduzem a ideia de criptografia de chave
pública, neste caso baseada no problema do logaritmo discreto, e avançam
com a ideia de autenticação utilizando funções de um só sentido (one way
functions). Inspirados por aquele artigo, Ronald L. Rivest, Adi Shamir e
Leonard M. Adleman, desenvolvem uma cifra de chave pública, que também
pode ser usada para assinaturas digitais, baseada no contraste entre a dificuldade de factorizar números grandes e a relativa facilidade de identificar
números primos grandes. Este sistema passou a ser conhecido como RSA
e foi patenteado. Em 1984, Taher Elgamal desenvolve o sistema ElGamal
também utilizando o problema do logaritmo discreto.
Nos anos 90 aparecem diversos sistemas criptográficos em particular o
IDEA (International Data Encryption Algorithm) de Xuejia Lai e James
Massey, que pretende ser um substituto do DES. A criptografia quântica é
introduzida em 1990. O PGP (Pretty Good Privacy) de Phil Zimmermann,
desenvolvido em 1991, ainda é um dos programas mais utilizados para proteger a privacidade do e-mail e dos arquivos guardados no computador do
utilizador. Nas versões mais recentes do PGP, é utilizado o sistema ElGamal.
Em 1997, o NIST solicitou propostas para a substituição do DES. Em 2000, o
NIST escolheu o Rijndael (de entre os finalistas estava MARS da IBM, RC6
de RSA Laboratories, Rijndael de Joan Daemen e Vincent Rijmen, Serpent
de Anderson, Biham e Knudsen, e o twofish de Bruce Schneier e sua equipa),
para ser o novo AES (Advanced Encryption Standard). Só em 2005 é que
o NIST (National Institute of Standards and Technology), que substituiu o
NBS, publica um plano de transição com a duração de dois anos, para que as
10
agências governamentais deixassem de utilizar o DES e passassem a utilizar
o AES.
11
Capı́tulo 2
Complexidade
Tudo indica que seja praticamente impossı́vel criar cifras absolutamente inquebráveis. É mais razoável e suficiente para o uso concreto, requerer que
um sistema seja praticamente inquebrável por um inimigo, isto é, requerer
que um sistema demore demasiado tempo (usando milhões de computadores
super-potentes) a ser quebrado. Durante este curso, iremos ver o que isto
significa em casos concretos.
2.1
Estimativas de tempo
Um tópico que é central em complexidade é a estimação do número de
operações bit necessárias para efectuar operações aritméticas ou cálculos
matemáticos num computador. Vamos começar com algumas noções básicas.
Um inteiro n pode ser escrito em qualquer base b com b > 0 inteiro.
Usamos a notação (dk−1 dk−2 · · · d1 d0 )b para significar que
n = dk−1 bk−1 + dk−2 bk−2 + · · · d1 b + d0 ,
onde os algarismos di são sı́mbolos que podem tomar valores entre 0 e b −
1 e dk−1 é não nulo. Esta representação é única dependendo apenas da
base escolhida. Quando a base é 10 escreve-se apenas dk−1 dk−2 · · · d1 d0 , sem
indicação da base, para representar n. Por exemplo,
5476 = 5 · 103 + 4 · 102 + 7 · 10 + 6,
12
(10110)2 = 1 · 24 + 0 · 23 + 1 · 22 + 1 · 2 + 0 = 22.
As fracções podem também ser representadas em qualquer base, usandose neste caso o ponto flutuante para distinguir a parte inteira da parte fraccionária, i. e.
n = (dk−1 dk−2 · · · d1 d0 .d−1 d−2 · · · d−m )b ,
se
n=
k−1
∑
dj b j .
j=−m
Diz-se que um inteiro n tem k algarismos, quando escrito na base b, se
n = (dk−1 dk−2 · · · d1 d0 )b . Note-se que
[
]
log n
número de algarismos = [logb n] + 1 =
.
log b
Estamos em condições de calcular o tempo necessário para fazer certas
operações aritméticas. Começaremos com a adição. Os computadores trabalham no sistema binário, portanto iremos fazer as nossas operações neste
sistema, daı́ o nome de operações bit (binary digit). Consideremos a seguinte
adição:
1111
1111000
+0011110
10010110
Suponhamos que ambos os números têm k bits, adicionando-se zeros à
esquerda caso necessário. Vejamos em detalhe em que consiste esta adição.
Basicamente, temos que repetir k vezes os seguintes passos:
1. Se ambos os bits numa coluna são zero e não há transporte. Neste caso,
mete-se um zero e se estivermos na coluna k + 1 o processo termina.
Se não estivermos na coluna k + 1 passa-se à coluna seguinte;
2. Se ou (a) ambos os bits são zero e há transporte, ou (b) um dos bits é
zero e o outro é um e não há transporte, então mete-se um 1 e passa-se
à coluna seguinte; se estivermos na coluna k + 1 o processo termina.
13
3. Se ou (a) ambos os bits são um e não há transporte, ou (b) um dos bits
é zero e o outro é um e há transporte, então mete-se um 0, mete-se um
transporte na coluna seguinte e passa-se à frente;
4. Se ambos os bits são um e há transporte, mete-se um 1, mete-se um
transporte na coluna seguinte e passa-se à frente.
Chamamos operação bit a uma implementação deste processo. Portanto,
adicionar dois números com k bits demora k + 1 operações bit. Iremos ver
como descobrir o número de operações bit de várias outras operações aritméticas. O tempo que um computador demora a efectuar uma certa tarefa
é, essencialmente, proporcional ao número de operações bit. No entanto, a
constante de proporcionalidade (o número de nano-segundos que um computador demora a fazer uma operação bit) depende do computador em particular. Quando falarmos de estimar o tempo que se demora a efectuar certa
tarefa estaremos a falar do número de operações bit requeridas.
Vejamos agora o processo de multiplicar um número n com k bits por um
número m com l bits. Por exemplo,
11101
×1101
00011101
01110100
11101000
101111001
Obtemos, no máximo l linhas, onde cada linha consiste de uma cópia de
n deslocada para a direita uma certa distância. Portanto, cada linha tem
no máximo k + l − 1 bits. Temos assim que fazer, no máximo l − 1 adições,
de inteiros com k + l − 1 bits. Portanto, temos (l − 1)(k + l) operações bit.
Note-se que neste cálculo, negligenciámos o tempo necessário para ”deslocar
para a direita”e o tempo de acesso à memória. No entanto, este tempo é
considerado irrisório, quando comparado a um grande número de operações
bit. Assim, só nos interessa majorar o número de operações bit. Convém
também simplificar ao máximo as nossas estimativas. Por exemplo, se k ≥ l,
podemos estimar
tempo(k-bit× l-bit) ≤ 2kl ≤ 2k 2
14
Definição. Sejam f, g, duas funções aritméticas, i. e. funções cujo conjunto
de partida consiste dos inteiros positivos e o conjunto de chegada consiste
dos números reais (por vezes, o conjunto de chegada será o conjunto dos
complexos). Se g ≥ 0, escrevemos
f (n) = O(g(n))
se existir C > 0 e um inteiro n0 tal que
f (n) ≤ Cg(n)
para qualquer n ≥ n0 . Mais geralmente, se existe C > 0, tal que
f (n1 , . . . , nk ) ≤ Cg(n1 , . . . , nk )
para ni ’s suficientemente grandes, escrevemos
f = O(g).
Exemplo. Se f = a0 + a1 d + · · · + ad nd é um polinómio de grau d, com
ad > 0 então f = O(nd ).
Exemplo. log n = O(nϵ ), para qualquer ϵ > 0.
Exemplo. O número de algarismos de n na base b é O
(
log n
log b
)
= O(log n).
Exemplo. Tempo para efectuar a adição de n com m, com m ≤ n, é
O(log n).
Exemplo. Tempo para efectuar o produto de n por m, com m ≤ n, é
O(log2 n).
Note-se que os dois exemplos anteriores referem-se aos processos descritos
para efectuar estas operações. Claramente, existem outros processos para
efectuar as operações mencionadas, podendo estes demorar mais, ou menos
tempo. Por exemplo, poderı́amos ter multiplicado m por n, fazendo a adição
de n com ele próprio, m − 1 vezes. Há processos de multiplicação rápida que
permitem multiplicar dois números m ≤ n em
O(log n(log log n)(log log log n))
operações bit. A cada procedimento que nos permite efectuar certa operação
(ou resolver certa questão), chamamos algoritmo.
O algoritmo da divisão ensinado no ensino básico também tem O(kl)
operações bit, quando se divide um número com k bits por um com l bits.
15
Exemplo. Converter o inteiro n com k bits para a sua representação na base
10. Dividir n por 1010 demora O(4k) e temos que efectuar
[
]
log n
+1
log 10
divisões (tantas quantos os dı́gitos na base 10 de n). Obtemos assim
tempo(converter n para décimal) = O(k 2 ) = O(log2 n).
Exemplo. Converter o inteiro n com k bits para a sua representação na base
b. Suponhamos que b tem l bits. Dividir n por b demora O(lk) e temos que
efectuar
[
]
log n
+1
log b
divisões (tantas quantos os algarismos na base b de n). Obtemos assim
tempo(converter n para a base b) = O(lk)O(k/l) = O(k 2 ) = O(log2 n).
Exemplo. Tempo requerido para obter n!. Temos que efectuar O(n) (mais
exactamente n − 2) multiplicações, cada uma entre um número com, no
máximo, nk bits e outro, com, no máximo, k bits. Portanto, cada multiplicação demora O(nk 2 ) operações bit. Assim,
tempo(calcular n!) = O(n2 k 2 ) = O(n2 log2 n).
2.2
P versus NP
Definição. Um algoritmo para efectuar uma computação (ou responder a
uma questão), envolvendo inteiros n1 , . . . , nr de k1 , . . . , kr bits, respectivamente, é um algoritmo de tempo polinomial se existirem inteiros d1 , . . . , dr
tais que
número de operações bit = O(k1d1 · · · krdr )
Definição. Uma operação (questão, computação, tarefa) é de tempo polinomial se existir um algoritmo de tempo polinomial para a efectuar (resolver).
Dizemos que estas operações estão na classe P.
Definição. Se a prova de uma resposta, dada a uma questão, pode ser efectuada em tempo polinomial, dizemos que esta questão está na classe NP.
16
Claramente, temos que P⊂NP.
Exemplo. Questão: factorizar o número n. Se alguém conseguir resolver a
questão, basta publicar essa factorização n = m1 · · · mt . Para verificarmos
se a resposta está correcta, basta multiplicarmos os inteiros m1 , . . . , mt . Esta
verificação pode ser efectuada em tempo polinomial (t − 1 multiplicações,
onde t é muito pequeno). Portanto, a factorização está na classe NP. No
entanto, ainda não foram descobertos algoritmos para efectuar factorizações
em tempo polinomial. Assim, a factorização pode não estar na classe P.
Um dos problemas do milénio consiste em provar ou provar que é falsa,
a afirmação P = N P .
17
Capı́tulo 3
Criptografia Simétrica
Criptografia é a arte e ciência de enviar mensagens secretas. O emissor usa
uma chave para cifrar a mensagem, esta é enviada até ao receptor que usa
outra chave para a decifrar. Escrevendo letras e sinais de pontuação como
números, podemos assumir que a mensagem a enviar é um inteiro P que
é codificado num outro inteiro C. O problema consiste em inventar chaves
que tornem impossı́vel ou computacionalmente irrealizável que o inimigo (ou
qualquer pessoa que não queiramos que leia a mensagem) decifre a mensagem interceptada. Muitas vezes a criptografia usa chaves secretas que só
são conhecidas pelo emissor e pelo receptor. Se o inimigo descobre a chave
de cifrar e intercepta a mensagem cifrada, ele pode conseguir descobrir a
chave de decifrar e recuperar a mensagem original. Este foi o método que os
matemáticos ingleses usaram para decifrar o Enigma, usado pelos alemães
para comunicar entre si e, em particular, com os submarinos, na segunda
guerra mundial.
Neste capı́tulo iremos estudar alguns exemplos clássicos de criptosistemas.
3.1
Introdução
Normalmente, o primeiro passo para inventar um criptosistema consiste em
codificar a mensagem, i. e. transformar a mensagem original em números
ou bits. Este processo pode ser efectuado letra a letra, e. g. A→ 0, ...,
Z→ 25, ou em pares de letras, e. g. dadas duas letras correspondentes a
x, y ∈ {0, 1, . . . , 25}, o par de letras irá corresponder ao inteiro
26x + y ∈ {0, 1, . . . , 675}.
18
Por exemplo, o par ”EU”corresponde ao número 125. A codificação pode
também ser feita a n-uplos de letras, n ≥ 3, fazendo-se a correspondência:
se a letra αi corresponde ao número xi então o n-uplo α1 · · · αn corresponde
a inteiro
26n−1 x1 + · · · 26xn−1 + xn .
Durante este curso, usaremos essencialmente as codificações
1. A→ 0, ..., Z→ 25;
2. 2 → 0, A→ 1, . . . , Z→ 26;
3. 2 → 0, A→ 1, . . . , Z→ 26, 0 → 27, . . . 9 → 36;
4. O código ASCII.
Definição. Um criptosistema é um quı́ntuplo (P, C, K, E, D) que satisfaz as
seguintes condições:
1. P é o conjunto finito dos textos planos possı́veis;
2. C é o conjunto finito dos textos cifrados possı́veis;
3. K é o conjunto finito das chaves;
4. Para cada K ∈ K existe uma regra para cifrar eK ∈ E e uma regra para
decifrar correspondente dK ∈ D, tais que eK : P −→ C, dK : C −→ P
e dK (eK (x)) = x, para qualquer x ∈ P.
3.2
Cifra de Substituição
As cifras de Substituição são utilizadas à centenas de anos. Actualmente
ainda aparecem em Criptogramas nas revistas recreativas. Como o próprio
nome indica, estas cifras consistem em substituir cada letra por uma outra
letra. Nestas cifras não é necessário codificar a mensagem primeiro.
Cifra (Substituição). Seja m um inteiro positivo. Sejam P = C = Zm .
O conjunto das chaves K consiste de todas as permutações dos números
0, 1, . . . , m − 1. Sejam x ∈ P e y ∈ C. Para cada permutação π ∈ K,
definimos
eπ (x) = π(x)
19
e
dπ (y) = π −1 (y),
onde π −1 é a permutação inversa de π.
Estas cifras têm m! chaves possı́veis. No caso de m = 26, obtemos mais
de 4.0 × 1026 chaves, o que torna impraticável a busca exaustiva da chave de
um sistema criptográfico deste tipo. Mais tarde veremos como quebrar estes
sistemas.
Exercı́cio. Considere m = 26. Sabendo que foi utilizada uma cifra de substituição, decifre a seguinte mensagem na lı́ngua inglesa.
MGZVYZLGHCMHJMYXSSFMNHAHYCDLMHA
3.3
Criptoanálise clássica
Suponhamos que se deseja decifrar uma mensagem, mas não se sabe a chave.
Para isso usa-se criptoanálise. Diz-se quebrar o código ao processo de descobrir como decifrar mensagens num dado criptosistema sem se saber as
chaves. Para quebrar um código necessitamos de dois tipos de informação:
que tipo de criposistema temos, e quais são as chaves desse criptosistema.
Iremos assumir que o tipo de criptosistema a quebrar é conhecido (princı́pio
de Kerckhoff) e iremos só estudar como descobrir as chaves.
Há vários nı́veis de ataques a um criptosistema, os mais comuns são
Só mensagem cifrada(ciphertext-only): O oponente possui uma mensagem cifrada;
Texto plano conhecido (known plaintext): O oponente possui um texto
plano e a mensagem cifrada correspondente;
Texto plano escolhido (chosen plaintext): o oponente obteve acesso temporário à máquina de cifrar. Portanto pode escolher um texto plano e
cifrá-lo.
Mensagem cifrada escolhida (chosen ciphertext): O oponente obteve
acesso temporário à máquina de decifrar. Portanto pode escolher uma
mensagem cifrada e decifrá-la.
20
Letra
Probabilidade
Letra
Probabilidade
Letra
Probabilidade
Letra
Probabilidade
E
0.127
H
0.061
W
0.023
K
0.008
T
0.091
R
0.060
F
0.022
J
0.002
A
0.082
D
0.043
G
0.020
X
0.001
O
0.075
L
0.040
Y
0.020
Q
0.001
I
0.070
C
0.028
P
0.019
Z
0.001
N
0.067
U
0.028
B
0.015
S
0.063
M
0.024
V
0.010
Figura 3.1: Distribuição de Frequências na Lı́ngua Inglesa
Letra
Probabilidade
Letra
Probabilidade
Letra
Probabilidade
Letra
Probabilidade
A
0.146
D
0.050
H
0.013
J
0.004
E
0.126
M
0.047
G
0.013
X
0.002
O
0.107
T
0.047
Q
0.012
K
0.001
S
0.078
U
0.046
B
0.010
W
0.001
R
0.065
C
0.039
F
0.010
Y
0.001
I
0.062
L
0.028
V
0.009
N
0.051
P
0.025
J
0.004
Figura 3.2: Distribuição de Frequências na Lı́ngua Portuguesa
Normalmente, é preferı́vel usar textos planos sem espaços nem pontuação,
tornando o criptosistema mais seguro.
Muitas técnicas de criptoanálise utilizam as propriedades estatı́sticas de
uma lı́ngua. Nas figuras 3.1 e 3.2 estão representadas as frequências relativas
das lı́nguas Inglês e Português, respectivamente. Por vezes temos também de
usar as frequências relativas de duas ou três letras consecutivas (digramas e
trigramas). Os digramas mais frequentes na lı́ngua inglesa são: TH, HE, IN,
ER, AN, RE, ED, ON, ES, ST, EN, AT, TO, NT, HA, ND, OU, EA, NG, AS,
OR, TI, IS, ET, IT, AR, TE, SE, HI e OF. Os trigramas mais frequentes na
lı́ngua inglesa são: THE, ING, AND, HER, ERE, ENT, THA, NTH, WAS,
ETH, FOR e DTH.
21
3.4
Criptoanálise da Cifra de Substituição
Vamos complicar um pouco e analisar como se pode quebrar a cifra de substituição. Considere a mensagem cifrada
YIFQFM ZRWQFY VECFMD ZPCVMR ZWNMDZ VEJBTX
CDDUMJ NDIFEF MDZCDM QZKCEY FCJMYR NCWJCS
ZREXCH ZUNMXZ NZUCDR JXYYSM RTMEYI FZWDYV
ZVYFZU MRZCRW NZDZJJ XZWGCH SMRNMD
HNCMFQ CHZJMX JZWIEJ YUCFWD JNZDIR
A seguinte tabela apresenta a análise de frequência desta mensagem
cifrada
Letra
Frequência
Letra
Frequência
Letra
Frequência
A
0
J
11
S
3
B
1
K
1
T
2
C
15
L
0
U
5
D
13
M
16
V
5
E
7
N
9
W
8
F
11
O
0
X
6
G
1
P
1
Y
10
H
4
Q
4
Z
20
I
5
R
10
Como o Z aparece significativamente mais vezes que qualquer outra letra,
podemos conjecturar que dK (Z) = e. As outras letras que aparecem pelo
menos de 9 vezes são M, C, D, F, J, R, Y, N e será de esperar que estas
letras sejam obtidas a partir de t, a, o, i, n, s, h, r, mas por termos um texto
tão pequeno, as frequências não variam de modo suficiente para nos dar a
correspondência correcta.
Nesta altura, é aconselhável considerar digramas, especialmente aqueles
que contém a letra Z. Verifica-se que os digramas DZ e ZW aparecem quatro
vezes cada, que os digramas NZ e ZU aparecem três vezes cada e que os digramas RZ, HZ, XZ, FZ, ZR, ZV, ZC, ZD, ZJ aparecem duas vezes cada. Como
ZW aparece quatro vezes, WZ nunca aparece e W não é das letras que mais
aparecem, podemos conjecturar que dK (W ) = d. Como DZ aparece quatro
vezes e ZD aparece duas vezes, podemos esperar que dK (D) ∈ {r, s, t}, mas
não conseguimos, de uma maneira clara, prever qual das três possibilidades
é a correcta.
22
Assumindo dK (W ) = d, verifica-se que os únicos digramas com W no
fim, que aparecem mais que uma vez são ZW e RW. Entre os digramas mais
frequentes na lı́ngua inglesa, os únicos que terminam em d são ed e nd, donde
somos levados a conjecturar que dK (R) = n.
Antes de continuarmos a nossa análise, vejamos quais são os digramas que
mais aparecem na mensagem cifrada. Além dos digramas DZ e ZW também
MD e MR aparecem quatro vezes cada, e, além de NZ e ZU, também CD, CH,
FM, IF e NM aparecem três vezes. Atendendo aos digramas mais frequentes
na lı́ngua inglesa podemos inferir que dK (M ) ∈ {a, i, n, o, s} e dK (R) ∈
{n, r, s, t}. Mais, como NM e NZ são frequentes, então provavelmente temos
dK (N M ) ∈ {ha, hi}.
A última afirmação permite-nos conjecturar que dK (N ) = h e dK (M ) ∈
{a, i}.
Vejamos como fica a frase se efectuarmos as substituições conjecturadas:
-----end - - -----e----n
YIFQFM ZRWQFY VECFMD ZPCVMR
-----h------e---e---CDDUMJ NDIFEF MDZCDM QZKCEY
en - - - e-h--e
he - - - n
-----ZREXCH ZUNMXZ NZUCDR JXYYSM
e---e- ne - nd
he - e - - ed - - ZVYFZU MRZCRW NZDZJJ XZWGCH
-h-----e--- ed - - ----dHNCMFQ CHZJMX
JZWIEJ YUCFWD
edh - - e
-----ZWNMDZ VEJBTX
-----n
h-d--FCJMYR NCWJCS
n----- ed - - RTMEYI FZWDYV
- - nh - SMRNMD
- he - - n
JNZDIR
A sequência ne - nd sugere que devemos substituir C por a o que implica
que dK (M ) = i. Donde
23
-----i
end - - --a-ie - a - in
YIFQFM ZRWQFY VECFMD ZPCVMR
a---ih----i - ea - i
-e-a-CDDUMJ NDIFEF MDZCDM QZKCEY
en - - a e - hi - e
he - a - n
-----i
ZREXCH ZUNMXZ NZUCDR JXYYSM
e---eineand
he - e - - ed - a ZVYFZU MRZCRW NZDZJJ XZWGCH
- hai - a-e-i- ed - - --a-dHNCMFQ CHZJMX
JZWIEJ YUCFWD
edhi - e
-----ZWNMDZ VEJBTX
-a-i-n
had - a FCJMYR NCWJCS
n-i--- ed - - RTMEYI FZWDYV
- inhi SMRNMD
- he - - n
JNZDIR
Das vogais mais frequentes só nos falta determinar a letra que corresponde a o. Sabemos que esta letra é muito comum, portanto será aceitável
supor que é uma das letras D, F, J, Y. Mas D, F, J são facilmente eliminadas senão provocavam sequências de muitas vogais no texto plano. Conjecturamos então que dK (Y ) = o. Quando se faz esta substituição, obtém-se
as sequências a-ion o que sugere a terminação ation muito comum em inglês.
Assim, dK (J) = t.
o----i
end - - o
--a-ie - a - in
YIFQFM ZRWQFY VECFMD ZPCVMR
a - - - it
h----i - ea - i
-e-a-o
CDDUMJ NDIFEF MDZCDM QZKCEY
en - - a e - hi - e
he - a - n
t - oo - i
ZREXCH ZUNMXZ NZUCDR JXYYSM
e-o-eineand
he - ett
- ed - a ZVYFZU MRZCRW NZDZJJ XZWGCH
- hai - a - eti ted - - t
o-a-dHNCMFQ CHZJMX
JZWIEJ YUCFWD
edhi - e
--t--ZWNMDZ VEJBTX
- ation
hadta FCJMYR NCWJCS
n-i-o- ed - o RTMEYI FZWDYV
- inhi SMRNMD
the - - n
JNZDIR
Já tı́nhamos reparado que dK (D) ∈ {r, s, t}. Atendendo à sequência dthe, faz sentido considerar que dK (D) = s. Das letras mais frequentes só nos
sobram F e r. Donde dK (F ) = r.
24
o - r - ri
end - ro
- - aris
e - a - in
YIFQFM ZRWQFY VECFMD ZPCVMR
ass - it
hs - r - r
iseasi
-e-a-o
CDDUMJ NDIFEF MDZCDM QZKCEY
en - - a e - hi - e
he - asn
t - oo - i
ZREXCH ZUNMXZ NZUCDR JXYYSM
e - ore ineand
hesett
- ed - a ZVYFZU MRZCRW NZDZJJ XZWGCH
- hair a - eti ted - - t
o - a - ds
HNCMFQ CHZJMX
JZWIEJ YUCFWD
edhise
--t--ZWNMDZ VEJBTX
ration
hadta FCJMYR NCWJCS
n-i-oredso RTMEYI FZWDYV
- inhis
SMRNMD
thes - n
JNZDIR
Agora, facilmente se obtém
Our friend from Paris examined his empty glass with surprise, as
if evaporation had taken place while he wasn’t looking. I poured
some more wine and he settled back in his chair, face tilted up
towards the sun
3.5
Cifra de Deslocamento
Nesta subsecção, apresentamos as cifras de deslocamento, da qual o sistema
criptográfico utilizado por Júlio César é um exemplo. A base desta cifra,
assim como de outras cifras que estudaremos posteriormente, é a aritmética
modular.
Definição. Sejam a e b inteiros e n um inteiro positivo. Se n | (a − b),
dizemos que a é congruente com b e escrevemos
a≡b
mod n
Cifra (Deslocamento). Seja m um inteiro positivo. Sejam P = C = K = Zm .
Para 0 ≤ K ≤ m − 1, x ∈ P e y ∈ C definimos
eK (x) ≡ x + K
mod m
dK (y) ≡ y − K
mod m
e
25
A cifra de César é uma cifra de deslocamento, com K = 3 e m = 23. O
ROT-13, actualmente utilizado online, em newsgroups e usenet, para ocultar
mensagens ofensivas, respostas a puzzles, etc., é outro exemplo de uma cifra
de deslocamento, neste caso com K = 13 e m = 26. Note-se que, neste caso
eK (eK (x)) = x.
As cifras de deslocamento são exemplos de cifras de substituição.
As cifras de deslocamento são muito inseguras, porque há somente m
chaves possı́veis, e m é normalmente muito pequeno. Uma busca exaustiva
da chave quebra rapidamente um destes sistemas criptográficos.
Exercı́cio. A seguinte mensagem foi cifrada com uma cifra de deslocação
com m = 27. Decifre-a.
OCUAE SCMRUMLQLDQSFCMZOM
3.6
Algoritmo de Euclides e inversos mod n
Antes de vermos mais sistemas criptográficos, necessitamos de alguns resultados elementares da Teoria dos Números.
Definição. Sejam a e b dois inteiros tais que pelo menos um deles é não
nulo. Chamamos máximo divisor comum ao maior elemento do conjunto dos
divisores comuns de a e b e denotamos este elemento por (a, b).
Sejam a e b dois inteiros positivos. Pelo algoritmo da divisão, existem
dois inteiros q0 e r0 , tais que
a = q0 b + r0 , com 0 ≤ r0 < b
Se r0 ̸= 0 podemos utilizar o algoritmo da divisão para os inteiros b por r0 .
Então existem q1 e r1 tais que
b = q1 r0 + r1 , com 0 ≤ r1 < r0
Procedendo desta forma obtemos uma sequência de inteiros não negativos
r0 , r1 , . . . , rn , tais que r0 > r1 > · · · > rn ≥ 0. Note que este processo tem
de terminar ao fim de um número finito de passos e que o último resto, que
denotamos por rk+1 , é nulo.
26
Teorema 3.1. Se a e b são dois inteiros positivos e rk é o último resto não
nulo obtido pelo algoritmo de Euclides, então rk = (a, b). Mais, o algoritmo
de Euclides permite encontrar inteiros u e v tais que
au + bv = (a, b)
Demonstração: O algoritmo de Euclides pode ser esquematizado pelo
seguinte sistema de equações:


a = bq0 + r0




b
= r 0 q1 + r 1


 r 0 = r 1 q2 + r 2
(3.1)
..

.




rk−2 = rk−1 qk + rk


 r
=r q
k−1
k k+1
Seja d = (a, b). Vamos provar por indução que d|ri e d|ri+1 , para todo
o 0 ≤ i ≤ k − 1. Como d|a e d|b, temos d|(a − bq0 ), i.e., d|r0 . Como
d|b e d|r0 então d|(b − r0 q1 ) = r1 . Agora, suponhamos que d|ri e d|ri+1 ,
queremos provar que d|ri+1 e d|ri+2 . Usando a hipótese de indução, obtemos
que d|(ri − ri+1 qi+2 ). Mas ri − ri+1 qi+2 = ri+2 . Portanto d|ri+2 .
Acabámos de provar que d|ri para todo 0 ≤ i ≤ k. Em particular, d|rk .
Como d, rk > 0, temos d ≤ rk .
Reciprocamente, a última equação em (3.1) e o facto de rk ̸= 0, diz-nos
que rk |rk−1 . Usando a penúltima equação, obtemos rk |rk−2 . Por indução,
concluı́mos que rk |ri , para qualquer 0 ≤ i ≤ k. Usando a segunda equação,
temos rk |b e usando a primeira, rk |a. Logo, rk |d. Portanto, rk = d.
Agora, provamos a segunda parte do teorema. Seja r−2 = a e r−1 = b.
Sabemos que
ri = ri−2 − ri−1 qi ,
(3.2)
para qualquer 0 ≤ i ≤ k. Vamos provar por indução que, para qualquer
0 ≤ i ≤ k, existem inteiros ui e vi tais que ri = ui a + vi b. Como r0 = a − bq0 ,
o resultado é válido para i = 0. Suponhamos, por hipótese de indução que o
resultado é verdadeiro para i e para i − 1. Então
ri+1 = ri−1 − ri qi+1
= ui−1 a + vi−1 b − (ui a + vi b)qi+1
= (ui−1 − ui qi+1 )a + (vi−1 − vi qi+1 )b
= ui+1 a + vi+1 b
27
Portanto, para qualquer 0 ≤ i ≤ k, ri = ui a + vi b. Em particular, existem
inteiros u e v, tais que rk = ua + vb.
2
Exemplo. Seja a = 543 e b = 431. A seguinte tabela esquematiza o algoritmo de Euclides para calcular d = (a, b) e descobrir u e v tais que
au + bv = 1.
i
qi
ri
ui
vi
−2
−1
543
1
0
431
0
1
0
1
112
1
−1
1
3
95
−3
4
2
1
17
4
−5
3
5
10
−23
29
4
1
7
27
−34
5
1
3
−50
63
6
2
1
127
−160
Então (a, b) = 1 e 127a − 160b = 1. Mais, para cada −2 ≤ i ≤ k
ri = aui + bvi .
Teorema 3.2. Suponhamos que a > b. Então
tempo(determinar (a, b) usando o algoritmo de Euclides) = O(log3 a).
Demonstração: O algoritmo de Euclides consiste em efectuar sucessivas divisões, onde os sucessivos restos formam uma sequência estritamente
decrescente. Portanto, para estimar o número de operações bit, precisamos
de saber quantas divisões é necessário efectuar. Primeiro, vamos provar que
ri+2 < 12 ri :
Se ri+1 ≤ 12 ri , então como ri+2 < ri+1 , obtemos ri+2 < 12 ri .
Se ri+1 > 12 ri , então a divisão seguinte, no algoritmo de Euclides, é
ri = ri+1 + ri+2 .
Portanto, ri+2 = ri − ri+1 < 12 ri .
Acabámos de provar que em cada dois passos do algoritmo de Euclides
o resto é pelo menos reduzido a metade, donde temos no máximo 2[log2 a]
divisões. Como cada divisão envolve números menores ou iguais a a, o número
de operações bit por divisão é O(log2 a). Portanto, o algoritmo de Euclides
demora
O(log3 a)
28
2
operações bit.
Definição. Sejam a e b inteiros tais que pelo menos um deles é não nulo. Se
(a, b) = 1 então dizemos que a e b são primos entre si.
Teorema 3.3. Se (n, a) = 1 e n|ab, então n|b.
Demonstração: Pelo teorema 3.1, se (n, a) = 1 então existem inteiros u
e v, tais que nu + av = 1, donde nbu + abv = b. Como n|ab, obtemos n|b. 2
Teorema 3.4. Se (a, n) = 1 e ab ≡ ac mod n, então b ≡ c mod n. Em
geral, se (a, n) = d e ab ≡ ac mod n então
n
b ≡ c mod .
d
Demonstração: Suponhamos que (a, n) = d e ab ≡ ac mod n. Então
existe um inteiro k tal que ab = ac + kn. Sejam
a
n
a1 = , n 1 = .
d
d
Claramente, a1 e n1 são inteiros e (a1 , n1 ) = 1. Dividindo ambos os membros
de ab = ac + kn por d, obtém-se a1 (b − c) = kn1 . Donde, a1 | kn1 . Como
(a1 , n1 ) = 1, temos a1 | k. Portanto, k = a1 k1 , para algum inteiro k1 . Assim,
b − c = k1 n1 , ou seja n1 | (b − c). Portanto, b ≡ c mod nd .
2
Teorema 3.5. Sejam a e b inteiros não nulos e d = (a, b). Se d - c então a
equação
ax + by = c
(3.3)
não tem soluções inteiras. Se d|c, a equação tem uma infinidade de soluções
inteiras. Se x = x0 , y = y0 é uma solução de (3.3), então todas as soluções
de (3.3) são dadas por
b
d
a
y = y0 − t
d
x = x0 + t
29
onde t é um inteiro.
Demonstração: Como d|a e d|b, temos d|(ax + by) para quaisquer inteiros x e y. Portanto, se c = ax + by, então d|c. Donde, se d - c, (3.3) não
tem soluções inteiras. Agora, se d|c, existe um inteiro e tal que c = de. Pelo
teorema 3.1, existem inteiros u e v, tais que
au + bv = d.
Multiplicando por e, obtemos a(ue) + b(ve) = de = c. Portanto, a equação
(3.3) tem pelo menos uma solução. Seja (x0 , y0 ) uma solução de (3.3) e t um
inteiro qualquer. Então
(
)
(
b
a)
a x0 + t
+ b y0 − t
= ax0 + by0 = c.
d
d
O que prova que a equação (3.3) tem uma infinidade de soluções.
Falta-nos ainda provar que qualquer solução de ax + by = c é da forma
descrita no teorema. Suponhamos que (x1 , y1 ) é outra solução. Então
a(x1 − x0 ) + b(y1 − y0 ) = c − c = 0.
Donde
a
b
(x1 − x0 ) = − (y1 − y0 ),
d
d
(3.4)
o que implica que
(
Como
que
a b
,
d d
b a
| (x1 − x0 ).
d d
)
= 1, temos
b
| (x1 − x0 ). Portanto, existe um inteiro t, tal
d
b
x1 = x0 + t .
d
Substituindo em (3.4), obtemos
a b
b
t = − (y1 − y0 ),
d d
d
donde
a
y1 = y0 − t .
d
Portanto, qualquer solução de (3.3) é forma acima descrita.
30
2
Teorema 3.6. A congruência
ax ≡ b
mod n
(3.5)
tem soluções se e só se d | b, onde d = (a, n). Se d | b então a solução é única
n
mod . Se (a, n) = 1 então (3.5) tem uma solução que é única mod n.
d
Demonstração: Se x0 é uma solução da equação (3.5) então existe um
inteiro y0 tal que
ax0 = b + ny0 ,
donde a equação
ax − ny = b
(3.6)
tem solução. Reciprocamente, se (x0 , y0 ) é uma solução de (3.6) então
ax0 ≡ ax0 − ny0 ≡ b
mod n
e, portanto, (3.5) tem solução. Acabámos de provar que (3.5) tem soluções
se e só se (3.6) tem soluções e a partir de uma solução de (3.6) obtemos
uma solução de (3.5). Pelo teorema 3.5, (3.6) tem soluções se e só se d | b.
Portanto, (3.5) tem soluções se e só se d | b.
Suponhamos agora que (3.6) tem soluções e seja (x0 , y0 ) uma solução.
Pelo teorema 3.5 qualquer solução de (3.6) é da forma
n
a
x = x0 + t , y = y 0 − t ,
d
d
onde t é um inteiro. Portanto, qualquer solução de (3.5) é da forma
x = x0 + t
Como
x0 + t
n
≡ x0
d
n
d
mod
n
,
d
n
então todas as soluções de (3.5) são congruentes com x0 mod , e portanto,
d
n
a solução de (3.5) é única mod .
d
A última parte do teorema resulta imediatamente das duas primeiras
partes.
2
31
Definição. Sejam a e n inteiros tais que (a, n) = 1. Ao único inteiro, que é
solução da equação
ax ≡ 1 mod n
chamamos inverso de a mod n e denota-mo-lo por a−1 mod n.
Como o processo para escrever (a, b) como combinação linear de a e b
é dado pelo algoritmo de Euclides, também este processo demora O(log3 a)
operações bit. Em particular obtemos:
Corolário 3.7. Dado a, n inteiros, com n > 1 e (a, n) = 1. Então
tempo(determinar a−1 ) = O(log3 a).
Exemplo. Como (543, 431) = 1 e 127 · 543 − 160 · 431 = 1, então o inverso
de 543 mod 431 é 127 e o inverso de 431 mod 543 é 383.
3.7
Cifra Afim
Nesta subsecção, apresentamos outro caso especial da cifra de substituição,
conhecido como cifra afim. Este tipo de criptosistema utiliza funções afins,
i. e. funções da forma f (x) = ax + b. Mais uma vez utilizamos congruências
para definir as regras para cifrar e para decifrar. Dado m > 1 inteiro, a, b ∈
Zm , queremos que a regra para cifrar e( x) (da cifra afim com a chave (a, b))
seja da forma
e(x) ≡ ax + b mod m.
Note-se que, para podermos ter uma regra para decifrar é necessário que
e(x) seja injectiva. Pelo teorema 3.6, e(x) é injectiva se e só se (a, m) = 1.
Sabemos também que se (a, m) = 1 então a tem inverso mod m.
Cifra (Afim). Seja m um inteiro positivo. Sejam P = C = Zm e K =
{(a, b) ∈ Z2m | (a, m) = 1}. Sejam x ∈ P e y ∈ C então definimos
ea,b (x) ≡ ax + b
e
da,b (y) ≡ a−1 (y − b)
32
mod m
mod m
3.8
Função φ de Euler
Definição. Seja n ≥ 1. O número de inteiros positivos menores ou iguais a
n que são primos com n é denotado por φ(n). Esta função de n é chamada
função φ de Euler
Assim, o conjunto das chaves K tem mφ(m) elementos. Recordamos
agora os seguinte resultados sobre a função φ.
Teorema 3.8. A função φ(n) é multiplicativa.
Demonstração: Sejam m e n inteiros positivos tais que (m, n) = 1.
Vamos meter os primeiros mn inteiros numa tabela com m colunas e n linhas.
1
m+1
2m+1
..
.
2
m+2
2m+2
..
.
...
...
...
..
.
m
m+m
2m+m
..
.
(n-1)m+1 (n-1)m+2 . . . (n-1)m+m
Os números na coluna j são m · 0 + j, m · 1 + j, m · 2 + j, . . . , m(n − 1) + j.
Temos, (ma + j, m) = (j, m), para qualquer inteiro a. Portanto, ou qualquer
elemento da coluna j é primo com m ou nenhum elemento da coluna j é primo
com m. Assim, há exactamente φ(m) colunas contendo inteiros primos com
m e qualquer elemento destas φ(m) colunas é primo com m.
Como (m, n) = 1, os n elementos de cada coluna j formam um sistema
completo de resı́duos mod n. Portanto, por definição, cada coluna j contém
exactamente φ(n) elementos primos com n. Donde, em cada uma das φ(m)
colunas que têm os elementos que são primos com m, há exactamente φ(n) elementos primos com n. Mais, estes são os únicos elementos que são ao mesmo
tempo primos com m e primos com n. Isto é, há exactamente φ(m)φ(n), elementos na tabela que são primos com m e, ao mesmo tempo, primos com
n.
Mas um inteiro é primo com mn se e só se for primo simultaneamente
com m e com n. Portanto,
φ(mn) = φ(m)φ(n)
2
e a função de Euler é multiplicativa.
33
Teorema 3.9. Suponhamos que a factorização de n em primos é a seguinte
n = pa11 pa22 · · · pakk
Então
∏
1
1
1
φ(n) = n(1 − )(1 − ) · · · (1 − ) =
(pai i − pai i −1 )
p1
p2
pk
i=1
k
Demonstração: Vamos começar por calcular φ(pa ), para p primo e a ≥
1. Um inteiro é primo com pa excepto se for divisı́vel por p. Os números de
1 a pa que são divisı́veis por p, são 1 · p, 2 · p, . . . , pa−1 p. Portanto,
1
φ(pa ) = pa − pa−1 = pa (1 − ).
p
Mas como a função φ(n) é multiplicativa, temos
φ(n) = φ(pa11 )φ(pa22 ) · · · φ(pakk )
1
1
1
= pa11 (1 − )pa22 (1 − ) · · · pakk (1 − )
p1
p2
pk
1
1
1
= pa11 pa22 · · · pakk (1 − )(1 − ) · · · (1 − )
p1
p2
pk
1
1
1
= n(1 − )(1 − ) · · · (1 − )
p1
p2
pk
2
3.9
Criptoanálise da Cifra Afim
Suponhamos que é interceptada uma mensagem que se sabe ter sido cifrada
usando um criptosistema afim, e que o alfabeto utilizado tem N = 26 letras.
As duas letras mais frequentes na mensagem são ”J”e ”C”. Sabe-se também
que a mensagem está em inglês, e que nesta lı́ngua, as letras mais frequentes
são o ”E”e o ”T”(ver figura 3.1). Deduzimos assim que, provavelmente, o
34
”E”foi cifrado em ”J”e que o ”T”foi cifrado em ”C”. Para determinar as
chaves só temos que resolver o sistema de congruências
10c + d ≡ 5 mod 26
3c + d ≡ 20 mod 26
Exemplo. Vamos decifrar a seguinte mensagem.
ICFMGTICJWARGIJGTRWNKJGFKWABGOKWFK
RWCBKAWJZMJGCCWKGCKJOKCKFKXJGFGNJM
GFMAAWFWLMOGFGCWTRWGKCMAAMKTGJMKFG
OKPMTVGSIWGBJWNWJMGSIWTRWSIWGFKXJG
FGWWJGGCKFGFKBKJRKTITOGAWOKCWNJMG
As letras mais frequentes são o G e o W, portanto assumimos que a foi
cifrado em G e e foi cifrado em W.
Obtemos as congruências 6u + v ≡ 0 mod 26 e 22u + v ≡ 4 mod 26.
Logo u = 10 ou u = 23, mas u tem de ser primo com 26, donde u = 23 e
v = 18.
Portanto, a = 17 e b = 6.
Exercı́cio. Decifre a mensagem que se sabe ter sido cifrada usando uma
cifra afim e que o texto plano está na lı́ngua portuguesa.
HJHRF MRHOH XHMIZ XDFJF HQRUI TMHHZ XDTYI
TMHZH JTXRD HHQZY HJZJF DRFUH YJZUI ZHFQT
SYRDF ZJVZM HYRXI FHDFU IZDZQ FMBTZ ZXIHX
HMIZX QFOZJ XZMZA QZMRJ ZUIHO HXQFM TJFTJ
HRXOF XUFXX FXXZU IROFXQ HMHXZ HQMZD
RHMHH MIZOH JHIZJ HIRDH IZJFX OZTIR YRWHM
FMHDR FDRUR FZTJY FUVFQ ZMRFO FOZIM ZRUFR
UIZUX REF
35
3.10
Cifra de Vigenère
Nas cifras estudadas até agora, dada uma chave, cada letra é transformada
numa só outra letra. Por esta razão, aqueles criptosistemas são denominados
mono-alfabéticos. A cifra de Vigenère, que vamos apresentar nesta secção, é
o primeiro exemplo de um criptosistema poli-alfabético.
Cifra (Vigenère). Sejam m e n inteiros positivos. Sejam P = C = K =
(Zm )n . Dada uma chave K = (k1 , . . . , kn ) e x ∈ P e y ∈ C, definimos
eK (x1 , . . . , xn ) ≡ (x1 + k1 , . . . , xn + kn ) mod m
e
dK (y1 , . . . , yn ) ≡ (y1 − k1 , . . . , yn − kn ) mod m.
O número de chaves possı́veis, dados m e n é mn .
Exemplo. Suponhamos que m = 26, n = 8 e a chave é PORTUGAL. Então
K = (15, 14, 17, 19, 20, 6, 0, 11). Queremos cifrar a frase
este criptosistema nao e seguro
Primeiro codificamos o texto plano depois ciframos grupos de 8 de cada vez
e adicionamos a chave mod 26, da seguinte maneira
4 18 19 4 2 17 8
15 14 17 19 20 6 0
19 6 10 23 22 23 8
12 0 13 0
11 15 14 17
23 15 1 17
14
19
7
4
20
24
15
11
3
18
6
24
19
15
6
4
0
4
6
11
17
14
14
2
20
15
9
18
17
9
17
14
5
A mensagem cifrada fica
TGKXWXIDGCJBMZEXPBRHYYERJFF
36
8
19
1
14
17
5
18
20
12
19
6
25
4
0
4
3.11
Criptoanálise da cifra de Vigenere
O primeiro passo para criptanalisar a cifra de Vigenere consiste em encontrar
o comprimento da palavra chave, que denotamos por n. Vamos estudar duas
técnicas que nos podem ajudar a encontrar n, nomeadamente o teste de
Kasiski e o ı́ndice de coincidência.
O teste de Kasiski foi pela primeira vez descrito por Friedrich Kasiski
em 1863. Este teste tem por base o facto de dois segmentos idênticos do
texto plano serão transformados no mesmo texto cifrado sempre que a sua
ocorrência no texto plano está com x posições de separação, com x ≡ 0
mod n. Reciprocamente, se forem observados no texto cifrado dois segmentos
idênticos com comprimento de pelo menos três letras, então há uma grande
chance que eles correspondam a segmentos idênticos do texto plano.
O teste de Kasiski funciona do seguinte modo: Primeiro procuramos no
texto cifrado pares de segmentos idênticos de comprimento maior ou igual a
3 e guardamos a distância entre o inı́cio de cada um dos dois segmentos. Se
obtivermos as distâncias d1 , d2 , . . . então conjecturamos que n divide o maior
divisor comum entre todas as distâncias.
Outro processo para estimar o valor de n, consiste em utilizar o ı́ndice de
coincidência desenvolvido por Wolfe Friedman em 1920.
Definição. Seja x = x1 x2 . . . xm uma lista de m letras. O ı́ndice de coincidência de x, que denotamos por Ic (x) é a probabilidade de que dois elementos de x sejam iguais. Denotemos as frequências de A, B, C, . . .(, Z) em x por
f0 , f1 , . . . , f25 . Como podemos escolher dois elementos de x de m2 maneiras
( )
e, para cada 0 ≤ i ≤ 25, há f2i maneiras de escolher dois elementos e ambos
serem i então,
∑25
fi (fi − 1)
Ic (x) = i=0
.
m(m − 1)
Se x é parte de um texto em inglês ou é um texto cifrado através de uma
cifra mono-alfabética, e pi são as probabilidades indicadas na figura 3.1 será
de esperar que
25
∑
Ic (x) ≈
p2i = 0.065.
i=0
A figura 3.3 apresenta os ı́ndices de coincidência de várias lı́nguas.
37
Português
Inglês
Francês
Italiano
Alemão
Japonês
Russo
Texto aleatório
0.0738
0.0661
0.0778
0.0738
0.0762
0.0819
0.0529
0.0385
Figura 3.3: Índices de Coincidência esperados
Vejamos agora como utilizar o ı́ndice de coincidência para determinar o
comprimento da palavra passe de uma cifra de Vigenere, n.
Suponhamos que y = y1 y2 . . . ym foi obtido através de uma cifra de Vigenere de um texto plano em inglês. Para cada inteiro r ≥ 1, escrevemos a
mensagem cifrada y, por colunas numa matriz do tipo r × m/r. Denotamos
por yi a linha i, desta matriz, com 1 ≤ i ≤ r. Se r = n então é de esperar
que Ic (yi ) seja aproximadamente 0.0661, para qualquer 1 ≤ i ≤ r. Se r ̸= n
então as listas yi serão mais aleatórias, pois foram obtidas utilizando cifras
de deslocamento com várias chaves. Como o ı́ndice de coincidência esperado
de uma lı́ngua é muito diferente do ı́ndice de coincidência esperado de um
texto aleatório, seremos capazes de descobrir o valor de n.
Após determinarmos o comprimento da palavra passe, cada yi é obtido
através de uma cifra de deslocamento de um texto plano na lı́ngua considerada e pode ser utilizada a análise de frequências para obter a palavra passe.
Quando o texto plano é pequeno, a análise de frequências pode não ser suficiente para conjecturar com grande convicção o valor da chave. Neste caso,
usamos o ı́ndice de coincidência mútua entre duas listas.
Definição. Sejam x = x1 x2 . . . xm e y = y1 y2 . . . yt listas com m e t letras,
respectivamente. O ı́ndice de coincidência mútua de x e y, que denotamos
por M Ic (x, y) é a probabilidade de um elemento de x ser igual a um elemento
de y. Se denotarmos as frequências de A, B, . . . , Z em x e y por f0 , f1 , . . . , f25
e g0 , g1 , . . . , g25 , respectivamente, então
∑25
fi gi
M Ic (x, y) = i=0
.
mt
Já vimos que cada yi é obtido através de uma cifra de deslocamento.
38
Seja K = (k1 , . . . , kn ) a palavra passe, então yi obtém-se somando ki a cada
i-ésima letra do texto plano. Vamos primeiro estimar M Ic (yi , yj ). Tirando
uma letra de yi e outra de yj , a probabilidade de serem ambas A é p−ki p−kj ,
a probabilidade de ambas serem B é p1−ki p1−kj , etc. (note que os ı́ndices são
reduzidos mod 26). Portanto,
M Ic (yi , yj ) ≈
25
∑
ph−ki ph−kj =
h=0
25
∑
ph ph+ki −kj .
h=0
Esta estimativa depende apenas da diferença ki − kj mod 26 à qual
chamamos deslocamento relativo de yi e yj . Mais, como
25
∑
ph ph+l =
h=0
25
∑
ph−l ph ,
h=0
um deslocamento relativo de u dá a mesma estimativa para M Ic que um
deslocamento relativo de 26 − u. Portanto precisamos apenas de calcular as
estimativas para os deslocamentos relativos entre 0 e 13.
Deslocamento relativo Valor esperado de M Ic
0
0.065
1
0.039
2
0.032
3
0.034
4
0.044
5
0.033
6
0.036
7
0.039
8
0.034
9
0.034
10
0.038
11
0.045
12
0.039
13
0.043
Verifica-se que um deslocamento relativo nulo dá um ı́ndice de coincidência mútua (M Ic ) muito distinto do M Ic correspondente a qualquer outro
deslocamento relativo. Podemos usar esta informação para tentar descobrir
u = ki − kj . Primeiro fixamos yi e vamos cifrar yj usando cada uma das
chaves g com 0 ≤ g ≤ 25 e denotamos a mensagem cifrada obtida, por yjg .
Em seguida, calculamos os ı́ndices M Ic (yi , yjg ), para cada 0 ≤ g ≤ 25,
39
∑25
fh,i fh−g,j
,
mt
onde fh,i e fh,j são as frequências da letra correspondente a h em yi e yj ,
respectivamente. Quando g = u o ı́ndice M Ic deve ser próximo de 0.065,
mas quando g ̸= u o ı́ndice deve ser relativamente menor. Para cada i e j
devemos calcular 14 ı́ndices, um para cada chave.
Vamos ilustrar estes métodos com o seguinte exemplo:
M Ic (yi , yig )
h=0
=
Exemplo. Sabemos que a seguinte mensagem foi cifrada utilizando um criptosistema de Vigenere.
CHREEV OAHMAE RATBIA XXWTNX BEEOPH BSBQMQ
EQERBW RVXUOA KXAOSX XWEAHB WGJMMQ MNKGRF
VGXWTR ZXWIAK LXFPSK AUTEMN DCMGTS XMXBTU
IADNGM GPSREL XNJELX VRVPRT ULHDNQ WTWDTY
GBPHXT FALJHA SVBFXN GLLCHR ZBWELE KMSJIK
NBHWRJ GNMGJS GLXFEY PHAGNR BIEQJT AMRVLC
RREMND GLXRRI MGNSNR WCHRQH AEYEVT AQEBBI
PEEWEV KAKOEW ADREMX MTBHHC HRTKDN VRZCHR
CLQOHP WQAIIW XNRMGW OIIFKE E
Primeiro, vamos tentar descobrir n utilizando o teste de Kasiski. O
trigrama CHR aparece cinco vezes na mensagem cifrada, começando nas
posições 1, 166, 236, 276 e 286. As distâncias da primeira ocorrência às outras são 165, 235, 275 e 285 e o máximo divisor comum entre estes valores é
5. Portanto, é de prever que o comprimento da palavra passe seja 5.
Vejamos se com o cálculo dos ı́ndices de coincidência chegamos à mesma
conclusão. Se r = 1, o ı́ndice de coincidência é 0.045. Se r = 2 obtemos
Ic (y1 ) = 0.046 e Ic (y2 ) = 0.041. Se r = 3 obtemos Ic (y1 ) = 0.043, Ic (y2 ) =
0.050 e Ic (y3 ) = 0.047. Para r = 4, obtemos os valores 0.042, 0.039, 0.046 e
0.040. Finalmente, para r = 5, obtemos 0.063, 0.068, 0.069, 0.061 e 0.072, o
que também sugere que n = 5.
Vamos agora tentar utilizar os ı́ndices de coincidência mútua para descobrir a palavra passe. Utilizando um programa no computador, calcula-se
todos os 260 valores de M Ic (yi , yjg ), com 1 ≤ i < j ≤ 5 e 0 ≤ g ≤ 25, e
40
procura-se os valores que forem próximos de 0.065. Dado um par (i, j), se
houver um único valor perto de 0.065, conjecturamos que esse é o valor do
deslocamento relativo.
Verifica-se haver grande evidência que o deslocamento relativo entre y1
e y2 seja 9; o deslocamento relativo entre y2 e y3 seja 13; o deslocamento
relativo entre y2 e y5 seja 7; o deslocamento relativo entre y3 e y5 seja 20;
o deslocamento relativo entre y4 e y5 seja 11. Obtemos assim as seguintes
equações nas cinco incógnitas k1 , . . . , k5 (todos os cálculos são efectuados
mod 26):
k1 − k2
k1 − k5
k2 − k3
k2 − k5
k3 − k5
k4 − k5
=
=
=
=
=
=
9
16
13
7
20
11.
Donde
k2
k3
k4
k5
=
=
=
=
k1 + 17
k1 + 4
k1 + 21
k1 + 10
Assim, a chave deve ser (k1 , k1 + 17, k1 + 4, k1 + 21, k1 + 10), para algum
0 ≤ k1 ≤ 25, ou seja, a chave é uma das sequências AREVK ou BSFWL ou
CTGXM. . . . A única destas sequências que faz sentido é JAN ET . Note-se
que a palavra passe não tem que fazer sentido. Nesse caso, podemos experimentar qualquer das possı́veis chaves até que uma dê um texto com sentido,
ou, se quisermos utilizar o computador, verificar qual delas é que corresponde
a um texto plano que tenha uma análise de frequências de acordo com a lı́ngua
que está a ser utilizada. Para a chave JANET Obtemos o texto plano
The almond tree was in tentative blossom. The days were longer,
often ending with magnificent evenings of corrugated pink skies.
41
The hunting season was over, with hounds and guns put away for
six months. The vineyards were busy again as the well-organized
farmers treated their vines and the more lackadaisical neighbors
hurried to do the pruning they should have done in November.
3.12
Cifra de Hill
Nesta secção descrevemos outro criptosistema polialfabético inventado em
1929 por Lester S. Hill.
Cifra (Hill). Sejam m e n inteiros positivos. Sejam P = C = (Zm )n e
K = {K ∈ Mn (Zm ) : Ké invertı́vel}. Dada uma chave


k1,1 k1,2 . . . k1,n
 k2,1 k2,2 . . . k2,n 


K =  ..
..
.. 
 .
.
. 
kn,1 kn,2 . . . kn,n
e x ∈ P e y ∈ C, definimos
e
eK (x1 , x2 , . . . , xn ) ≡ (x1 x2 . . . xn )K
mod m
dK (y1 , y2 . . . , yn ) ≡ (y1 y2 . . . yn )K −1
mod m.
Exemplo. Sejam m = 26, n = 2 e
(
K=
11 8
3 7
(
)
)
7 18
K =
23 11
Para cifrar o texto plano hill, dividimos primeiro nos dois grupos hi e ll e
efectuamos os produtos
(
)
(
) 11 8
(
)
7 8
= 23 8
3 7
e
(
)
(
) 11 8
(
)
11 11
= 24 9
3 7
A mensagem cifrada fica XIYJ.
Neste caso
−1
42
3.13
Ataque à cifra de Hill
A cifra de Hill é mais difı́cil de quebrar quando só se conhece a mensagem
cifrada, mas sucumbe muito facilmente quando se conhece um texto plano
que deu origem a uma mensagem cifrada. Vamos assumir que o oponente
conhece o valor de n (comprimento de cada parte do texto plano a ser cifrada
individualmente) e conhece pelo menos n pares distintos de n-uplos xj =
(xj,1 , xj,2 , . . . , xj,n ) e yj = (yj,1 , yj,2 , . . . , yj,n ), tais que yj = eK (xj ), com 1 ≤
j ≤ n. Sejam X = [xi,j ] e Y = [yi,j ], então Y = XK, onde K é a matriz da
chave desconhecida. Se X for invertı́vel, o oponente pode obter K = X −1 Y
e quebrar o sistema. Se X não for invertı́vel será necessário utilizar outros n
pares.
Exemplo. Suponha que o texto plano friday é cifrado utilizando uma cifra
de Hill com n = 2, obtendo-se PQCFKU. Então temos eK (5, 17) = (15, 16),
eK (8, 3) = (2, 5) e eK (0, 24) = (10, 20). Utilizando os dois primeiros pares,
obtemos a equação matricial
)
) (
(
5 17
15 16
K.
=
8 3
2 5
Como
)
)−1 (
(
9 1
5 17
=
2 15
8 3
a chave K é
(
K=
9 1
2 15
)(
15 16
2 5
)
(
=
7 19
8 3
)
.
Podemos utilizar o terceiro par para confirmar este resultado.
Mas pode acontecer (e é provável que aconteça) que o oponente não
conheça n. Neste caso, ele pode usar este processo utilizando n = 2, 3, . . . até
que a chave seja descoberta. Se um valor de n é incorrecto, então a matriz
K obtida utilizando este algoritmo não funcionará para outros pares texto
plano-texto cifrado. Portanto, n pode ser facilmente determinado.
3.14
Cifra de Permutação
Até agora todas as cifras estudadas envolveram substituições das letras do
texto plano por letras da mensagem cifrada. A ideia da cifra de permutação
43
(também chamada cifra de transposição) consiste em não alterar as letras do
texto plano, mas sim a sua posição. Este tipo de cifras tem sido utilizado
há centenas de anos, tendo Giovanni Porta notado, já em 1563, a distinção
entre estas cifras e as cifras de substituição.
Cifra (Permutação). Sejam m e n inteiros positivos. Sejam P = C = (Zm )n
e K consiste de todas as permutações de {1, . . . , n}. Dada uma chave π e
x ∈ P e y ∈ C, definimos
eπ (x1 , x2 , . . . , xn ) ≡ (xπ(1) , xπ(2) , . . . , xπ(n) )
e
dπ (y1 , y2 , . . . , yn ) ≡ (yπ−1 (1) , xπ−1 (2) , . . . , xπ−1 (n) ),
onde π −1 é a permutação inversa de π.
A cifra de permutação é um caso especial da cifra de Hill. A permutação
π de {1, . . . , n}, corresponde à matriz de permutação Kπ cuja entrada (i, j)
é 1 se i = π(j) e 0 caso contrário.
3.15
Cifras de Fluxo
Nos vários criptosistemas estudados, a chave K mantém-se fixa e é utilizada
para cifrar os sucessivos blocos de texto plano. Isto é, a mensagem cifrada,
y, é obtida da seguinte maneira:
y = y1 y2 · · · = eK (x1 )eK (x2 ) · · · .
Estes criptosistemas chamam-se Cifras de bloco. Nesta secção, vamos estudar
uma generalização das cifras de bloco, i. e. criptosistemas que usam um fluxo
de chaves.
Uma cifra de fluxo funciona da seguinte forma: Dada uma chave K ∈ K e
um texto plano x1 x2 · · · , é gerado um fluxo de chaves, digamos z = z1 z2 · · · ,
definido por
zi = fi (K, x1 , . . . , xi−1 )
e a mensagem cifrada é obtida da seguinte forma:
y = y1 y2 · · · = ez1 (x1 )ez2 (x2 ) · · · .
44
Assim, para cifrar o texto plano x1 x2 · · · , calcula-se sucessivamente os valores
z1 , y1 , z2 , y2 , . . . . Para decifrar y1 y2 · · · , calcula-se sucessivamente os valores
z1 , x 1 , z 2 , x 2 , . . . .
A formulação matemática é apresentada a seguir:
Definição. Uma cifra de fluxo é um heptuplo (P, C, K, L, F, E, D) satisfazendo as condições seguintes:
1. P é o conjunto finito dos textos planos possı́veis;
2. C é o conjunto finito dos textos cifrados possı́veis;
3. K é o conjunto finito das chaves;
4. L é o conjunto finito do alfabeto dos fluxos de chaves;
5. F = (f1 , f2 , . . . ) é o gerador de fluxos de chaves. Para cada i ≥ 1,
fi : K × P i−1 → L.
6. Para cada z ∈ L existe uma regra para cifrar ez ∈ E e uma regra para
decifrar correspondente dz ∈ D, tais que ez : P −→ C, dz : C −→ P e
dz (ez (x)) = x, para qualquer x ∈ P.
As cifras de bloco são um caso particular das cifras de fluxo, onde zi = k,
para qualquer i ≥ 1. Quando as funções fi só dependem da chave K, dizemos
que temos uma cifra de fluxo sincronizada. Neste caso, K é a semente que é
expandida para gerar o fluxo z1 z2 · · · .
Uma cifra de fluxo é periódica com perı́odo d se zi+d = zi , para qualquer
i ≥ 1. A cifra de Vegenere pode ser interpretada como uma cifra de fluxo
sincronizada e periódica, com perı́odo n. Neste caso, zi = ki , para 1 ≤ i ≤ n.
Em muitos criptosistemas de fluxo, utiliza-se P = C = L = (Z2 )n e cifrar
ou decifrar é adicionar mod 2, o que corresponde a efectuar a operação do
”ou”exclusivo, conhecida como XOR.
3.16
Cifra de Fluxo baseada no LFSR
Um método de geração do fluxo de chaves é o seguinte:
45
Suponhamos que temos uma chave K = (k1 , . . . , kn , c0 , . . . , cn−1 ) ∈ K.
Definimos zj = kj , para 1 ≤ j ≤ n, e geramos o fluxo de chaves através da
seguinte recorrência linear de grau n
zi+n ≡
n−1
∑
cj zi+j
mod 2,
j=0
para i ≥ 1.
Note que só estamos realmente a cifrar quando (k1 , . . . , kn ) ̸= (0, . . . , 0).
Se esta hipótese se verificar e se os valores c0 , c1 , . . . , cm−1 também não são
todos nulos, então vamos obter uma cifra de fluxo periódica de perı́odo 2n −1.
Portanto, uma chave inicial ”pequena”dá origem a um fluxo de chaves com
um perı́odo ”grande”.
As cifras A5/1, A5/2, utilizadas nos telemóveis GSM, e a cifra EO, utilizada no Bluetooth, são cifras do tipo LFSR.
Exemplo. Sejam n = 4, K = (1, 0, 0, 0) e o fluxo de chaves gerado por
zi+4 ≡ zi + zi+1
mod 2.
Então o fluxo de chaves é
1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, . . . .
e tem perı́odo 15 = 24 − 1.
Este método pode ser eficientemente implementado em Hardware utilizando um Linear feedback shift register (LFSR).
3.17
Criptoanálise da cifra de fluxo baseada
no LFSR
Vejamos um método para quebrar a cifra de fluxo baseada no LFSR, quando
se conhece um texto plano e a mensagem cifrada que lhe corresponde. Como
vimos, a mensagem cifrada é obtida adicionando o texto plano ao fluxo de
chaves módulo 2, i.e. yi = xi + zi . O fluxo de chaves é produzido a partir da
chave secreta z1 , . . . , zm e as relações de recorrência linear
46
zm+i ≡
m−1
∑
cj zi+j
mod 2,
j=0
onde c0 , . . . , cm−1 ∈ Z2 e c0 = 1.
Suponha que o oponente conhece o texto plano x1 , x2 , . . . , xn e a mensagem cifrada correspondente y1 , y2 , . . . , yn , então pode obter os valores zi ≡
xi + yi mod 2, para 1 ≤ i ≤ n. Suponhamos que o oponente também conhece o comprimento da chave secreta m. Então precisa apenas de determinar
c0 , c1 , . . . , cm−1 . Como para cada i ≥ 1, temos
zm+i ≡
m−1
∑
cj zi+j
mod 2,
j=0
que é uma equação linear com m incógnitas. Se n ≥ 2m então temos um
sistema de equações com m equações e m incógnitas e, portanto, pode ser
resolvido. A seguinte equação matricial descreve este sistema de equações

z1
z2
..
.


(zm+1 , zm+2 , . . . , z2m ) = (c0 , c1 , . . . , cm−1 ) 

z2
z3
..
.
...
...

zm
zm+1
..
.


.

zm zm+1 . . . z2m−1
Pode ser mostrado que a matriz tem inversa se m for o comprimento
da chave secreta (ver exercı́cio 1.9, pag 42, em Criptography: Theory and
Practice de Douglas Stinson). Neste caso, obtemos



(c0 , c1 , . . . , cm−1 ) = (zm+1 , zm+2 , . . . , z2m ) 

z1
z2
..
.
z2
z3
..
.
...
...
zm
zm+1
..
.
zm zm+1 . . . z2m−1
Vejamos um exemplo:
Exemplo. Suponhamos que Oscar obtém a mensagem cifrada
101101011110010
47
−1




.
correspondente ao texto plano
011001111111000.
Então o fluxo de chaves pode ser obtido somando bit a bit mod 2 os valores
anteriores. Portanto o fluxo de chaves será
110100100001010.
Então



(0, 1, 0, 0, 0) = (c1 , c2 , c3 , c4 , c5 ) 


1
1
0
1
0
1
0
1
0
0
0
1
0
0
1
1
0
0
1
0
0
0
1
0
0






Donde, após calcularmos a inversa da matriz e efectuar os restantes cálculos,
obtemos (c1 , c2 , c3 , c4 , c5 ) = (1, 0, 0, 1, 0). Portanto, a recorrência para gerar
o fluxo de chaves é
zi+5 ≡ zi + zi+3
48
mod 2.
Capı́tulo 4
Criptografia de chave pública
Os próximos sistemas criptográficos que iremos estudar há uma chave para
cifrar que é pública, mas a chave para decifrar é secreta e não pode ser obtida
a partir da chave pública. Antes de descrevermos estes sistemas, necessitamos
de recordar alguns resultados de teoria elementar dos números.
4.1
Teorema Chinês dos Restos
Na secção 3.6 vimos como resolver congruências da forma
ax ≡ b
mod n.
O próximo resultado diz-nos quando é que um sistema com duas congruências
tem solução.
Teorema 4.1. Se (m, n) = 1, então o sistema
{
x ≡ a mod m
x ≡ b mod n
Tem uma e uma só solução
mod mn.
Demonstração: Um inteiro x satisfaz a primeira equação se e só se
existe um inteiro t tal que
x = a + mt
(4.1)
Agora, a + mt satisfaz a segunda equação se e só se
mt ≡ b − a
49
mod n.
(4.2)
Como (m, n) = 1, esta última equação tem uma única solução, digamos c, i.
e.
t ≡ c mod n.
Portanto, t satisfaz (4.2) se e só se existe um inteiro k tal que t = c + nk.
Substituindo em (4.1), verificamos que x é solução do sistema se e só se
x = a + m(c + nk)
= (a + mc) + mnk
Logo, a + mc é solução do sistema e é única mod mn.
2
Este teorema é um caso especial de um resultado mais geral, que já era
conhecido dos chineses há mais de 2000 anos.
Teorema 4.2 (Teorema chinês dos restos). Sejam m1 , . . . , mk inteiros positivos que são primos entre si dois a dois. Então o sistema


x ≡ a1 mod m1


 x ≡ a2 mod m2
..

.


 x ≡ a mod m
k
k
tem uma única solução
mod (m1 m2 · · · mk ).
Demonstração: Iremos usar o teorema 4.1 (k − 1) vezes. Pelo teorema
4.1 as duas primeiras equações têm uma única solução mod (m1 m2 ). Seja
b2 esta solução, i. e.
x ≡ b2 mod m1 m2
(4.3)
A terceira equação é
x ≡ a3
mod m3 .
(4.4)
Como, por hipótese (m1 , m3 ) = (m2 , m3 ) = 1, então temos (m1 m2 , m3 ) = 1
(porquê?). Para resolver o sistema formado pelas equações (4.3) e (4.4),
podemos mais uma vez utilizar o teorema 4.1. Portanto, há uma única
solução de (4.3) e (4.4) mod ((m1 m2 )m3 ), i. e., há uma única solução
das três primeiras equações mod (m1 m2 m3 ). Continuando desta maneira,
50
depois de (k − 1) aplicações do teorema 4.1, obtemos uma única solução
mod (m1 m2 · · · mk ) do sistema
{
x ≡ bk−1 mod (m1 m2 · · · mk−1 )
x ≡ ak mod mk
Esta solução, digamos x ≡ bk mod (m1 m2 · · · mk ), é também a única solução
do sistema inicial mod (m1 m2 · · · mk ).
2
O próximo teorema permitir-nos-á encontrar uma solução do sistema


x ≡ a1 mod m1


 x ≡ a2 mod m2
..

.


 x ≡ a mod m
k
k
sem ter que utilizar diversas vezes o teorema 4.1.
Teorema 4.3. Sejam m1 , . . . , mk inteiros positivos que são primos entre
M
si dois a dois. Sejam M = m1 m2 · · · mk , Mi =
e yi o inverso de Mi
mi
mod mi , para qualquer 1 ≤ i ≤ k. Então
N = a1 M1 y1 + a2 M2 y2 + · · · ak Mk yk
é a única solução
mod M do sistema


x ≡ a1 mod m1


 x ≡ a2 mod m2
..

.


 x ≡ a mod m
k
k
Demonstração: Pelo teorema do resto chinês, sabemos que há uma
solução única mod M do sistema anterior. Portanto, basta-nos provar que
N é essa solução. Seja 1 ≤ i ≤ k. Como (Mi , mi ) = 1, então, pelo teorema
3.6, existe yi tal que Mi yi ≡ 1 mod mi . Mais, Mi ≡ 0 mod mj , para
qualquer j ̸= i. Então
N ≡ a1 M1 y1 + a2 M2 y2 + · · · ak Mk yk
≡ ai Mi yi mod mi
≡ ai Mi (Mi )−1 mod mi
≡ ai mod mi
51
mod mi
Portanto, N é solução da equação x ≡ ai mod mi , para qualquer 1 ≤ i ≤ k.
Donde, N é a única solução do sistema mod M .
2
Exemplo. A primeira menção conhecida do teorema chinês do resto é o
seguinte problema extraı́do do livro Sun Tzu Suan Ching (O Manual Matemático do Mestre Sun), escrito por Sun Zi, por volta do terceiro século a.c.
Temos um certo número de coisas, mas não sabemos exactamente
quantas são. Se formarmos grupos de três, sobram duas. Se
formarmos grupos de cinco, sobram três. Se formarmos grupos
de sete, sobram duas. Quantas coisas temos?
Resolver este problema equivale a

 x≡2
x≡3

x≡2
resolver o sistema
mod 3
mod 5
mod 7
Primeiro iremos usar o processo descrito no teorema do resto chinês. Da
primeira equação obtemos x = 2 + 3t, para algum inteiro t. Substituindo na
segunda equação, obtemos 2 + 3t ≡ 3 mod 5, donde 3t ≡ 1 mod 5, i. e.
t ≡ 2 mod 5. Portanto, t = 2 + 5k, para algum inteiro k, e
x = 2 + 3(2 + 5k) = 8 + 15k.
Substituindo este valor na terceira equação, obtemos
8 + 15k ≡ 2
mod 7.
Como 8 ≡ 15 ≡ 1 mod 7, resulta que k ≡ 1 mod 7. Assim, k = 1 + 7s,
para algum inteiro s. Portanto
x = 8 + 15(1 + 7s) = 23 + 105s.
Provámos que qualquer solução do sistema é da forma 23 + 105s, para s
inteiro, e a única solução mod (3 · 5 · 7) é 23.
Agora usamos o método descrito no teorema anterior. Aqui M = 105,
M1 = 35, M2 = 21 e M3 = 15. O inverso de 35 mod 3 é y1 = −1, o inverso
de 21 mod 5 é y2 = 1 e o inverso de 15 mod 7 é y3 = 1. Portanto,
N = 2 · 35 · (−1) + 3 · 21 · 1 + 2 · 15 · 1 = 23
52
4.2
Lagrange, Euler e Fermat
Seja G um grupo multiplicativo, definimos ordem de um elemento g ∈ G
como sendo o menor inteiro positivo m tal que g m = 1. Se G = (Z∗n , ·) então
G tem φ(n) elementos e, neste caso, definimos ordem de um elemento da
seguinte maneira:
Definição. Suponhamos que (a, n) = 1. Definimos a ordem de a mod n
como sendo o menor inteiro positivo, digamos b, para o qual
ab ≡ 1
mod n
e denota-mo-lo por ordn (a).
Por exemplo, ord13 (5) = 4, pois
51
52
53
54
≡ 5 mod 13
≡ −1 mod 13
≡ −5 mod 13
≡ 1 mod 13
Recordemos os famosos resultados:
Teorema 4.4 (Lagrange). Suponha que G é um grupo multiplicativo com n
elementos e seja g ∈ G. Então a ordem de g divide n.
Teorema 4.5 (Fermat). Se p é primo então bp ≡ b mod p
Teorema 4.6 (Euler). Se (b, n) = 1 então
bφ(n) ≡ 1
4.3
mod n.
Raı́zes primitivas
Quando p é primo, o grupo (Z∗n , ·) é cı́clico e os elementos que geram este
grupo são muito importantes em criptografia. Recordemos o nome destes
elementos e um resultado que nos diz quantos existem.
Definição. Se (a, n) = 1 e ordn (a) = φ(n) dizemos que a é uma raı́z primitiva de n.
Teorema 4.7. Seja p um primo e d | (p − 1). Então há exactamente φ(d)
inteiros distintos mod p cuja ordem mod p é d. Em particular, há exactamente φ(p − 1) raı́zes primitivas de p.
53
4.4
Exponenciação modular rápida
Antes de passar ao sistema RSA e outros sistemas de chave pública necessitamos ainda de um algoritmo que nos permita fazer exponenciações modulares
rápidas.
Teorema 4.8. Sejam n, m e b inteiros, com b < m. Então
tempo(bn
mod m) = O(log n log2 m)
Por um exercı́cio, calcular bn demora O(n2 log2 b) operações bit. Podemos determinar bn mod m dividindo bn por m o que nos dá O(n log b log m)
operações bit. Portanto, no total terı́amos
O(n2 log2 b) + O(n log b log m)
operações bit. Este valor é exageradamente superior a O(log n log2 m) se m
não for muito superior a n, portanto temos que utilizar um algoritmo muito
mais rápido que o indicado para calcular bn . Uma das ideias deste algoritmo
é nunca trabalhar com números muito grandes, i. e. sempre que fizermos
uma multiplicação, reduziremos logo de seguida o resultado mod m. Assim,
os inteiros envolvidos nos nossos cálculos nunca serão maiores que m2 .
Demonstração: Denotamos por a o produto parcial. Quando o algoritmo terminar, teremos a ≡ bn mod m. Começamos por tomar a = 1 e seja
n = (nk−1 · · · n1 n0 )2 a representação de n na base 2, onde k é o número de
bits de n.
Se n0 = 1, então tomar a = b, caso contrário a = 1. A seguir calculamos
b2 e seja b1 = b2 mod m.
Se n1 = 1, a passa a ser ab1 mod m, caso contrário a não é alterado.
Seja b2 = b21 mod m.
Se n2 = 1, a passa a ser ab2 mod m, caso contrário a não é alterado.
j
Continuando desta maneira, temos, no passo j, bj ≡ b2 mod m, com
bj < m. Se nj = 1, i. e. se 2j aparece na expansão binária de n, então
incluı́mos bj no produto para a, caso contrário, não incluı́mos bj . Depois de
k − 1 passos, obtemos
k−1
a ≡ bn0 +n1 2+···nk−1 2
≡ bn
mod m.
Em cada passo temos uma multiplicação e uma divisão, se nj = 0, ou duas
multiplicações e duas divisões se nj = 1, de números menores que m2 . Portanto, cada passo demora O(log2 m2 ) = O(log2 m) operações bit. Como
54
temos O(log n) passos, obtemos
tempo(bn
mod m) = O(log n log2 m).
2
4.5
RSA
O RSA foi inventado por Ron Rivest, Adi Shamir, e Leonard Adleman, no
MIT, em 1977.
Sejam p ̸= q dois primos grandes e seja n = pq. Já vimos que φ(n) =
(p − 1)(q − 1). Seja e um inteiro que é primo com φ(n). Os números n e e
são publicados, daı́ o nome de criptosistema de chave pública. A mensagem
a cifrar deve ser um número P ≤ n. A mensagem cifrada será o único inteiro
0 < C < n tal que
C ≡ P e mod n.
É importante notar que p, q e φ(n) são mantidos secretos. Como sabemos
φ(n), podemos usar o algoritmo de Euclides para encontrar um número d tal
que
ed ≡ 1 mod φ(n),
i. e. ed = 1 + φ(n)k, para algum inteiro k. Para decifrar a mensagem, basta
calcular o menor resı́duo não negativo de
Cd
mod n.
Vejamos porquê:
Se (P, n) = 1, o teorema de Euler diz-nos que
C d ≡ P ed ≡ P 1+φ(n)k ≡ P
mod n
Se (P, n) ̸= 1 então (P, n) = p ou (P, n) = q. Suponhamos que (P, n) = p.
Então (P, q) = 1, donde
{ d
C ≡ P ed ≡ 0 mod p
C d ≡ P ed ≡ P 1+φ(n)k ≡ P × (P q−1 )(p−1)k ≡ P mod q
55
Pelo teorema chinês dos restos, C d ≡ P mod n.
Portanto, para alguém decifrar a mensagem, ele tem que conhecer d e
n. Não basta saber e e n. Para calcular d ele tem de saber φ(n), o que
requer um conhecimento dos primos p e q. Ou seja, tem de saber factorizar
n. Se os primos p e q forem suficientemente grandes (por exemplo, milhares
de algarismos, cada um), então, com os mais potentes computadores e o
conhecimento matemático actual, é impossı́vel descobrir os factores de n
num perı́odo de tempo menor que um milhão de anos. Quem sabe p e q pode
calcular φ(n), mas um oponente que queira decifrar a mensagem, falhará,
pois não sabe os primos nem uma maneira rápida de factorizar n.
Suponha que o alfabeto tem N letras, e n = pq, seja k tal que N k < n <
N k+1 . Costuma-se codificar as mensagens originais em blocos de k letras,
mas descodifica-se as mensagens cifradas em blocos de k + 1 letras. Deste
modo qualquer mensagem pode ser codificada e qualquer mensagem cifrada
pode ser descodificada.
Exemplo. Considere n = 466883 e e = 139. Decifre ”IMYMLYJCNLSK”e
”LICASWZEKTIU”.
No sistema RSA, só a chave para decifrar d deve ser mantida secreta. A
chave para cifrar e e o módulo n podem ser publicados. Com os conhecimentos actuais é impraticável obter d sabendo e e n. Portanto, pode haver
uma lista pública (tipo lista telefónica) com o nome de cada utilizador, o seu
módulo n e o expoente público e (esta chave é usualmente a mesma para
vários utilizadores, devendo ser relativamente pequena para tornar o sistema
eficiente).
Para que a fatorização do módulo n seja impraticável os factores primos
de n devem ser escolhidos apropriadamente. Devido à força dos algoritmos
actuais para factorizar inteiros, p e q devem ter aproximadamente o mesmo
número de bits (mas não demasiado próximos), e com pelo menos 512 bits.
Se para um dos factores p, p − 1 tiver só factores primos ”pequenos”, então
o método de fatorização ”p − 1”irá permitir factorizar n.
4.5.1
Ataque do expoente público pequeno
A chave de cifrar e deve ser escolhida o mais pequena possı́vel, de modo a fazer
a cifra eficiente. A escolha e = 2 é impossı́vel porque φ(n) = (p−1)(q−1) que
é par. Portanto, a menor chave de cifrar possı́vel é e = 3. Porém, pode ser
perigoso usar chaves de cifrar demasiado pequenas, porque o inimigo pode
56
usar o ”ataque do expoente pequeno”: Este ataque funciona se a mesma
mensagem M é cifrada e vezes, usando sempre a chave de cifrar e e usando e
módulos ni primos dois a dois. Por exemplo, um banco pode enviar a mesma
mensagem M a alguns dos seus clientes usando os diferentes módulos RSA
destes clientes e sempre o mesmo e. Em seguida mostramos como este ataque
funciona. Sejam ci = ne mod ni , 1 ≤ i ≤ e as correspondentes mensagens
cifradas. Então o inimigo usa o seguinte algoritmo:
1. Calcular um inteiro c tal que c ≡ ci mod ni , onde 1 ≤ i ≤ e e 1 ≤ c ≤
n1 n2 · · · ne , usando o teorema chinês dos restos.
2. Determinar a raiz e de c, que vai ser M .
Para verificar que este algoritmo realmente funciona, basta notar que o
inteiro u = M e é menor que n1 n2 · · · ne (porque M < ni ) e que claramente
verifica as congruências u ≡ ci mod ni . Donde c = u, pelo teorema
chinês
√
e
dos restos (há unicidade de solução mod (n1 · · · ne )), e portanto c = M .
A raiz e de c pode ser calculada de um modo eficiente (por exemplo,
usando um generalização do algoritmo para obter a raiz quadrada). Portanto,
o ataque do expoente pequeno pode ser realmente eficiente. Porém, este
método falha se as mensagens originais forem diferentes, e isto pode ser
obtido se acrescentarmos à mensagem original alguns bits de texto aleatórios.
Podemos também usar um maior expoente para cifrar. Um valor muito
utilizado é e = 216 + 1.
4.6
Resı́duos quadráticos
Sejam p primo ı́mpar e a um inteiro, tais que p - a. Seja 1 ≤ x ≤ p − 1
então só um dos inteiros x, 2x, . . . , (p − 1)x é congruente com a mod p. Há,
portanto, um único x′ tal que
xx′ ≡ a
mod p
com 1 ≤ x′ ≤ p − 1. Dizemos que x′ está associado a x. Há duas possibilidades, ou existe pelo menos um 1 ≤ x ≤ p − 1, que está associado a si mesmo
ou não existe tal inteiro. Vamos analisar cada caso.
1. Suponhamos que há um inteiro x1 que está associado a si mesmo. Então
a congruência
x2 ≡ a mod p
(4.5)
57
tem a solução x = x1 . Neste caso, dizemos que a é um resı́duo
quadrático de p. Claramente, p − x1 é outra solução de (4.5). Mais, se
x2 é outra solução de (4.5), então
x21 − x22 ≡ 0 mod p
donde,
(x1 − x2 )(x1 + x2 ) ≡ 0 mod p.
Logo, x1 ≡ x2 mod p ou x1 ≡ −x2 ≡ p − x2 mod p. Portanto, a
equação (4.5) só tem duas soluções, que são x1 e p − x1 . Podemos
então agrupar os inteiros
1, 2, . . . , p − 1
p−3
em
pares de inteiros associados e diferentes, sobrando x1 e p − x1
2
que estão associados a si próprios. Temos
x1 (p − x1 ) ≡ −x21 ≡ −a
mod p
e, para cada par de associados x e x′ ,
xx′ ≡ a
Então
(p − 1)! =
p−1
∏
i ≡ −a · a
mod p.
p−3
2
≡ −a
p−1
2
mod p.
i=1
2. Se não há qualquer inteiro que esteja associado a si próprio, dizemos
que a é um não-resı́duo quadrático de p. Neste caso, a equação (4.5)
não tem soluções e os inteiros
1, 2, . . . , p − 1
podem ser agrupados em
Portanto,
p−1
pares de inteiros associados diferentes.
2
(p − 1)! =
p−1
∏
i≡a
i=1
58
p−1
2
mod p.
Seja p um primo ı́mpar (
e a)
um qualquer inteiro não divisı́vel por p. Definimos
a
o sı́mbolo de Legendre
, da seguinte maneira
p
( ) {
a
1
se a é um resı́duo quadrático de p
=
−1
se a é um não-resı́duo quadrático de p
p
( ) ( )
b
a
=
se a ≡ b mod p. Acabámos de provar o seguinte
Claramente,
p
p
teorema:
Teorema 4.9. Se p é um primo ı́mpar e a não é múltiplo de p, então
( )
p−1
a
(p − 1)! ≡ −
a 2
mod p.
p
Os dois casos mais simples deste teorema são a = 1 e a = −1. Como a
equação x2 ≡ 1 mod p tem as soluções 1 e −1, então
( )
1
=1
p
para qualquer primo ı́mpar. O próximo teorema é baseado neste exemplo
Teorema 4.10 (Wilson). Seja p primo, então
(p − 1)! ≡ −1
mod p
Demonstração: Se p é ı́mpar então
( )
1
=1
p
Logo, considerando a = 1 no teorema anterior, obtemos o resultado enunciado. Se p = 2, então (p − 1)! = 1, donde (p − 1)! ≡ −1 mod 2.
2
Juntando os dois resultados anteriores, obtemos um processo para calcular
o sı́mbolo de Legendre:
59
Teorema 4.11 (Lema de Euler). Sejam p um primo ı́mpar e a um inteiro
tais que p - a. Então
( )
p−1
a
=a 2
mod p.
p
Ao contrário do teorema de Fermat, o recı́proco do teorema de Wilson
também é válido, obtendo-se um teste de primalidade.
Teorema 4.12. Seja m > 1. Então m é primo se e só se
(m − 1)! ≡ −1
mod m
Demonstração: Atendendo ao resultado anterior, basta-nos considerar
m > 1 composto. Então existe um inteiro 1 < d < m tal que d | m. Mas
então d | (m − 1)!. Logo, d - ((m − 1)! + 1). Donde, m - ((m − 1)! + 1). 2
Infelizmente, este teorema parece ser inútil para verificar na prática se
um número é primo ou não.
Em seguida consideramos o caso a = −1.
Teorema 4.13. O inteiro −1 é um resı́duo quadrático para os primos da
forma 4k + 1 e um não-resı́duo quadrático para os primos da forma 4k + 3,
i. e.
( )
p−1
−1
= (−1) 2 .
p
Demonstração: Resulta imediatamente do teorema 4.11.
2
Em seguida, vamos introduzir outra caracterização do sı́mbolo de Legendre, obtida por Gauss.
Seja p um primo ı́mpar e consideremos o conjunto dos resı́duos mı́nimos:
p−1 p−3
p−1
S = {−
,−
, . . . , −2, −1, 1, 2, . . . ,
}.
2
2
2
Seja (a, p) = 1 e seja µ o número de resı́duos mı́nimos negativos dos inteiros
. Por exemplo, seja p = 7 e a = 4. Então
a, 2a, 3a, dotsa p−1
2
1 ∗ 4 ≡ −3 mod 7
2 ∗ 4 ≡ 1 mod 7
3 ∗ 4 ≡ −2 mod 7
60
Portanto, neste caso, µ =(2.) Os valores de µ irão permitir-nos obter uma
caracterização simples de ap .
( )
Lema 4.14 (Lema de Gauss).
a
p
= (−1)µ .
Demonstração: Seja ±ml o resı́duo mı́nimo de la, onde ml é positivo.
Claramente, µ é o número de ocorrências do sinal negativo, quando l toma
valores entre 1 e (p − 1)/2. Note que, se 1 ≤ l < k ≤ (p − 1)/2, então
ml ̸= mk . Suponhamos que ml = mk . Então
la ≡ ±ka
mod p.
Como p - a, temos l ≡ ±k mod p. Mas esta congruência é impossı́vel,
porque l ̸= k e
|l ± k| ≤ l + k ≤ p − 1.
Portanto, os conjuntos {1, 2, . . . , (p − 1)/2} e {m1 , m2 , . . . , m(p−1)/2 } coincidem. Multiplicando as congruências
1a ≡ ±m1 mod p
2a ≡ ±m2 mod p
..
.
p−1
a ≡ ±m p−1 mod p
2
2
obtemos
(
)
(
)
p−1
p−1
p−1
µ
!a 2 ≡ (−1)
! mod p.
2
2
Portanto,
a
p−1
2
≡ (−1)µ
mod p.
Pelo teorema 4.11, obtemos o resultado pretendido.
2
Este resultado, permite-nos, por exemplo, saber para que primos, 2 é um
resı́duo quadrático.
61
Teorema 4.15. O inteiro 2 é um resı́duo quadrático para os primos da forma
8k + 1 e 8k − 1 e um não-resı́duo quadrático para os primos da forma 8k + 3
e 8k + 5, i. e.
( )
p2 −1
2
= (−1) 8 .
p
Demonstração: Seja p um primo ı́mpar. Note que µ é igual ao número
de elementos do conjunto T = {2, 4, 6, 8, . . . , p − 1} que são maiores que p−1
.
2
Se p = 8k + 1 então (p − 1)/2 = 4k e há 2k elementos de T menores ou
iguais a (p − 1)/2 e 2k elementos maiores que (p − 1)/2. Portanto, µ é par e
2 é um resı́duo quadrático de p.
Se p = 8k −1 então (p−1)/2 = 4k −1 e há 2k −1 elementos de T menores
ou iguais a (p − 1)/2 e 2k elementos maiores que (p − 1)/2. Portanto, µ é
par e 2 é um resı́duo quadrático de p.
Se p = 8k + 3 então (p − 1)/2 = 4k + 1 e há 2k elementos de T menores
ou iguais a (p − 1)/2 e 2k + 1 elementos maiores que (p − 1)/2. Portanto, µ
é ı́mpar e 2 é um não-resı́duo quadrático de p.
Se p = 8k +5 então (p−1)/2 = 4k +2 e há 2k +1 elementos de T menores
ou iguais a (p − 1)/2 e 2k + 1 elementos maiores que (p − 1)/2. Portanto, µ
é ı́mpar e 2 é um não-resı́duo quadrático de p.
2
(
2
2
2
Os números 1 , 2 , 3 , . . .
se
p−1
2
)2
, são todos incongruentes mod p, pois
r 2 ≡ s2
mod p
então r ≡ s mod p ou r ≡ −s mod p, e a segunda alternativa é impossı́vel.
Mais,
r2 ≡ (p − r)2 mod p,
p−1
p−1
portanto, se p for ı́mpar, há
resı́duos quadráticos e
não-resı́duos
2
2
quadráticos de p.
Teorema 4.16. Seja p um primo ı́mpar. O produto de dois resı́duos quadráticos de p ou de dois não-resı́duos quadráticos de p é um resı́duo quadrático
de p, enquanto que o produto de um resı́duo quadrático com um não-resı́duo
quadrático é um não-resı́duo quadrático. Isto é,
( )( ) ( )
a
b
ab
=
p
p
p
62
Demonstração: Pelo teorema 4.11,
( )( )
p−1 p−1
b
a
≡a 2 b 2
p
p
p−1
= (ab) 2
( )
ab
=
p
Donde,
mod p
mod p
mod p
( )( ) ( )
b
ab
a
=
p
p
p
2
Sejam p e q dois primos ı́mpar distintos. Se q é um resı́duo quadrático de
p, então a congruência
x2 ≡ q mod p
é solúvel. Analogamente, se p é um resı́duo quadrático de q, então a congruência
x2 ≡ p mod q
também é solúvel. Não parece haver qualquer conexão óbvia entre estas
duas congruências. Uma das grandes descobertas da matemática efectuadas
no século XVIII é que, de facto, há uma relação poderosa e subtil entre as
congruências mencionadas, que depende apenas de p mod 4 e de q mod 4.
Esta é a celebrada lei da reciprocidade quadrática de Gauss. Iremos enunciar este resultado e ver alguns exemplos, no entanto, não provaremos este
resultado, pois seria demasiado pesada para esta introdução à Teoria dos
Números.
Teorema 4.17. Sejam p e q primos ı́mpar distintos. Se p ≡ 1 mod 4 ou
q ≡ 1 mod 4 então p é um resı́duo quadrático mod q se e só se q é um
resı́duo quadrático mod p. Se p ≡ q ≡ 3 mod 4, então p é um resı́duo
quadrático mod q se e só se q é um não-resı́duo quadrático mod p. Isto é
( )( )
p−1 q−1
p
q
= (−1) 2 2
q
p
63
Exemplo. A lei da reciprocidade quadrática dá-nos um método efectivo para
calcular o valor do sı́mbolo de Legendre. Por exemplo, como
7 ≡ 59 ≡ 3 mod 4,
e 59 ≡ 3 mod 7 temos
(
7
59
)
(
)
59
=−
7
( )
3
=−
7
( )
7
=
3
( )
1
=
3
=1
Portanto, 7 é um resı́duo quadrático de 59.
Exemplo. Como 51 = 3 · 17 e 97 ≡ 17 ≡ 1 mod 4, temos
( ) ( )( )
51
3
17
=
97
97
97
( )( )
97
97
=
3
17
( )( )
1
12
=
3
17
( )2 ( )
2
3
=
17
17
( )
17
=
3
( )
−1
=
3
= (−1)
= −1
64
3−1
2
Exemplo. A lei da reciprocidade quadrática também nos permite determinar
todos os primos p para os quais um dado inteiro a é um resı́duo quadrático.
Por exemplo, se a = 5, então
( ) ( ) {
5
p
1
se p ≡ 1, 4 mod 5
=
=
−1 se p ≡ 2, 3 mod 5
p
5
4.7
Algoritmo de Tonelli-Shanks
Teorema 4.18. Seja p um número primo tal que p ≡ 3 mod 4. Seja a um
inteiro que é um quadrado mod p (i. e., existe b tal que a ≡ b2 mod p).
p+1
Então a 4 é a raiz quadrada de a mod p.
p+1
Demonstração: Se a ≡ 0 mod p então, claramente, a 4 é a raiz
quadrada de a mod p. Suponhamos que a ̸≡ 0 mod p, então b ̸≡ 0 mod p.
Como p ≡ 3 mod 4, temos que p+1
é um inteiro. Basta-nos provar que o
4
p+1
quadrado de a 4 é congruente com a mod p. Temos
( )
p+1
p−1
a
2
4
2
(a ) ≡ a × a
≡a
≡ a mod p,
p
2
pelo Lema de Euler.
Embora o teorema anterior mostre que a determinação de raı́zes quadradas
mod p é muito simples quando p ≡ 3 mod 4, estas podem também ser calculadas qualquer primo ı́mpar, através do seguinte algoritmo, conhecido como
algoritmo de Tonelli-Shanks.
Dado p primo ı́mpar e n um resı́duo quadrático de p, pretende-se determinar uma solução da congruência x2 ≡ n mod p.
1. Sejam d e s inteiros positivos tais que m é ı́mpar e p − 1 = d2s , isto
é, divida-se p − 1 por 2 tantas vezes quantas for possı́vel (e denotamos
esse número de vezes por s), sendo d o resultado final.
2. Sejam r ≡ n
d+1
2
mod p, t ≡ nd mod p e s′ = s.
3. Determinar um não-resı́duo quadrático de p, que denotamos por z. Seja
c ≡ z d mod p.
65
4. Se t ≡ 1 mod p então r2 ≡ n mod p e, portanto, r é uma das raı́zes
quadradas de n. O algoritmo termina.
5. Caso contrário, determinar o menor i, com 1 ≤ i < s′ , tal que t2 ≡ 1
mod p.
i
s′ −i−1
6. Seja b ≡ c2
mod p, r passa a ser rb mod p, t passa a ser tb2
mod p, c passa a ser b2 mod p e s′ passa a ser i. Voltar ao passo 4.
p−1
Nota: Se p ≡ 3 mod 4, obtém-se nd ≡ n 2 ≡ 1 mod p, pelo lema de
Euler, portanto o passo 4. dá a solução mencionada no teorema anterior,
n
d+1
2
≡n
p+1
4
mod p.
Como n é um resı́duo quadrático mod p, tem-se
s′ −1
t2
≡n
p−1
2
≡1
mod p,
o que garante a existência de i nas condições indicadas no passo 5.
Note-se que em cada iteração do ciclo, tem-se r2 ≡ nt mod p, portanto
se t ≡ 1 mod p então r é uma das raı́zes quadradas de n.
Como z é um não-resı́duo quadrático então a ordem de c mod p é 2s o
que implica que a ordem de b2 mod p é 2i . Como a ordem de t também
era 2i , o novo t vai ter ordem 2j com j < i. Este facto, garante-nos que o
algoritmo vai ter de parar.
Exemplo. Vamos determinar a raiz quadrada de 143 mod 193. Como 193−
3+1
1 = 26 · 3, temos d = 3 e s = 6. Então r1 ≡ 143 2 ≡ 184 mod 193 e
t1 ≡ 1433 ≡ 64 ̸≡ 1 mod 193.
Um não-resı́duo quadrático de 193 é 5. Assim c1 ≡ 53 ≡ 125 mod 193. A
6−4−1
ordem de t mod 193 é 24 , portanto, i1 = 4. Obtemos assim, b1 ≡ 1252
≡
2
185 mod 193, r2 ≡ 184 · 185 ≡ 72 mod 193, c2 ≡ 185 ≡ 64 mod 193,
t2 ≡ 64 · 64 ≡ 43 mod 193 e s′2 = 4.
Continuando desta forma, obtemos as sequências (r1 , r2 , r3 , r4 , r5 ) = (184, 72, 169, 126, 23)
e (t1 , t2 , t3 , t4 , t5 ) = (64, 43, 112, −1, 1). Portanto 232 ≡ 143 mod 193.
4.8
Cifra de Rabin
Há vantagens em utilizar criptosistemas cuja segurança seja baseada na dificuldade de um problema matemático que também tenha interesse fora da
66
criptografia. Qualquer progresso significante para resolver este problema é
rapidamente tornado público, porque haverá muitos matemáticos a trabalhar
neste problema, sem estarem preocupados com a sua relevância criptográfica,
sendo assim difı́cil manter secreto o progresso que é feito sobre este problema
particular. Assim, evita-se (em princı́pio) que alguém secretamente quebre o
criptosistema e que tire vantagens de outros ainda usarem um ciptosistema
que não é mais seguro. Claro que não há maneira de saber com certeza absoluta se, por exemplo, alguém já descobriu um método eficaz de atacar o
RSA, talvez mesmo sem saber um algoritmo rápido para factorizar inteiros.
Até agora nunca foi provado que quebrar o RSA é tão difı́cil como factorizar inteiros. O sistema de Rabin, também é baseado na dificuldade que
factorizar inteiros, mas em contraste com o RSA, pode ser mostrado que
alguém que quebre o sistema de Rabin, pode também factorizar inteiros de
uma maneira eficiente (e portanto, pode também quebrar o RSA).
Tal como no RSA, precisamos de dois primos grandes p e q, só que neste
sistema costuma-se impor a condição adicional p, q ≡ 3 mod 4, para simplificar os cálculos. Note-se que o sistema funciona mesmo que os primos que
não verifiquem esta condição. A chave pública da Alice é n = pq, a chave
privada é o par (p, q). O espaço das mensagens originais é {0, 1, . . . , n − 1}.
Para cifrar a mensagem m ∈ {0, 1, . . . , n − 1}, Bob determina
c ≡ m2
mod n
Para decifrar a mensagem, Alice só tem que determinar a raiz quadrada
de c.
Para recuperar a mensagem original m da mensagem cifrada c, Alice
determina
p+1
q+1
mp ≡ c 4
mod p e mq ≡ c 4
mod q.
Assim ±mp são as duas raı́zes quadradas de c mod p e ±mq são as duas
raı́zes quadradas de c mod q. Usando o teorema chinês do resto, obtém-se
quatro inteiros x1 , x2 , x3 e x4 cujo quadrado é congruente com c mod p e um
deles é a mensagem original m.
Há vários métodos para escolher a mensagem original das quatro raı́zes
quadradas de c mod n. Por exemplo, Alice pode escolher aquela que faz
sentido após ter sido descodificada. Por vezes este método não funciona: por
exemplo, se a mensagem enviada é uma chave de um sistema criptográfico
clássico (também conhecido por sistema simétrico, i. e. onde não há chaves
67
públicas). Se Bob cifrar apenas mensagens com uma certa forma, por exemplo, os primeiros 64 bits são iguais aos últimos 64 bits, é pouco provável que
mais de uma das raı́zes quadradas tenha esta forma. Basta então escolher a
raiz quadrada que tem esta forma. Note-se que se é escolhido este método
para recuperar a mensagem original, a equivalência entre quebrar o sistema
de Rabin e factorizar inteiros, deixa de existir. Depois de ilustrarmos este
sistema com um exemplo simples, provaremos esta equivalência.
Exemplo. Alice usa os números primos p = 11 e q = 23. Então n = 253.
Bob cifra a mensagem m = 158 calculando
c ≡ m2
mod n.
Verifica-se que c = 170. Alice calcula
mp ≡ c
p+1
4
mod p e mq ≡ c
q+1
4
mod q,
obtendo mp = 4 e mq = 3. Usando o teorema chinês do resto, Alice obtém
quatro raı́zes quadradas de c mod n, que são 26, 95, 158, 227, uma delas é a
mensagem original.
Teorema 4.19. Quebrar o sistema Rabin é tão difı́cil como factorizar inteiros. Por outras palavras, se alguém descobrir um algoritmo que quebre
o sistema de Rabin, ele pode usar este algoritmo para factorizar inteiros de
uma maneira eficiente.
Demonstração: Claramente, qualquer pessoa que consiga factorizar n ,
consegue também quebrar o sistema de Rabin. Suponhamos agora que Olga
descobriu um algoritmo, R, para quebrar o sistema de Rabin. Seja n, o
módulo público, e sejam p e q, os seus factores primos. Dada uma mensagem
cifrada c mod n, Olga obtém m = R(c). Portanto, dado um quadrado
c mod n, o algoritmo R, permite determinarmos uma raiz quadrada de c
mod n. Vejamos como podemos usar este algoritmo para factorizar n: Olga
escolhe, aleatoriamente, um inteiro 1 ≤ x ≤ n − 1. Se (n, x) = d ̸= 1 então
d é um factor de n e a factorização de n está encontrada (n = d · nd ). Caso
contrário, Olga determina
c = x2
mod n e m = R(c).
Sabemos que m é uma das raı́zes quadradas, mod n, de c, tal como x, mas
não é necessariamente igual a x. No entanto, m satisfaz um dos seguintes
68
pares de congruências:
m≡x
m≡x
m ≡ −x
m ≡ −x
mod
mod
mod
mod
p
p
p
p
e
e
e
e
m ≡ x mod q
m ≡ −x mod q
m ≡ x mod q
m ≡ −x mod q
No primeiro caso, m = x e (m − x, n) = n; no segundo caso, (m − x, n) = p;
no terceiro caso, (m − x, n) = q e no último caso, m = n − x e, como
(n, x) = 1, obtemos (m − x, n) = 1. Portanto, este procedimento factoriza n
com 50% de probabilidade. Depois de aplicarmos este procedimento k vezes,
n é factorizado com probabilidade 1 − (1/2)k .
2
Exemplo. Seja n = 253. Suponhamos que Olga consegue determinar raı́zes
quadradas mod 253 com o seu algoritmo R. Ela selecciona, x = 17 e
obtém (17, 253) = 1. Depois calcula c ≡ 172 ≡ 36 mod 253. As raı́zes
quadradas de 36 mod 253 são 6, 17, 236 e 247. Temos (6 − 17, 253) = 11
e (247 − 17, 253) = 23, portanto, se o algoritmo R obteve 6 ou 247 então
Olga encontrou a factorização de 253, caso contrário, Olga escolhe outro inteiro x e aplica o procedimento outra vez. Depois de poucas aplicações é
muito provável que Olga tenha encontrado a factorização de n sem demorar
demasiado tempo.
4.9
Protocolo Diffie-Hellman
Nesta secção, é descrito o protocolo de Diffie e Helman para troca de chaves
secretas através de canais inseguros. Este protocolo não é um sistema criptográfico, mas serve de base ao sistema criptográfico ElGamal, que descreveremos na próxima secção.
Temos a seguinte situação: Alice e Bob pretendem usar um sistema
simétrico para a sua comunicação através de um canal inseguro. Primeiro
têm que trocar uma chave secreta que ambos irão utilizar. O sistema de troca
de chaves Diffie-Hellman, permite que Alice e Bob troquem as suas chaves e
mesmo que alguém intercepte esta troca de chaves, a informação obtida não
pode ser usada para construir a chave secreta.
69
O sistema de troca de chaves Diffie-Hellman utiliza um outro problema
difı́cil de teoria dos números, nomeadamente o problema do logaritmo discreto. Comecemos por descrever este problema:
Seja p um número primo e seja g uma raiz primitiva de p. Então g gera
o grupo cı́clico (Z/pZ)∗ . Portanto, para qualquer 1 ≤ A ≤ p − 1, existe
0 ≤ a ≤ p − 2 tal que
A ≡ g a mod p
a a chamamos o logaritmo discreto de A na base g. A determinação de
logaritmos discretos é considerado um problema difı́cil. Até agora, não existe
nenhum algoritmo eficiente para resolver este problema.
Voltemos ao protocolo de Diffie-Hellman. Primeiro, Alice e Bob chegam a
acordo sobre um primo p grande e uma raiz primitiva de p, digamos g. Tanto
p como g podem ser públicos. Em seguida, Alice escolhe aleatoriamente um
inteiro 0 ≤ a ≤ p − 2 e envia A ≡ g a mod p para Bob. O expoente a é
mantido secreto. Analogamente, Bob escolhe aleatoriamente 0 ≤ b ≤ p − 2,
e envia B ≡ g b mod p para Alice. Também b é mantido secreto. Para obter
a chave secreta comum, Alice calcula
B a ≡ g ab
mod p
Ab ≡ g ab
mod p.
e Bob calcula
A chave secreta é k ≡ g ab mod p.
O inimigo Orlando, conhece os inteiros p, g, A e B, mas não conhece os
logaritmos discretos a de A e b de B na base g. Portanto, ele conhece g a
mod p e g b mod p e gostaria de conhecer g ab mod p. Até agora, nunca foi
encontrado um algoritmo que permita obter k, sabendo A e B. O único
processo conhecido para quebrar o protocolo de Diffie-Hellman é conseguir
primeiro determinar os logaritmos discretos de A e de B, e os algoritmos
existentes para resolver este problema são pouco eficientes (demoram muito).
4.9.1
Ataque do homem no meio
Existe um ataque a este protocolo que explora o facto de Alice não poder
verificar que as mensagens que recebe vêm de facto de Bob. Este ataque
chama-se o ataque do homem no meio. Orlando intercepta todas as mensagens entre Alice e Bob. Faz-se passar por Bob e troca uma chave com
70
Alice e faz-se passar por Alice e troca uma chave com Bob. Sempre que
Bob envia uma mensagem cifrada a Alice, usa a chave que tinha trocado
com Orlando, pensando que esta a usar a chave de Alice. Orlando recebe a
mensagem e decifra-a, depois altera esta mensagem (ou não) e envia-a para
Alice usando a chave que tinha trocado com ela.
Para prevenir este tipo de ataques, podem ser usadas assinaturas. Este
assunto será tratado mais tarde.
4.10
Sistema ElGamal
Este sistema usa o facto de ser difı́cil obter logaritmos discretos, tal como o
protocolo de Diffie-Hellman.
Alice escolhe um número primo p e uma raiz primitiva g mod p. Depois,
Alice escolhe 0 ≤ a ≤ p − 2 aleatoriamente e calcula
A ≡ ga
mod p.
A chave pública de Alice é o terno (p, g, A). A sua chave secreta é o exponente a. O inteiro A é a parte da chave, proveniente do protocolo de DiffieHellman, que pertence a Alice. O espaço de mensagens originais é o conjunto
{0, 1, . . . , p − 1}. Para cifrar uma mensagem e enviá-la para Alice, Bob usa
a chave pública de Alice, (p, g, A). Escolhe um inteiro b ∈ {1, . . . , p − 2} e
calcula
B ≡ g b mod p.
O inteiro B é a parte da chave, proveniente do protocolo de Diffie-Hellman,
que pertence a Bob. Para cifrar a mensagem m, Bob calcula
c ≡ Ab m
mod p.
Bob envia a Alice o par (B, c). Note que B depende da chave pública de
Alice (depende de A, g e p escolhidos por Alice) e, portanto não faz parte da
chave pública de Bob, i. e. da chave que Bob usa para receber mensagens.
Na sua chave pública, Bob tem provavelmente outro primo q e outra raiz
primitiva de q.
Para decifrar a mensagem m, Alice determina x = p − 1 − a e calcula B x c
mod p que vai ser a mensagem original m pois
B x c ≡ g b(p−1−a) Ab m ≡ (g p−1 )b (g a )−b Ab m ≡ A−b Ab m ≡ m
71
mod p.
4.10.1
Ataque da repetição da chave efemera
Para cada nova mensagem que envie a Alice, Bob deve escolher um novo
expoente b, caso contrário o seguinte ataque permite decifrar as mensagens:
Se Bob escolher o mesmo expoente b para cifrar as mensagens m e m′ ,
ele obtém
c ≡ Ab m mod p e c′ ≡ Ab m′ mod p
donde
c′ c−1 ≡ m′ m−1
mod p
Um atacante que saiba m pode obter m′ , usando a fórmula
m′ ≡ c′ c−1 m
4.11
mod p.
Sistema Merkle-Hellman
Nesta secção descrevemos outro tipo de criptosistema que é baseado no problema do saco-mochila (em inglês, ”Knapsack”). Dados k inteiros v0 , . . . , vk−1
e um inteiro V , o problema Saco-mochila consiste em determinar se existe
um subconjunto dos k inteiros cuja soma seja V , i.e. se existem ϵi ∈ {0, 1},
tais que
k−1
∑
ϵi vi = V.
i=0
Note que podem haver imensas soluções, nenhuma solução, ou uma única
solução, dependendo dos vi ’s e de V . Um caso particular do problema sacomochila, é quando os vi ’s, ordenados de forma crescente, têm a propriedade de
que cada um é maior que a soma dos anteriores. Este caso especial é chamado
super crescente. Por exemplo, a sequência (2, 3, 7, 15, 31) é supercrescente.
Sabe-se que o problema geral do saco-mochila pertence à classe de problemas muito difı́ceis conhecidos como NP-completos (i. e. problemas NP
tais que qualquer outro problema NP se pode reduzir a eles). Os problemas
NP-completos têm a extraordinária propriedade de que se um deles estiver
na classe P (existir um algoritmo que o resolva em tempo polinomial), então
P=NP.
O problema do saco-mochila super crescente é, no entanto, muito mais
fácil de resolver. O seguinte algoritmo (de tempo polinomial) permite-nos
resolver qualquer problema do saco-mochila super crescente:
Seja v0 , . . . , vk−1 uma sequência super crescente e V um inteiro.
72
1. Faça W = V e j = k.
2. Se vi > W para 0 ≤ i ≤ j − 1 ir para o passo 4. Caso contrário,
determine o maior dos vi ’s, digamos vi0 , tal que vi0 ≤ W . Faça ϵi = 0
para i > i0 e ϵi0 = 1.
3. Substitua W por W − vi0 e j = i0 . Se W > 0, voltar ao passo 2.
4. Se W = 0 o algoritmo termina e encontrou-se a solução
ϵ = (ϵ0 , . . . , ϵk−1 ),
(que é única) do problema. Se W > 0, todos os restantes vi ’s são
maiores que W , portanto, não há solução do problema.
Exemplo. Considere a sequência (2, 3, 7, 15, 31) e V = 24. Então ϵ4 = 0,
ϵ3 = 1 (e substituimos 24 por 9), ϵ2 = 1 (e substitui-se 9 por 2), ϵ1 = 0 e
ϵ0 = 1. Portanto, a solução é ϵ = (1, 0, 1, 1, 0).
Estamos em condições de descrever o criptosistema de Merkle-Hellman
(também chamado sistema do saco-mochila), baseado no problema descrito
atrás. As mensagens originais vão ser inteiros com k bits. Por exemplo, se
usarmos o alfabeto de 27 letras (com o espaço em branco) e k = 5, temos a
codificação (letra a letra, neste caso) 2 = (00000)2 , A = (00001), . . . , Z =
(11010). Em seguida, escolhemos uma sequência super crescente v0 , . . . , vk−1 ,
um inteiro n > v0 + v1 + · · · + vk−1 e um inteiro 0 < a < n tal que (a, n) = 1
(costuma-se tomar n primo). Calculamos b ≡ a−1 mod n e a sequência de
inteiros positivos
wi ≡ avi mod n
para qualquer 0 ≤ i ≤ k − 1. A chave secreta de Alice consiste da sequência
dos vi ’s e dos inteiros n, a e b. A sua chave pública é (w0 , . . . , wk−1 ). Esta é
a chave para cifrar.
Se Bob pretende enviar uma mensagem m = (ϵk−1 · · · , ϵ0 )2 a Alice, usa a
chave {wi } e envia
k−1
∑
c≡
ϵ i wi .
i=0
Note que para determinar a mensagem original a partir de c um atacante
”só”tem que resolver um problema do saco-mochila mas, neste caso, este
problema é difı́cil porque a sequência {wi } não é super crescente.
73
Para decifrar c, Alice calcula V ≡ bc mod n. Como
bc ≡
k−1
∑
i=0
ϵi bwi ≡
k−1
∑
ϵi bavi ≡
i=0
k−1
∑
ϵ i vi
mod n
i=0
∑k−1
Então V =
i=0 ϵi vi (note que V < n). Como a sequência {vi } é super
crescente, Alice usa o algoritmo descrito atrás para obter a solução ϵ =
(ϵ0 , . . . , ϵk−1 ) e obtém a mensagem m = (ϵk−1 · · · , ϵ0 )2 .
Exemplo. Consideremos a codificação em bits do nosso habitual alfabeto de
27 letras. Tomemos a chave secreta
((v0 , . . . , vk−1 ), n, a) = ((2, 3, 7, 15, 31), 61, 17)
Então b = 18 e a chave de cifrar é (34, 51, 58, 11, 39). Queremos enviar
a mensagem ”SIM”. Temos que, ”S”= (10011)2 , ”I”= (01001)2 e ”M”=
(01101)2 . Portanto, enviamos os inteiros 124 = 34 + 51 + 39, 45 = 34 + 11 e
103 = 34+58+11. A mensagem cifrada 124, 45, 103 poderia ser descodificada
usando, neste caso, pares de letras. Como
18 · 124 ≡ 36 mod 61, 18 · 45 ≡ 17 mod 61 e 18 · 103 ≡ 24 mod 61
obtemos os inteiros 36, 17, 24. Em seguida, usamos a nossa sequência para
resolver o problema do saco-mochila para estes inteiros. Assim 36 = 31+3+2,
obtendo-se a letra (10011) =S, 17 = 15 + 2, obtendo-se (01001) =I, e 24 =
15 + 7 + 2, obtendo-se (01101) =M.
Durante algum tempo, houve algum optimismo acerca do uso deste criptosistema, porque a base da sua segurança é um problema que se sabe ser
NP-completo (os problemas factorização e logaritmo discreto, são NP, mas
não se sabe se são NP completos). Em 1982, Shamir encontrou um algoritmo
que permitia quebrar este sistema em tempo polinomial. Várias variações
deste sistema tem sido consideradas, tendo algumas sido também quebradas
(e. g. Brickell 1985). Uma das variações deste sistema que ainda não terá
sido quebrado é o sistema de Chor-Rivest, que não iremos descrever neste
curso.
74
Capı́tulo 5
Primalidade
Existem imensas situações em que podemos necessitar de saber se um inteiro enorme é primo. Por exemplo, nos sistemas criptográficos estudados
no capı́tulo anterior, precisamos quase sempre de pelo menos um primo
enorme e aleatório. Uma interpretação do que significa ”primo enorme e
aleatório”pode ser a seguinte: Primeiro geramos um inteiro ı́mpar n0 , usando um gerador de números aleatórios e depois testar a primalidade de n0 ,
n0 + 2, . . . até que encontremos o primeiro primo p ≥ n0 . Outra situação
em que se usam testes de primalidade, é quando se quer determinar se inteiros de formas muito especiais são ou não primos. Por exemplo, números
k
de Mersenne (da forma 2p − 1) ou números de Fermat (da forma 22 + 1).
Um teste de primalidade probabilı́stico é um critério para um número n
não ser primo. Se n passa uma aplicação de um teste de primalidade, então
pode ser que seja primo. Se n falha um teste de primalidade então é (obrigatoriamente) composto. Se passar muitas vezes um teste de primalidade então
tem grande probabilidade de ser primo (podendo por vezes ter-se a certeza
que é realmente primo). No caso de n ser composto ficamos ainda com o
problema de factorizar n. Com os algoritmos existentes consegue-se verificar
se um número com alguns milhares de algarismos é primo, com grande probabilidade (se n tiver uma forma especial, por exemplo se for um número de
Mersenne ou de Fermat, consegue-se atestar a primalidade de números com
milhões de algarismos), enquanto que só se consegue factorizar números (que
não tenham nenhuma forma particular) com perto de 200 algarismos.
75
5.1
Teste de Fermat
Antes de descrevermos este teste de primalidade recordemos algumas definições
de teoria elementar dos números.
Definição. Seja a > 1 um inteiro positivo. Chamamos pseudoprimo para a
base a a um composto n tal que (a, n) = 1 e n | (an − a).
Definição. Um composto n que é pseudoprimo para qualquer base a, tal
que (a, n) = 1 chama-se número de Carmichael.
Exemplo. Os números 561, 1105 e 6601 são números de Carmichael.
O teste de Fermat é baseado no Pequeno Teorema de Fermat. Dados n e
1 < a < n, o teste consiste verificar se an−1 ̸≡ 1 mod n. Podemos aplicá-lo
usando sucessivas bases a: Dado um inteiro n, começamos por calcular
a ≡ 2n−1
mod n
se a ̸= 1 então n é composto. Se a = 1, calculamos
b ≡ 3n−1
mod n
Caso b ̸= 1, temos que n é composto. Se b = 1 calculamos 5n−1 mod n e
assim sucessivamente.
Infelizmente, há inteiros que passam este teste para qualquer base, os
chamados números de Carmichael. Portanto, não é possı́vel provar que né
primo, usando sucessivas aplicações deste teste.
Exemplo. Considere n = 341. Temos 2340 ≡ 1 mod 341. Mas 3340 ≡ 56
mod 341. Portanto, 341 é composto. De facto, 341 = 11 · 31. Provámos
também que 341 é pseudoprimo para a base 2 mas não é pseudoprimo para
a base 3.
Note que este teste, embora prove que n é composto, não dá qualquer
indicação sobre os factores de n. Só mostra que a n falta uma propriedade
que todos os primos têm.
76
5.2
Teste de Miller-Rabin
Nesta secção, descrevemos o teste de Miller-Rabin. Contrariamente ao teste
de Fermat, para este teste não há inteiros correspondentes aos números de
Carmichael, i. e. o teste de Miller-Rabin pode provar que é de facto primo
qualquer inteiro que passe o teste um número suficiente de vezes.
Teorema 5.1. Seja n um primo ı́mpar e sejam s e d tais que n − 1 = 2s d,
com d ı́mpar. Se a é um inteiro tal que (a, n) = 1, então ou
ad ≡ 1 mod n
ou existe 0 ≤ r ≤ s − 1 tal que
rd
a2
≡ −1
mod n
Demonstração: Seja a tal que (a, n) = 1. Como n é primo temos que
φ(n) = n−1 = 2s d. Donde, k = ordn (ad ) é uma potência de 2. Se k = 1 = 20 ,
temos que
ad ≡ 1 mod n.
Se k > 1 então existe 1 ≤ l ≤ s tal que k = 2l e
l
a2 d ≡ 1 mod n.
Mas então a2 d ̸≡ 1 mod n e a2 d tem ordem 2 mod n. Logo a2 d é
solução da congruência x2 ≡ 1 mod n. Como n é primo, as únicas soluções
desta congruência são 1 e −1. Portanto,
l−1
l−1
a2
l−1 d
l−1
≡ −1 mod n
2
Definição. Seja n um composto ı́mpar, e sejam s e d tais que n − 1 = 2s d,
com d ı́mpar. Seja a tal que (a, n) = 1. Se n e a satisfazem a condição
rd
ad ≡ 1 mod n ou existe 0 ≤ r ≤ s − 1 tal que a2
≡ −1 mod n (5.1)
então dizemos que n é pseudoprimo forte para a base a.
77
Definição. Dizemos que um inteiro a é uma testemunha de que n é composto
se (a, n) = 1 e a condição (5.1) não é verificada.
Dados a e n, o teste de Miller-Rabin, consiste em verificar se a condição
(5.1) é ou não verificada por estes inteiros. Se n falhar esta condição então
n é composto e a é uma sua testemunha.
Exemplo. Seja n = 561. Já vimos que n é um número de Carmichael,
portanto o teste de Fermat não dá para provar que n é composto. Temos que
560 = 24 · 35. Consideremos a = 2. Então
235 ≡ 263 mod 561
22·35 ≡ 166 mod 561
22
2 ·35
23 ·35
2
≡ 67 mod 561
≡ 1 mod 561
Portanto, 561 é composto e o inteiro 2 serve para testemunhar este facto.
Para que o teste de Miller-Rabin seja eficiente, é importante que exista um
número suficiente de testemunhas para cada composto. O próximo resultado
mostra que há imensas testemunhas.
Teorema 5.2. Seja n ≥ 3 um composto ı́mpar. O conjunto {1, . . . , n − 1}
contém no máximo n−1
números que são primos com n e não são testemunhas
4
de que n é composto.
Suponhamos que n é um inteiro ı́mpar enorme que queremos verificar se é
primo ou não. Seja 1 < a < n − 1 escolhido aleatoriamente. A probabilidade
de n ser composto e a não ser uma testemunha é, no máximo, 0.25. A
probabilidade de escolhermos k inteiros a que não sejam testemunha é menor
que
1
.
4k
Portanto, se um inteiro n passa o teste de Miller-Rabin k vezes, é muito
provável que seja primo (com probabilidade pelo menos 1 − 1/4k ). Para
k = 20, a probabilidade de ser composto tendo passado o teste de MillerRabin k vezes é 1 em um bilião. No entanto, note-se que este teste não nos
garante que n seja de facto primo.
Já vimos que, dado um composto n, há mais de 3(n − 1)/4 testemunhas
no intervalo [2, n − 2]. Será que há um número B, independente de n, tal
78
que há sempre uma testemunha a < B de que n é composto? Infelizmente, a
resposta a esta pergunta é não (provado por Alford, Granville e Pomerance).
No entanto, se a Hipótese de Riemann extendida (ERH) for verdade, temos
o seguinte resultado
Teorema 5.3. Seja n um número composto. Admitindo a ERH, há uma
testemunha a, com a < 2 log2 n de que n é composto.
Portanto, se ERH for verdadeira, existe um algoritmo polinomial para
verificar se n é primo, baseado no teste de Miller-Rabin.
5.3
Teste de Solovay-Strassen
O próximo teste que iremos estudar é baseado no lema de Euler sobre o
sı́mbolo de Legendre, já estudado. Comecemos por definir o sı́mbolo de
Jacobi, que é uma generalização do sı́mbolo de Legendre.
∏
Definição. Seja a um inteiro e n = ki=1 pai i um inteiro ı́mpar. Define-se o
sı́mbolo de Jacobi, da seguinte maneira
( )a i
(a) ∏
a
k
=
i=1
,
n
pi
( )
onde ap é o sı́mbolo de Legendre.
Para o sı́mbolo de Jacobi também é válida a lei da reciprocidade quadrática,
i. e., se m e n são inteiros impares
(m)
(n)
m−1 n−1
= (−1) 2 2
.
n
m
O lema de Euler diz-nos que se p um primo ı́mpar e a um inteiro tais que
p - a. Então
( )
p−1
a
=a 2
mod p.
p
Dado um inteiro ı́mpar n e a um inteiro, o Teste de Solovay-Strassen
consiste em verificar se
(a)
n−1
2
≡
mod n.
a
n
79
Definição. Um inteiro n composto que passe o teste de Solovay-Strassen
para um dado a é chamado pseudoprimo de Euler-Jacobi para a base a
Teorema 5.4. Para qualquer número composto n há pelo menos n/2 bases
menores que n tais que n não é um pseudoprimo de Euler-Jacobi para qualquer uma dessas bases.
5.4
Teste n − 1 de Lucas
Nas secções anteriores encontrámos alguns testes probabilisticos para verificar se n é composto. O próximo teste é determinista, i. e. se n passar o
teste então n é de facto primo.
Teorema 5.5 (Lucas). Se a e n são inteiros com n > 1, e
an−1 ≡ 1 mod n, mas a
n−1
q
̸≡ 1 mod n para qualquer primo q | n − 1
então n é primo.
Demonstração: A primeira condição implica que ordn (a) | n − 1. A
segunda condição, mostra que ordn (a) não é um divisor próprio de n − 1.
Portanto, ordn (a) = n − 1. Mas pelo teorema de Euler, ordn (a) | φ(n),
donde n − 1 ≤ φ(n). Mas se n é composto, φ(n) < n − 1, portanto, n é
primo.
2
Para usarmos o teorema de Lucas, é necessário saber a factorização em
primos de n − 1, e em geral essa factorização pode ser difı́cil de encontrar.
Além disso, se n é de facto primo, temos que tomar a uma raiz primitiva de
n. Sabemos que há φ(n − 1) raı́zes primitivas, mas estas podem ser difı́ceis
de encontrar. No entanto, para inteiros com formas especiais, o teorema de
Lucas, permite-nos obter um teste muito eficiente.
Teorema 5.6 (Teste de Pepin). Para k ≥ 1, o número Fk = 22 + 1 é primo
se e só se
Fk −1
3 2 ≡ −1 mod Fk .
k
Demonstração: Seja k ≥ 1. Suponhamos que
3
Fk −1
2
≡ −1 mod Fk
80
então o teorema de Lucas diz-nos que Fk é primo. Reciprocamente suponhamos que Fk é primo. Como 2k é par, então
k
22 ≡ 1 mod 3,
donde Fk ≡ 2 mod 3. Mas Fk ≡ 1 mod 4, logo
( )
3
= −1
Fk
Pelo teorema 4.11, obtemos a congruência desejada.
2
Teorema 5.7 (Teste de Lucas-Lehmer). Seja s0 = 4 e si = s2i−1 − 2. Então
Mp = 2p − 1 é primo se e só se sp−2 ≡ 0 mod Mp .
81
Capı́tulo 6
Factorização
Neste capı́tulo, vamos descrever alguns algoritmos importantes de factorização. Iremos assumir que n é composto. Este facto pode ser provado
usando, por exemplo, um dos algoritmos do capı́tulo anterior.
Em muitos dos algoritmos de factorização, verifica-se primeiro, por experimentação, se n é divisı́vel por números primos pequenos, e. g. p ≤ B,
com B fixo.
Exemplo. Queremos factorizar n = 321 +1 = 10460353204. Experimentando
primeiro todos os primos menores que 50, verifica-se que
n = 22 · 72 · 43 · 1241143.
Seja m = 1241143. Como 2m−1 ≡ 793958 mod m, o pequeno teorema de
Fermat implica que m é composto. Ficamos ainda com a tarefa de factorizar
m.
6.1
Método p − 1 de Pollard
Há algoritmos de factorização que funcionam muito bem para inteiros compostos que verificam certas propriedades. O método p − 1, é um desses
algoritmos e foi inventado por John Pollard. Suponhamos que n é composto
e que tem um factor primo p, tal que p − 1 só tem divisores primos pequenos.
Então é possı́vel obter um múltiplo k de p − 1 sem sabermos o valor de p − 1.
Basta tomar k como sendo o mı́nimo múltiplo comum de todos os inteiros
até um limite B. Podemos também tomar k como sendo B!.
82
Definamos k = k(B) = [2, 3, 4, . . . , B], onde [a, b] representa o mı́nimo
múltiplo comum de a e b. Se n tiver um divisor primo p tal que todos os
divisores de p − 1 que são potências de primos forem menores que k, então
p − 1 | k. O pequeno teorema de Fermat, implica que
ak ≡ 1 mod p,
para qualquer inteiro a, tal que (a, p) = 1. Portanto, p | (ak − 1). Se
n - (ak − 1) então (ak − 1, n) é um divisor próprio de n.
O algoritmo consiste em começar com um limite B e uma base a. Se
k
(a − 1, n) não der um divisor próprio de n (i. e. se (ak − 1, n) = 1 ou
(ak − 1, n) = n), então experimenta-se outro limite B ou outra base a.
Exemplo. Continuando o exemplo anterior, vamos agora factorizar m =
1241143. Seja B = 13, então
k = 8 · 9 · 5 · 7 · 11 · 13
e
(2k − 1, m) = 547.
Então p = 547 é um divisor de n. Portanto, m = 547 · 2269. Facilmente, se
verifica que 547 e 2269 são primos.
6.2
Método ró de Pollard
Nesta secção, vamos analisar outro método de factorização introduzido por
J. Pollard. Sejam l um inteiro e f uma função aleatória de S = {0, 1, . . . , l}
para S. Seja x0 um elemento aleatório e considere-se a sequência
x0 , x1 = f (x0 ), x2 = f (x1 ), . . . .
Como S é finito, a sequência irá tornar-se cı́clica ao fim de um certo número
de termos. Se fizermos um diagrama que mostre este comportamento, ele
assemelhar-se-á a ρ, daı́ a origem do nome do método.
Seja n um inteiro composto. O primeiro passo do método ró, consiste em
escolher uma função f de Z/nZ para Z/nZ que seja fácil determinar f (x).
Costuma-se usar polinómios com coeficientes inteiros, e. g. f (x) = x2 + 1.
Em seguida, toma-se um inteiro positivo x0 , e. g. x0 = 1 ou x0 = 2.
83
Calculam-se as sucessivas iterações xk = f (xk−1 ) mod n. Depois fazemse comparações entre diferentes xi ’s, esperando encontrar dois que sejam
diferentes mod n mas que sejam iguais mod l para algum divisor próprio l
de n. Quando encontrarmos xj e xk nestas condições (i. e. xj ≡ xk mod l),
temos que (xj − xk , n) é um divisor próprio de n. Assim como está, este
método irá tornar-se moroso, pois ao fim de k iterações temos de comparar
aproximadamente k 2 pares de valores. Note que se xj ≡ xk mod l e sendo
m ≥ 0, temos
xj+m ≡ xk+m mod l
Portanto, em vez de efectuar todas as comparações possı́veis podemos apenas
fazer uma comparação em cada iteração. Por exemplo, podemos calcular
somente
(x2i − xi , n)
em cada iteração i. Podemos também calcular, na iteração k com 2j ≤ k <
2r+1 , o máximo divisor comum
(xk − xj , n)
onde j = 2j − 1.
Exemplo. Vamos factorizar 4087 usando f (x) = x2 + 1 e x0 = 3. Obtemos
sucessivamente
x1 = 10, x2 = 101 (101 − 10, 4087) = 1
x2 = 101, x4 = 1263 (1263 − 101, 4087) = 1
x3 = 2028, x6 = 889 (2028 − 89, 4087) = 67
Portanto, 67 | 4087. Dividindo, obtem-se 4087 = 67 · 61.
Exemplo. Sejam n = 845651, f (x) = x2 + x + 1 e x0 = 2. Verifica-se que
(x1 0 − x7 , n) = 571. Portanto, n = 571 · 1481.
Teorema 6.1. O método ró permite encontrar um factor de n em
√
O( 4 n log3 n)
operações com uma grande probabilidade. Mais exactamente, existe uma constante C tal que, para qualquer inteiro positivo λ, a√probabilidade
de o método
√
3
4
ró não encontrar um factor não trivial de n em C λ n log n operações bit,
é menor que exp(−λ).
84
O teorema anterior garante-nos que este método é, com uma grande probabilidade, significativamente
mais rápido que irmos experimentando todos os
√
primos até n. O resultado mais espectacular, usando este método ocorreu
8
em 1981, quando Brent e Pollard factorizaram completamente F8 = 22 + 1.
A seguinte mnemónica de J. Pollard, permite-nos recordar um dos factores
de F8
I am now intirely persuaded to employ rho method, a handy trick,
on gigantic composite numbers
6.3
Factorização de Fermat
Suponhamos que n é o produto de dois primos p e q próximos um do outro.
Então n é a diferença de dois quadrados, um dos quais é pequeno. Neste caso,
há um processo eficiente de factorizar n chamado factorização de Fermat. Por
este motivo deve-se evitar usar tais inteiros n como chave pública, tanto no
RSA como no sistema de Rabin.
Teorema 6.2. Seja n um inteiro positivo ı́mpar. Há uma correspondência
bijectiva entre factorizações de n da forma n = ab, com a ≥ b > 0, e
representações de n na forma t2 − s2 , onde t e s são inteiros não negativos.
A correspondência é dada pelas equações
t=
a+b
a−b
, s=
a=t+s b=t−s
2
2
Demonstração: Se n = ab então
(
)2 (
)2
a+b
a − b2
−
n=
2
2
donde n pode ser escrito como a diferença de dois quadrados. Se n = t2 − s2
então n = (t − s)(t + s). Obtemos assim a correspondência bijectiva.
2
Se n = ab e a e b estão
√ próximos um do outro, então s é pequeno e t é
ligeiramente maior que n. Neste caso,
√ podemos factorizar n, experimentando valores para t, começando por [ n] + 1, até que se encontre um para
o qual t2 − n é um quadrado perfeito.
85
√
Exemplo. Seja n = 200819. Começamos com [ n] + 1 = 449. Agora,
4492 − 200819 = 782 que não é um quadrado perfeito. Em seguida, tentamos
t = 450. Temos 4502 − 200819 = 1681 = 412 , donde
n = (450 + 41)(450 − 41) = 491 · 409.
Note que se a e b não estiverem próximos, este método ainda serve para
factorizar n, mas só após termos usado imensos valores para t, o que o pode
tornar muito moroso. Há uma generalização do método de Fermat que funciona melhor nesta situação. Começamos por escolher um multiplicador k
pequeno e tomamos
√
√
t = [ kn] + 1, t = [ kn] + 2, . . .
até que obtenhamos um t para o qual t2 − kn = s2 é um quadrado perfeito.
Então d = (t + s, n) é um factor não trivial de n.
Exemplo. Seja n = 141467. Se usarmos a factorização de Fermat directamente, precisamos de experimentar 38 t’s até encontrar
um factor de n. Mas
√
se tomarmos k = 3 e começarmos com t = [ 3n] + 1 = 652, rapidamente
vemos que 6552 − 3n = 682 . Como (655 + 68, n) = 241, concluı́mos que
n = 241 · 587. Portanto, com k = 3 só precisamos de experimentar 4 t’s.
Mas como sabemos que devı́amos usar k = 3 no exemplo anterior? Uma
maneira de resolver este problema é utilizando o método de Lehman (que é
uma generalização do método de Fermat).
√
A ideia deste método é experimentarmos todos os k até [ 3 n] e para cada
um desses k’s , experimentar somente
[√
]
6
n
√
4 k
valores
se n tem algum divisor
√ de t. Mais exactamente, primeiro verifica-se
√
d ≤ 3 n. Caso contrário, para cada 1 ≤ k ≤ [ 3 n], experimenta-se, para cada
t inteiro no intervalo
(
]
√
6
√
√
n
2 kn − 1, 2 kn + √ ,
4 k
se t2 − 4kn é um quadrado perfeito s2 . Caso seja, determina-se d = (t + s, n)
que é um factor não trivial de n. Caso não se encontre um quadrado perfeito,
podemos concluir que n é primo.
Para provarmos que este algoritmo de facto funciona, necessitamos do
seguinte resultado de Dirichlet:
86
Teorema 6.3 (da Aproximação de Dirichlet). Para qualquer número real θ
e qualquer inteiro positivo m, existem inteiros a e b, com 1 ≤ a ≤ m tais que
|aθ − b| ≤
1
.
m+1
Demonstração: No que se segue iremos representar a parte inteira e a
parte fraccionária de um número real x por [x] e {x}, respectivamente.
Suponhamos que m = 1. Se {θ} ≤ 12 , basta tomar a = 1 e b = [θ], se
{θ} > 12 , basta tomar a = 1 e b = [θ] + 1. Suponhamos agora que m > 1 e
consideremos os m + 2 números reais, 0, 1 e
ra = {aθ} = aθ − [aθ],
onde 1 ≤ a ≤ m. Note que se ri ≥ rj e i > j então ri − rj = ri−j .
Analogamente, se ri ≥ rj e j > i então 1 − (ri − rj ) = rj−i . Consideremos
também a seguinte partição do intervalo [0, 1],
Ik = [
k
k+1
,
), com 0 ≤ k ≤ m − 1
m+1 m+1
m
e Im = [ m+1
, 1]. Como temos m + 2 números reais em [0, 1] e a partição de
[0, 1] tem m + 1 subintervalos, então um desses intervalos, digamos Ik , tem
pelo menos dois dos números reais considerados. Se k = 0 então existe um
inteiro 1 ≤ a ≤ m tal que
ra ≤
1
1
, i.e. |aθ − [aθ]| <
.
m+1
m+1
Se k = m então existe um inteiro 1 ≤ a ≤ m tal que
1 − ra ≤
1
1
, i.e. |aθ − [aθ] − 1| ≤
.
m+1
m+1
Se 0 < k < m então existem dois inteiros 1 ≤ i, j ≤ m tais que
ri − rj ≤
1
.
m+1
Podem acontecer dois casos: Se i > j temos ri − rj = ri−j e
(i − j)θ − [(i − j)θ] ≤
87
1
.
m+1
Se j > i temos 1 − (ri − rj ) = rj−i e
|(j − i)θ − [(j − i)θ] − 1| ≤
1
.
m+1
2
√
Teorema 6.4. O método de Lehman está correcto e demora O( 3 n log2 n)
operações bit.
Demonstração: Suponhamos que o método está correcto, e de facto nos
dá um divisor de n ou prova que n é primo. Vejamos quantas operações bit
demora.
A parte inicial de √
experimentar se n tem algum divisor menor que
√
√
3
n demora no máximo O( 3 n log2 n) pois para cada inteiro menor que 3 n
fazemos uma divisão (se experimentássemos só primos terı́amos um factor
log n a menos). Caso tenhamos que passar à segunda parte do método,
temos que verificar
√
⌈ 3 n⌉ [ √
∑ 6n]
√
√ = O( 3 n)
4 k
k=1
vezes se t2 − 4kn é um quadrado perfeito (cada um demora O(log2 n)). Só
no caso de obtermos um quadrado perfeito
√ é que precisamos de calcular
(d = t + s, n). Portanto, no total temos O( 3 n log2 n) operações bit.
Provemos agora que o método
√ de Lehman está correcto. Podemos assumir
que n √
não tem factores d ≤ 3 n. Se n não é primo
então n = pq com
√
3
3
p, q > n. Vamos provar que existe um inteiro k ≤ [ n] , k = uv com
√
|uq − vp| < 3 n
Seja m = [n 6 q 2 p− 2 ]. Pelo teorema da aproximação de Dirichlet, existem
inteiros positivos a e b, com 1 ≤ a ≤ m, tais que
1
1
1
1
p
.
|a − b| ≤
q
m+1
Mas então
√
q
q
n √
|ap − qb| ≤
< √ √ < √
= 3 n.
6
q
6
m+1
n
n p
88
Portanto, tomando u = b, v = a obtemos
|uq − vp| <
√
3
n
√
Falta provar que uv ≤ [ 3 n]. Sabemos que
u
p
1
< +
v
q vm
e v ≤ m, donde,
uv =
1
u 2 p 2
v
pq 1
v < v +
≤
n 3 + 1 = n 3 + 1.
v
q
m
qp
Consideremos c = uq + vp e e = |uq − vp|. Então 4kn = c2 − e2 . Em seguida,
provamos que
1
√
√
n6
2 kn ≤ c < 2 kn + √ .
4 k
√
√
Como (uq)(vp) = kn, então c = uq + vp ≥ 2 kn. Seja E = c − 2 kn, então
√
√
2
4kn + 4E kn ≤ (2 kn + E)2 = c2 = 4kn + e2 < 4kn + n 3 ,
logo
1
n6
E< √ .
4 k
Para terminar, só temos que mostrar que (c + e, n) é um factor não trivial
de n. Como n | (c + e)(c − e), basta mostrar que c + e < n. Temos, para
n ≥ 21,
1
1
√
1
1
n6
n6
1
c + e < 2 kn + √ + n 3 < 2 (n 3 + 1)n + √ 1
+ n 3 < n.
4 k
4 n3 + 1
√
2
89
6.4
Crivo quadrático
Actualmente são usados essencialmente três métodos de factorização, o crivo
quadrático, o crivo do corpo numérico e o método da curva elı́ptica. Nesta
secção iremos descrever o primeiro destes métodos.
A ideia do crivo quadrático é encontrar inteiros x e y tais que
x2 ≡ y 2
mod n
x ̸≡ ±y
mod n.
e
Então d = (x − y, n) é um divisor próprio de n.
Exemplo. Sejam n = 7429, x = 227, e y = 210. Então x2 − y 2 = n e
x − y = 17. Como (n, 17) = 17, temos 17 | n.
O crivo do corpo numérico também usa a ideia anterior, a diferença é na
maneira de determinar x e y. Vejamos como determinar estes inteiros no
crivo quadrático.√
Sejam m = [ n] e f (X) = X 2 − n. A ideia é encontrar k inteiros si , 1 ≤
i ≤ k, tais que cada f (si ) só tenha factores primos pequenos (pertencentes a
um conjunto B), e de tal modo que f (s1 ) · · · f (sk ) seja um quadrado mod n,
i. e. os expoentes de cada primo envolvido são pares. Se k for suficientemente
grande (basta k > #B), os expoentes mod 2 de cada primo, irão formar um
sistema linear com k equações e #B incógnitas, logo é um sistema resolúvel.
Para clarificar este processo, vejamos outra vez o exemplo anterior.
Exemplo. Temos n = 7429, donde m = 86. Seja B = 8. Neste caso,
f (87) = 872 − 7429 = 140 = 22 · 5 · 7 e f (88) = 882 − 7429 = 315 = 32 · 5 · 7.
Consideremos v1 = (0, 0, 1, 1) e v2 = (0, 0, 1, 1) (neste caso, vi é o π(B)-uplo,
que consiste dos expoentes mod 2 dos primos até B, na decomposição de
f (si )). Como v1 +v2 ≡ (0, 0, 0, 0) mod 2, temos que f (1)f (2) é um quadrado
mod n. Portanto, x ≡ 87 · 88 ≡ 227 mod n e y ≡ 2 · 3 · 5 · 7 ≡ 210 mod n.
Ainda nos falta descrever como escolher B e como escolher os inteiros si .
Já vimos que os inteiros s têm que verificar uma propriedade que depende
de B. Começamos por definir essa propriedade.
Definição. Dizemos que um inteiro s é B-suave se p | s ⇒ p ∈ B.
90
O conjunto B é formado pelo número −1 e por primos menores que um
valor máximo B0 (mais tarde veremos que não é necessário considerar todos
os primos menores que B0 ). Se B0 for grande, este processo pode demorar
mais que o método de Fermat (podemos necessitar de demasiados s′i s para
garantir a solubilidade do sistema linear). Por outro lado, se B0 for demasiado
pequeno, a propriedade de si ser B−suave pode ser tão especial que podemos
demorar muito a encontrar o primeiro inteiro B − suave depois de m. Foi
demonstrado que o valor óptimo para B0 é
1√
exp(
log n log log n).
2
Este valor de B0 permite que possamos determinar um factor de n em
O(e
√
log n log log n
)
operações bit. Portanto, muito mais rápido que o método de Fermat e suas
variantes.
Em vez de utilizarmos todos os primos menores que B0 (se n for enorme,
podem ser demasiados),
usa-se bases de factores. Queremos encontrar inteiros
√
si perto de m = [ n] tais que f (si ) seja B-suave. Se p | f (si ), então (si )2 ≡ n
mod p, i. e. n é um resı́duo quadrático mod p. Portanto, só nos interessam
primos p ≤ B0 tais que
( )
n
=1
p
ou p = 2. A base de factores é assim constituı́da por estes primos e por −1.
Para determinar os inteiros si tais que f (si ) seja B-suave, começa-se por
considerar um intervalo a crivar, S = {m − M, m − M + 1, . . . , m − 1, m, m +
1, . . . , m + M − 1, m + M }, com M suficientemente grande, e calcula-se f (u)
para qualquer u ∈ S. Dado p na base de factores, determinamos os inteiros
0 ≤ t ≤ p−1, tais que t2 ≡ n mod p. Sabemos que há duas soluções, u1 e u2 ,
pois n é um resı́duo quadrático mod p (se p = 2 há uma só solução). Utilizase o algoritmo de Tonelli-Shanks para determinar estas soluções. Então p
divide f (u1 ) e f (u2 ), mas também divide f (ui + kp), para i = 1, 2 e k inteiro
(é desta parte do algoritmo que resulta o nome crivo quadrático). Assim,
começando em ui , divide-se cada f (ui + kp) com ui + kp ∈ S pela maior
potência de p possı́vel, resultado este que passa a substituir f (ui + kp). Fazse o mesmo para os outros primos da base de factores e escolhe-se os valores
que forem iguais a 1. Os ı́ndices destas coordenadas são os nossos si ’s, e para
cada um deles, f (si ) é B-suave.
91
i
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
25
29
55
83
137
263
f (m + i)
8016
16227
24440
32655
40872
49091
57312
65535
73760
81987
90216
98447
106680
114915
123152
131391
139632
147875
205632
238680
454272
687960
1143072
2227680
2
501
3
167
601
3055
5109
10885
1703
5
611
2177
7
13
17
47
311
131
7013
1791
199
21845
2305
4369
461
27329
11277 1253
257
179
5791
13335
445
38305
889
7661
127
7697
8727
14599
2909
1123
1183
3213
29835
3549
85995
35721
69615
119
1105
1183
3185
49
7735
169
17
221
637
1547
169
13
1
221
Tabela 6.1: O crivo quadrático
92
1
17
1
1
17
1
1
1
√
Exemplo. Seja n = 16843009. Então m = [ n] = 4104. Usando o valor
óptimo para B0 , obtemos B0 = 30. A base de factores é {2, 3, 5, 7, 13, 17}.
Consideremos S = {m + 1, m + 2, . . . , m + 1000}. A tabela 6.1 mostra como
funciona o crivo. As últimas 7 linhas representam os si ’s para os quais f (si )
é B-suave. Obtemos os vectores dos expoentes
(0, 0, 3, 1, 2, 0), (6, 3, 0, 1, 0, 1) (3, 3, 1, 0, 1, 1) (7, 1, 0, 1, 2, 0)
(3, 3, 1, 2, 1, 0) (5, 6, 0, 2, 0, 0) (5, 2, 1, 1, 1, 1)
Como só nos interessa a paridade dos expoentes, obtemos
(0, 0, 1, 1, 0, 0), (0, 1, 0, 1, 0, 1) (1, 1, 1, 0, 1, 1) (1, 1, 0, 1, 0, 0)
(1, 1, 1, 0, 1, 0) (1, 0, 0, 0, 0, 0) (1, 0, 1, 1, 1, 1)
Temos (0, 1, 0, 1, 0, 1)+(1, 1, 1, 0, 1, 0)+(1, 0, 1, 1, 1, 1) = (0, 0, 0, 0, 0, 0). Logo,
x ≡ 4129 ∗ 4187 ∗ 4367 ≡ 6866803
mod n
e
y ≡ 27 · 34 · 5 · 72 · 13 · 17 ≡ 5556063
mod n
donde (x − y, n) = 65537. Portanto, 65537 é um factor de n = 16843009.
Em Abril de 1994, foi terminada a factorização do RSA-129 usando o
crivo quadrático. O RSA-129 é um número com 129 dı́gitos com dois factores
primos, um com 64 dı́gitos e o outro com 65. A base de factores para esta
factorização continha 524339 primos. Em 1996, o crivo dos corpos de números
foi utilizado para factorizar o RSA-130. Desde então todos os números RSA
que teem sido factorizados, foram-no usando este último crivo.
93
Capı́tulo 7
Logaritmo Discreto
Como já vimos alguns sistemas criptográficos dependem da complexidade do
problema do logaritmo discreto, neste capı́tulo iremos descrever algoritmos
para resolver este problema. Muitos destes algoritmos são válidos para qualquer inteiro n para o qual (Z∗n , ·) seja um grupo cı́clico, mas iremos somente
considerar grupos cuja ordem seja um primo.
Seja p um primo ı́mpar e g uma raı́z primitiva mod p. Dado um inteiro
b, o problema do logaritmo discreto consiste em encontrar a menor solução
de
b ≡ g x mod p.
(7.1)
7.1
Enumeração
O método mais simples para resolver a equação (7.1) é ir testar sucessivamente x = 0, 1, 2, 3 . . . . A este processo chamamos enumeração.
Exemplo. A menor solução (positiva) de 3 ≡ 5x mod 2017 é x = 1030.
Portanto, usando a enumeração, temos que experimentar 1031 valores!
Em criptografia usa-se soluções x, com x ≥ 2160 , portanto este método é
totalmente impraticável.
94
7.2
Algoritmo passos de bebé passos de gigante
Este algoritmo foi desenvolvido por D. Shanks em 1971 e permite-nos me√
lhorar consideravelmente o algoritmo anterior. Seja m = [ p] e façamos
x = qm + r, com 0 ≤ r < m. O algoritmo passos de bebé passos de gigante
determina q e r. Como g qm+r ≡ b mod p, então
(g m )q ≡ bg −r
mod p
Primeiro calculamos o conjunto dos passos de bebé
B = {(bg −r
mod p, r) : 0 ≤ r < m}.
Se B tiver um elemento da forma (1, r), então b ≡ g r mod p e a menor
solução de (7.1) é x = r. Caso não exista tal par, determinamos c = g m
mod p. Em seguida, para cada q = 1, 2, 3, . . . , verificamos se cq mod p é
a primeira coordenada de algum elemento de B. Quando isto acontecer,
obtemos
(g m )q ≡ cq ≡ bg −r mod p
donde x = qm + r é solução de (7.1). Ao cálculo dos elementos cq , chamamos
passos de gigante. Para cada q temos que comparar cq com os elementos de
B.
A solução de 3 ≡ 5x mod 2017 é x = 1030. Usando o método da enumeração temos que efectuar 1029 multiplicações mod 2017. Se usarmos
o algoritmo passos de bebé passos de gigante, obtemos m = 44, r = 18 e
q = 23. Portanto, só necessitamos de 44 multiplicações para os passos de
bebé e de 22 multiplicações para os passos de gigante. Em contrapartida,
para utilizarmos este algoritmo, temos que guardar todos os pares dos passos
de bebé, enquanto que no algoritmo de enumeração, só é necessário guardar
os inteiros g, b e p.
Para o algoritmo da enumeração, o número máximo de multiplicações é
p−1, mas o número mı́nimo pode ser muito pequeno. No algoritmo passos de
√
bebé passos de gigante, temos sempre [ p] + 1 passos de bebé, e no máximo
√
[ p] passos de gigante. Também este algoritmo é impraticável para resolver
problemas concretos de criptoanalise.
95
7.3
Cálculo de ı́ndices
Nesta secção descrevemos o algoritmo cálculo de ı́ndices que está relacionado
com os algoritmos de factorização subexponenciais mencionados no capı́tulo
anterior. Mais uma vez queremos resolver o problema do logaritmo discreto
b ≡ gx
mod p.
Começamos por escolher um majorante B e consideramos a base de factores
F (B) = {q, primo : q ≤ B}. Em seguida, calculamos o logaritmo discreto
dos elementos da base de factores, i. e., para qualquer q ∈ F (B), resolvemos
a congruência
g xq ≡ q mod p.
Depois determinamos um expoente y ∈ {1, 2, . . . , p − 1} tal que bg y mod p
é B-suave e escrevemos
∏
q eq mod p.
bg y ≡
q∈F (B)
Então
bg y ≡
∏
g x q eq ≡ g
∑
q∈F (B)
xq eq
mod p
q∈F (B)
donde
b≡g
∑
q∈F (B)
xq eq −y
mod p.
Portanto, a solução do problema do logaritmo discreto é
∑
xq eq − y mod p − 1.
x≡
q∈F (B)
A determinação do logaritmo discreto dos elementos da base de factores
parece à primeira vista tão difı́cil como resolver o problema do logaritmo
discreto original, mas pode ser efectuada de um modo muito mais simples.
Escolhe-se aleatoriamente z ∈ {1, 2, . . . , p − 1}, tal que g z mod p é B-suave
e escrevemos
∏
gz ≡
q fq,z mod p.
q∈F (B)
A cada vector (fq,z )q∈F (B) chamamos uma relação. Deve-se verificar se cada
nova relação é linearmente dependente das anteriores. Caso seja, esta é
96
eliminada. Precisamos de tantas relações como o número de elementos da
base de factores. Como
∏
∑
gz ≡
g xq fq,z ≡ g q∈F (B) xq fq,z mod p
q∈F (B)
então obtemos a congruência linear
∑
z≡
xq fq,z
mod p − 1.
q∈F (B)
Obtemos assim um sistema linear de congruências (cujas incógnitas são os
xq ), que pode ser resolvido usando métodos de teoria dos números.
Note que se B for suficientemente grande, resolvemos o sistema de linear
de congruências uma única vez e estes xq são válidos para a maioria dos b’s.
Exemplo. Vamos determinar x tal que 2x ≡ 13 mod 2027. Portanto, b =
13, g = 2 e p = 2027. Consideremos B = 11, então a base de factores é
F (B) = {2, 3, 5, 7, 11}. Agora, escolhendo aleatoriamente z em {1, 2, . . . , p −
1}, obtemos os seguintes números B-suaves:
3 · 11
5 · 7 · 11
27 · 11
32 · 7
26 · 52
=
=
=
=
=
33
385
1408
63
1600
≡
≡
≡
≡
≡
21593
2983
21318
2293
21918
mod
mod
mod
mod
mod
2027
2027
2027
2027
2027.
As relações obtidas são (0, 1, 0, 0, 1), (0, 0, 1, 1, 1), (7, 0, 0, 0, 1), (0, 2, 0, 1, 0)
e (6, 0, 2, 0, 0), que são linearmente independentes. Pelo pequeno teorema de
Fermat, obtemos o seguinte sistema com 5 incógnitas e 5 congruências:
x2 + x 5
x3 + x 4 + x5
7x1 + x5
2x2 + x4
6x1 + 2x3
≡
≡
≡
≡
≡
1593
983
1318
293
1918
mod
mod
mod
mod
mod
2026
2026
2026
2026
2026.
Como g = 2, então x1 = 1. Temos que 2026 = 2 · 1013, assim devemos
resolver as congruências mod 2 e mod 1013 e depois utilizamos o teorema
97
chinês dos restos para obter as soluções
mod 2026. O resultado final é
x1 = 1, x2 = 282, x3 = 1969, x4 = 1755, x5 = 1311.
Em seguida, escolhemos aleatoriamente y ∈ {1, 2, . . . , p−1}, até que 13·2y
mod 2027 seja B-suave. Encontramos
13 · 21397 ≡ 110 = 2 · 5 · 11 mod 2027.
Portanto,
x ≡ 1 + 1969 + 1311 − 1397 ≡ 1884
98
mod 2026.
Capı́tulo 8
Assinaturas digitais
8.1
Introdução
Em documentos em papel utilizam-se assinaturas convencionais, feitas à
mão para especificar a pessoa responsável pelo documento. Estas assinaturas são utilizadas para assinar cartas, levantar dinheiro de um banco, assinar contratos, etc. Uma assinatura digital serve para assinar documentos
electrónicos que são transmitidos através de uma rede de computadores.
Neste capı́tulo iremos estudar várias assinaturas digitais, mas começamos
por observar algumas diferenças fundamentais entre assinaturas digitais e
assinaturas convencionais:
1. Assinatura de um documento: Quando se utiliza uma assinatura
convencional, esta assinatura está fisicamente ligada ao documento que
está assinado. Quando utilizamos uma assinatura digital, esta não está
fisicamente ligada à mensagem, sendo assim necessário que o algoritmo
utilizado deve de alguma maneira ligar a assinatura à mensagem que
queremos assinar.
2. Verificação da assinatura: Numa assinatura convencional, a verificação da assinatura é verificada quando esta é comparada com uma
assinatura autenticada (por exemplo, a assinatura do Bilhete de Identidade, do Cartão do Cidadão ou de um cartão de crédito). Claramente,
este método não é muito seguro, porque é relativamente simples forjar a
assinatura de uma outra pessoa. As assinaturas digitais são verificadas
utilizando um algoritmo de verificação público. Portanto qualquer pessoa pode verificar se a assinatura digital é autentica.
99
Uma assinatura digital consiste de duas componentes: Um algoritmo para
assinar e um algoritmo de verificação. Bob assina a mensagem x utilizando
um algoritmo (secreto) para assinar, sig. A assinatura resultante y = sig(x)
é verificada utilizando um algoritmo de verificação público, ver. Dado o par
(x, y), então ver(x, y) = 1 se a assinatura é autentica e ver(x, y) = 0 se a
assinatura não estiver correcta.
As funções sig e ver devem ser de tempo polinomial e forjar uma assinatura por um oponente deve ser computacionalmente impraticável.
8.2
Assinatura RSA
O sistema criptográfico RSA pode ser utilizado para assinaturas digitais,
como passamos a descrever:
Sejam (na , ea ) e (pa , qa , da ) as chaves pública e privada RSA de Alice,
respectivamente; e (nb , eb ) e (pb , qb , db ) as chaves pública e privada RSA de
Bob, respectivamente.
Suponhamos que a Alice pretende enviar uma mensagem cifrada e assinada a Bob. Dada a mensagem original x, primeiro a Alice assina x utilizando
a sua chave de RSA privada, da , obtendo
y = sigda (x) ≡ xda
mod na .
Em seguida, cifra x e y utilizando a chave pública RSA de Bob, obtendo a
mensagem cifrada z que transmite a Bob. Quando Bob recebe z, ele primeiro
decifra z utilizando a sua chave privada RSA e obtém (x, y). Para certificar
a autenticidade da assinatura y, Bob utiliza a chave pública RSA de Alice
verificando se a seguinte congruência é verdadeira
y ea ≡ x
mod na .
Se Alice cifrar primeiro x, obtendo z, e só depois assinar z, obtendo y e
enviar o par (z, y) a Bob, então Óscar poderá criar a sua assinatura y ′ de z e
substituir a assinatura y de Alice, enviando o par (z, y ′ ) a Bob. Neste caso,
Bob ficará convencido que quem lhe enviou a mensagem x foi Óscar. Note
que nesta situação, Óscar sabendo ou não a mensagem x, consegue sempre
assinar z. Por esta razão é recomendado que se assine sempre a mensagem
antes de a cifrar.
100
8.3
Assinatura ElGamal
A assinatura digital ElGamal foi descrita pela primeira vez em 1985 e foi
desenvolvida especificamente para ser uma assinatura, o que contrasta com
o RSA que pode ser usado como um sistema criptográfico ou como uma
assinatura. Uma modificação desta assinatura deu origem à assinatura digital standard adoptada pelo National Institute of Standards and Technology
(NIST).
Passamos a descrever esta assinatura:
Seja p um primo tal que a resolução computacional do problema do logaritmo discreto em Zp é impraticável. Sejam α uma raiz primitiva de p,
1 < a < p − 1 um valor aleatório e β ≡ αa mod p. Os valores p, α e β
são públicos e a é secreto. Seja K = (p, α, a, β) a chave ElGamal de Bob.
Para assinar uma mensagem x, gera-se aleatoriamente k ∈ Z∗p−1 (k deve ser
mantido secreto) e define-se
sigK (x, k) = (γ, δ),
onde
γ ≡ αk
e
mod p
δ ≡ (x − aγ)k −1
mod p − 1.
A função de verificação é dada por
verK (x, γ, δ) = 1 ⇐⇒ β γ γ δ ≡ αx
mod p
Esta verificação está correcta porque
β γ γ δ ≡ αaγ αkδ ≡ αx
mod p,
porque aγ + kδ ≡ x mod p − 1.
Bob calcula a sua assinatura utilizando o valor secreto a, que faz parte
da sua chave e o valor secreto k (que só deve ser alterado sempre que se quer
assinar uma mensagem x). A verificação é obtida usando somente informação
pública.
Exemplo. Seja p = 467, α = 2 e a = 127. Então β ≡ 2127 ≡ 132 mod 467.
Suponhamos que Bob quer assinar a mensagem x = 100. Primeiro gera o
101
número aleatório k = 213 que é primo com 466 (como tinha de ser). Então
213−1 ≡ 431 mod 466. A assinatura de (x, k) passa a ser (29, 51), porque
γ ≡ 2213 ≡ 29
mod 467
e
δ ≡ (100 − 127 · 29) · 431 ≡ 51 mod 466.
Para verificar a assinatura basta calcular
13229 2951 ≡ 189 mod 467
e
2100 ≡ 189 mod 467.
Portanto, a assinatura é válida.
8.3.1
Forjar assinaturas ElGamal
Vejamos agora a segurança desta assinatura digital. Suponhamos que Olga
pretende forjar uma assinatura para a mensagem x, sem saber a. Se Olga
escolher um valor γ e tentar encontrar o valor δ correspondente, tem que
calcular o logaritmo discreto logγ (αx β −γ ) mod p. Por outro lado, se Olga
escolher δ e tentar encontrar o valor γ correspondente tem que resolver a
congruência
β γ γ δ ≡ αx mod p.
Até agora não foi encontrada uma maneira prática (em termos computacionais) para resolver esta congruência.
Resta ainda a possibilidade de que haja uma maneira de calcular γ e δ
simultaneamente de tal modo que (γ, δ) seja uma assinatura de x. Até agora,
ainda ninguém descobriu uma maneira de efectuar este cálculo, mas também
ninguém provou que este cálculo não pode ser efectuado.
Se Olga escolher γ e δ e depois tentar descobrir x terá mais uma vez que
calcular o logaritmo discreto logα (β γ γ δ ) mod p. Portanto, Olga não pode
assinar uma mensagem aleatória utilizando este processo.
No entanto, Olga pode assinar uma mensagem aleatória escolhendo γ, δ e
x simultaneamente: Sejam i e j inteiros, com 0 ≤ i, j ≤ p −2, e (j, p −1) = 1.
102
Em seguida, calcula-se
γ ≡ αi β j mod p
δ ≡ −γj −1 mod p − 1
x ≡ −γij −1 mod p − 1.
Então (γ, δ) é uma assinatura válida para a mensagem x porque
β γ γ δ ≡ β γ (αi β j )−γj
≡ βγ α
−iγj −1
−1
β −γ
mod p
mod p
−iγj −1
≡α
≡ αx
mod p
mod p.
Vejamos outro método para forjar assinaturas em que Olga utiliza uma
mensagem previamente assinada por Bob. Suponhamos que (γ, δ) é uma
assinatura válida para a mensagem x. Consideremos h, i e j inteiros tais que
0 ≤ h, i, j ≤ p − 2 e (hγ − jδ, p − 1) = 1. Em seguida, calcula-se
λ ≡ γ h αi β j mod p
µ ≡ δλ(hγ − jδ)−1 mod p − 1
x′ ≡ λ(hx + iδ)(hγ − jδ)−1 mod p − 1.
Então
β λ λµ ≡ β λ (γ h αi β j )δλ(hγ−jδ)
≡ β λ (β jδ−hγ )
−1
λ(hγ−jδ)−1
≡α
xhλ(hγ−jδ)−1
≡α
λ(hγ−jδ)−1 (xh+iδ)
≡α
x′
α
−1
−1
−1
(β hγ )λ(hγ−jδ) (γ δ )hλ(hγ−jδ) αiδλ(hγ−jδ)
hλ(hγ−jδ)−1
≡ β λ β −λ (β γ γ δ )
mod p
α
iδλ(hγ−jδ)−1
iδλ(hγ−jδ)−1
mod p
mod p
mod p
mod p
mod p.
Portanto, (λ, µ) é uma assinatura válida para x′ .
Ambos estes métodos servem para forjar assinaturas, mas não parecem
permitir que um oponente consiga forjar uma assinatura para uma mensagem
que ele próprio escolha, sem resolver o problema do logaritmo discreto. Assim, estes métodos não parecem ameaçar a segurança da assinatura ElGamal.
103
8.3.2
Falhas de protocolo
Nesta secção vamos descrever processos para quebrar a assinatura ElGamal,
quando esta é utilizada de uma maneira descuidada.
Primeiro, o valor aleatório k usado na assinatura não deve ser revelado,
caso contrário Olga pode obter a chave secreta a, da seguinte maneira:
a ≡ (x − kδ)γ −1
mod p.
Claramente, se Olga conhecer a, pode forjar assinaturas para qualquer mensagem.
Outra falha na utilização da assinatura ElGamal ocorre quando o mesmo
valor k é usado para assinar duas mensagens x1 e x2 . Suponhamos que (γ, δ1 )
é uma assinatura de x1 e (γ, δ2 ) é uma assinatura de x2 , onde γ ≡ αk mod p.
Então
β γ γ δ1 ≡ αx1 mod p
e
β γ γ δ2 ≡ αx2
Donde
mod p.
αx1 −x2 ≡ γ δ1 −δ2 ≡ αk(δ1 −δ2 )
mod p.
Esta última equação é equivalente a
x1 − x2 ≡ k(δ1 − δ2 ) mod p − 1.
(8.1)
Como δ1 − δ2 pode não ter inverso mod p − 1, não podemos calcular k
imediatamente, mas este problema pode ser ultrapassado se dividirmos todos
os termos pelo máximo divisor comum entre δ1 − δ2 e p − 1: Seja
d = (δ1 − δ2 , p − 1)
então d | (x1 − x2 ). Definimos
x1 − x2
d
δ1 − δ2
′
δ ≡
d
p−1
′
p ≡
.
d
x′ ≡
104
Então, a congruência (8.1) fica
x′ ≡ kδ ′
mod p′
e como (δ ′ , p′ ) = 1, podemos calcular o inverso de δ ′ mod p′ . Assim
k ≡ x′ δ ′−1
mod p′ .
A esta solução mod p′ correspondem d soluções da congruência (8.1), dadas
por k ≡ x′ δ ′−1 + ip′ mod p − 1, com 0 ≤ i ≤ d − 1. Para determinar a
solução correcta basta verificar quando é que γ ≡ αk mod p.
8.4
DSS
A assinatura digital standard (digital standard signature - DSS) é uma modificação da assinatura ElGamal, adoptada em 1 de Dezembro de 1994 pelo
governo federal dos Estados Unidos da América. Começamos por explicar
porque foi necessário efectuar modificações à assinatura ElGamal e como é
que estas modificações foram conseguidas.
Em muitas situações, uma mensagem é cifrada e decifrada uma única
vez, portanto basta que o sistema criptográfico seja seguro nesta ocasião.
Por outro lado, uma mensagem assinada pode ser um documento legal como
por exemplo um contracto ou um testamento, sendo assim muito provável
que seja necessário verificar a assinatura muitos anos após a mensagem ser
assinada. Por esta razão é necessário tomar mais precauções relativamente à
segurança de uma assinatura do que relativamente à segurança de um sistema
criptográfico. Como a assinatura digital ElGamal não é mais segura que o
problema do logaritmo discreto, temos que usar um primo p grande, com pelo
menos 512 bits, para garantir alguma segurança, sendo sugerido por muitas
pessoas que p deve ter pelo menos 1024 bits, para manter a assinatura segura
por vários anos. Mas para muitas aplicações, várias envolvendo smart cards,
é desejável ter assinaturas mais pequenas. A assinatura digital standard
modifica a assinatura ElGamal de maneira a usar uma assinar uma mensagem
com 160 bits (usando uma assinatura de 320 bits) e onde os cálculos são
efectuados usando um primo com pelo menos 512 bits. A ideia é trabalhar
num subgrupo de Z∗p com ordem 2160 .
A primeira alteração é definir δ da seguinte maneira
δ ≡ (x + aγ)k −1
105
mod p − 1.
A verificação passa a ser
αx β γ ≡ γ δ
mod p.
Quando existe o inverso de δ mod p − 1 (i. e. se (x + aγ, p − 1) = 1),
podemos modificar a condição anterior para obter
−1
αxδ β γδ
−1
≡γ
mod p.
(8.2)
Se existir um primo q com 160 bits tal que q | p − 1, podemos obter um
elemento α em Z∗p tal que a ordem de α mod p é q. Este elemento pode ser
construı́do a partir de uma raiz primitiva α0 de p, fazendo
p−1
α ≡ α0 q
mod p.
Portanto, no DSS em vez de utilizarmos uma raiz primitiva de p iremos
utilizar um elemento de Z∗p cuja ordem tem 160 bits. Tal como na assinatura
ElGamal, definimos
β ≡ αa mod p
e
γ ≡ αk
mod p,
onde k é gerado aleatoriamente. Então β e γ também têm ordem q. Portanto, os expoentes de α e β em (8.2) podem ser reduzidos mod q. Mas
se reduzirmos γ mod q em (8.2) então todo o lado esquerdo da congruência
tem também de ser reduzido mod q.
Resumindo, a assinatura digital standard é obtida do seguinte modo:
Seja p um primo com pelo menos 512 bits e seja q um primo com 160
bits tal que q | p − 1. Seja α ∈ Z∗p com ordem q, a ∈ Z∗p e β ≡ αa mod p.
Os valores p, q, α e β são públicos e a é secreto. Escolhemos 1 ≤ k ≤ q − 1
aleatoriamente e definimos
sig(x, k) = (γ, δ),
onde x ∈ Z∗q ,
γ ≡ (αk
e
mod p) mod q
δ ≡ (x + aγ)k −1
106
mod q.
Para efectuar a verificação, calculamos
e
e1 ≡ xδ −1
mod q
e2 ≡ γδ −1
mod q
ver(x, γ, δ) = 1 ⇐⇒ γ ≡ (αe1 β e2
mod p) mod q.
Precisamos que δ ̸≡ 0 mod q pois precisamos do inverso de δ mod q
para verificar a assinatura. Se Bob obtiver um valor δ ≡ 0 mod q deve
escolher um outro valor para k e calcular novos valores para γ e δ. Note que
a probabilidade de δ ≡ 0 mod q é aproximadamente 2−160 , portanto muito
raramente temos que modificar os valores.
Exemplo. Suponhamos que q = 101 e p = 78q + 1 = 7879. Então 3 é uma
raiz primitiva de p e α ≡ 378 ≡ 170 mod 7879 tem ordem q. Seja a = 75.
Então β ≡ 17075 ≡ 4567 mod 7879. Suponhamos que Bob quer assinar a
mensagem x = 22 e escolhe aleatoriamente k = 50. Então
k −1 ≡ 99
mod q.
Assim,
γ ≡ 17050
mod 7879 ≡ 2518 ≡ 94 mod 101
e
δ ≡ (22 + 75 · 94) · 99 ≡ 97
mod 101.
A assinatura da mensagem x passa a ser o par (94, 97). Para verificar a
assinatura calculamos
δ −1 ≡ 25
e1 ≡ 22 · 25 ≡ 45 mod 101
e2 ≡ 94 · 25 ≡ 27 mod 101.
mod 101
Como
17045 456727
mod 7879 ≡ 2518 ≡ 94 ≡ γ
então a assinatura é válida.
107
mod 101
Quando DSS foi proposto, o comprimento do primo p foi fixado em 512
bits. Após várias crı́ticas, foi permitido ter primos cujo número de bits é
divisı́vel por 64 e que tenham entre 512 e 1024 bits. Em 2000 o número de
bits do primo p foi fixado em 1024 bits. Em 2006 foi sugerido o uso de primos
com 2048 bits para assinaturas cujo tempo de vida se prolongue para além de
2010. Para mais informações consultar os documentos publicados pelo NIST
(National Institute of Standards and Technology).
108
Capı́tulo 9
Funções de sı́ntese
As assinaturas que estudámos no capı́tulo anterior só nos permitem assinar
mensagens pequenas. Por exemplo, se utilizarmos o DSS, uma mensagem
com 160 bits é assinada com uma assinatura de 320 bits. Em geral, precisamos de assinar mensagens muito maiores, e. g. documentos legais. Uma
maneira de resolver este problema é dividir a mensagem em partes e assinar
cada parte. Este processo levanta vários problemas: Uma mensagem enorme
terá uma assinatura (de facto, a união de várias assinaturas) enorme. Outra
desvantagem deste processo é que a integridade da mensagem original é perdida.
A maneira mais utilizada para resolver os problemas descritos é recorrer
a funções hash (ou funções de sı́ntese). Estas funções reduzem a mensagem
original a uma mensagem de tamanho aceitável (e. g. 160 bits no caso do
DSS). Só a mensagem reduzida é que é assinada.
Definição. Seja h uma função de sı́ntese. Temos uma colisão se dadas duas
mensagens x e y, tivermos h(x) = h(y).
Definição. Seja x uma mensagem. Uma função de sı́ntese h é fracamente
livre de colisões se for computacionalmente impraticável encontrar uma mensagem x′ ̸= x tal que h(x) = h(x′ ).
Definição. Uma função de sı́ntese h é fortemente livre de colisões se for
computacionalmente impraticável encontrar duas mensagens x e x′ diferentes
tais que h(x) = h(x′ ).
109
9.1
Ataque do Aniversário
Nesta secção vamos determinar uma condição necessária para a segurança de
funções de sı́ntese que apenas depende do tamanho das mensagens reduzidas.
Esta condição resulta de um método para encontrar colisões conhecido como
o ataque do aniversário e que está relacionado com o famoso paradoxo dos
aniversários. O paradoxo dos aniversários diz que se tivermos um grupo de
23 pessoas então há duas pessoas que nasceram no mesmo dia, com mais
de 0.5 de probabilidade e não é realmente um paradoxo, mas simplesmente
contra-intuitivo.
Seja h : X → Z uma função de sı́ntese, com X e Z finitos e tais que
|X| ≥ 2|Z|. Suponhamos que |X| = m e |Z| = n. Claramente, há pelo
menos n colisões, o problema é como encontrá-las. Uma maneira é escolher
aleatoriamente k elementos x1 , . . . , xk ∈ X distintos, calcular h(xi ), para
1 ≤ i ≤ k e depois determinar se houve colisões. Este processo corresponde a
atirar aleatoriamente k bolas para n caixas e depois verificar se alguma caixa
tem mais de uma bola. Vamos calcular um minorante da probabilidade de
encontrar uma colisão por este método. Começamos por assumir que
|h−1 (z)| ≈
m
,
n
para qualquer z ∈ Z. Esta hipótese é razoável, pois se a função h não
distribuir os elementos de X pelos elementos de Z de maneira aproximadamente igual, então a probabilidade de encontrar colisões aumentará, e nós só
queremos um minorante desta probabilidade.
Sejam z1 , . . . , zk os elementos que vão sendo obtidos através da função de
sı́ntese h. O valor z1 pode ser qualquer, mas a probabilidade de z2 ̸= z1 é
1−1/n, a probabilidade de z3 ̸= z1 e z3 ̸= z2 é 1−2/n, e assim sucessivamente.
Portanto, uma estimativa de que não haja qualquer colisão após k valores é
∏
1
2
k−1
i
(1 − )(1 − ) · · · (1 −
)=
(1 − ).
n
n
n
n
i=1
k−1
A série de Taylor da função exponencial dá-nos a seguinte expansão
e−x = 1 − x +
x2 x3
−
··· ,
2!
3!
o que implica que 1 − x ≈ e−x quando x é pequeno. Então a nossa estimativa
110
para a probabilidade de colisões é
k−1
∏
∏ i
k(k−1)
i
(1 − ) ≈
e− n = e− 2n .
n
i=1
i=1
k−1
Portanto, estimamos a probabilidade de haver pelo menos uma colisão como
sendo
k(k−1)
ϵ = 1 − e− 2n .
Então
k(k−1)
e− 2n ≈ 1 − ϵ
k(k − 1)
≈ log(1 − ϵ)
−
2n
k 2 − k ≈ −2n log(1 − ϵ)
√
donde
k≈
Se tomarmos ϵ = 0.5 obtemos
2n log
1
.
1−ϵ
√
k ≈ 1.177 n.
√
Portanto, se aplicarmos a função de sı́ntese a pouco mais de n elementos
de X obtemos uma colisão com probabilidade 50%.
Se considerarmos X o conjunto de todos os humanos, Y o conjunto dos
365 dias
√ de um ano comum e h(x) a data de aniversário da pessoa x então
1.177 365 ≈ 22.49 e há mais de 0.5 de probabilidade de que se encontre
duas pessoas que comemorem o aniversário no mesmo dia num grupo de pelo
menos 23 pessoas.
Se as mensagens reduzidas após a aplicação de uma função de sı́ntese
tiverem 40 bits então o ataque do aniversário diz-nos que iremos ter uma
colisão com probabilidade 0.5 se efectuarmos aproximadamente 220 (pouco
mais de um milhão) de reduções.
9.2
Funções de sı́ntese comprovadamente seguras
Há dois tipos de funções de sı́ntese: Por um lado temos funções de sı́ntese
baseadas em problemas matemáticos, e portanto a sua segurança resulta
111
de provas matemáticas rigorosas. Estas funções de sı́ntese não são muito
utilizadas na prática devido à sua complexidade e por serem muito lentas. A
estas funções, chamamos funções de sı́ntese comprovadamente seguras. Como
exemplos temos
1. Função de sı́ntese de Chaum-van Heijst-Pfitzmann baseada no problema do logaritmo discreto;
2. VSH (very smooth hash function) baseada no problema de determinar
raı́zes quadradas modulares;
3. ECOH (elliptic curve only hash function) baseada em curvas elı́pticas
e no problema do saco-mochila;
4. FSB (fast syndrome based hash function) baseada em teoria dos códigos
e relacionada com os sistemas criptográficos de McEliece e de Niederreiter;
5. SWIFFT baseada na transformada de Fourier rápida (fast Fourier transform).
A outra categoria de funções de sı́ntese inclui funções que têm como base
não um problema matemático difı́cil mas sim são definidas de uma maneira
ad hoc, onde os bits da mensagem são misturados de modo a obter uma
função de sı́ntese. Pretende-se que sejam difı́ceis de quebrar, mas não há
demonstrações formais deste facto. Como exemplos temos MD4, MD5, MD6,
SHA1, SHA2 e WHIRLPOOL.
O SHA2 está implementado em vários protocolos e aplicações de segurança, como por exemplo TLS, SSL, PGP, SSH, S/MIME e IPsec. Veremos alguns destes protocolos mais tarde. O MD5 é muito utilizado para
armazenar passwords.
O NIST (National Institute of Standards and Technology) criou uma
competição para encontrar uma nova função de sı́ntese para substituir o
SHA2, que se passará a chamar SHA3. Esta competição irá terminar em
2012. As funções ECOH, FSB, SWIFFT e MD6 foram eliminadas na primeira
ronda. As funções finalistas são
1. BLAKE;
2. Grøstl, que usa uma S-box, como o AES;
112
3. JH;
4. Keccak;
5. Skein.
9.2.1
Função de sı́ntese Chaum-van Heijst-Pfitzmann
Nesta secção descrevemos a função de sı́ntese de Chaum, van Heijst e Pfitzmann que é baseada no problema do logaritmo discreto.
Seja q um primo grande tal que 2q + 1 = p é primo (os primos que
verificam esta condição chamam-se primos de Sophie Germain). Sejam α e
β raizes primitivas de p. A função de sı́ntese h : Zq × Zq → Z∗p é definida por
h(x1 , x2 ) ≡ αx1 β x2
mod p.
O seguinte resultado descreve como é que uma só colisão pode afectar a
esta função de sı́ntese.
Teorema 9.1. Uma colisão da função de sı́ntese de Chaum-van HeijstPfitzmann permite calcular o logaritmo discreto logα β de uma maneira eficiente.
Demonstração: Suponhamos que temos uma colisão
h(x1 , x2 ) = h(x3 , x4 ),
onde (x1 , x2 ) ̸= (x3 , x4 ). Então
ou seja
αx1 β x2 ≡ αx3 β x4
mod p,
αx1 −x3 ≡ β x4 −x2
mod p.
Seja d = (x4 −x2 , p−1). Como p−1 = 2q e q é primo então d ∈ {1, 2, q, p−1}.
Vamos considerar cada um destes valores para d.
Suponhamos que d = 1 e seja y ≡ (x4 − x2 )−1 mod p − 1. Então
β ≡ β (x4 −x2 )y ≡ α(x1 −x3 )y
Portanto,
logα β ≡ (x1 − x3 )(x4 − x2 )−1
113
mod p.
mod p − 1.
Em seguida, consideramos d = 2. Como q é ı́mpar, temos (x4 −x2 , q) = 1.
Seja y ≡ (x4 − x2 )−1 mod q. Então (x4 − x2 )y = kq + 1, para algum inteiro
k, donde
β (x4 −x2 )y ≡ β kq+1 ≡ (−1)k β mod p.
Portanto,
logα β ≡ (x1 − x3 )y
mod p − 1
ou
logα β ≡ (x1 − x3 )y + q
mod p − 1,
onde a última congruência resulta de
αq ≡ −1
mod p.
Como é fácil determinar qual daquelas congruências é a correcta, conseguimos
também determinar o logaritmo discreto logα β.
Agora, consideramos d = q. Como 0 ≤ x2 , x4 ≤ q − 1 então q só divide
x4 − x2 se x4 − x2 = 0. Mas se x4 = x2 então p − 1 também divide x4 − x2 .
Portanto, o caso d = q nunca acontece.
Como vimos atrás, se d = p − 1 então x4 = x2 . Neste caso obtemos
αx1 β x2 ≡ αx3 β x2
mod p,
isto é
αx1 ≡ αx3
mod p,
o que implica que x1 = x3 . Mas como (x1 , x2 ) ̸= (x3 , x4 ), isto não pode
acontecer.
Portanto, só podemos ter dois casos e em cada um deles é possı́vel calcular
o logaritmo discreto de β na base α.
2
Podemos assim concluir que alguém que consiga descobrir colisões para
esta função de sı́ntese, conseguirá calcular um logaritmo discreto considerado
difı́cil.
O teorema anterior mostra que se for computacionalmente impraticável
calcular logα β em Zp então a função de sı́ntese Chaun-van Heijst-Pfitzmann
é fortemente livre de colisões.
114
9.2.2
VSH
Seja n uma chave pública RSA (n = pq). Sejam p1 = 2, p2 = 3, . . . . Seja k,
o comprimento dos blocos, o maior inteiro tal que
k
∏
pi < n.
i=1
Seja m = (m1 , m2 , . . . , ml ) uma mensagem de l bits, com mi ∈ {0, 1} e
assuma-se que l < 2k . Para calcular h(m) procede-se da seguinte maneira:
1. x0 = 1;
2. Seja L = [ kl ], L é o número de blocos.Tome-se mi = 0 para l < i ≤ Lk.
Neste passo estamos a completar a mensagem com zeros.
3. Represente-se l em binário, isto é
l=
k
∑
li 2i−1 ,
i=1
com li ∈ {0, 1}. Defina-se mLk+i = li , com 1 ≤ i ≤ k.
4. Para j = 0, 1, . . . , L, calcule-se
xj+1 ≡
x2j
k
∏
pikj+i
mod n.
i=1
5. Devolva xL+1 .
Esta função de sı́ntese é fortemente resistente a colisões.
115
Bibliografia
[1] F. L. Bauer, Decrypted Secrets, Springer, 2007.
[2] J. A. Buchmann, Introduction to cryptography, Springer, 2001.
[3] R. Crandall e C. Pomerance, Prime Numbers - A Computacional Perspective, Springer, 2001.
[4] G. H. Hardy e E. M. Wright, An Introduction to the Theory of Numbers,
Oxford, 1979.
[5] J. Hoffstein, J. Pipher & J. H. Silverman, An Introduction to Mathematical Cryprography, Springer, 2008.
[6] N. Koblitz, A Course in Number Theory and Cryptography, Springer,
1987.
[7] R. E. Smith, Internet Cryptography, Addison-Wesley, 1997.
[8] W. Stallings, Cryptography and network security, 5th Edition, Prentice
Hall, 2010.
[9] D. R. Stinson, Cryptography, Theory and Practice, 3rd Edition, CRC
Press, 2006.
116

Documentos relacionados