-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbsc.tex
2912 lines (2619 loc) · 146 KB
/
bsc.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\documentclass{ufsctex/ufsctex}
\usepackage{
amsmath, amsfonts, amssymb, anyfontsize, booktabs, chronology, enumitem,
etoolbox, multirow, pdfpages, pgfplots, tikz, tikz-qtree, todonotes, xfrac
}
\newcommand{\hh}{\mathcal{H}}
\newcommand{\pk}{\mathcal{P}_{k}}
\newcommand{\sk}{\mathcal{S}_{k}}
\newcommand{\bone}{\mathcal{B}_{1}}
\newcommand{\btwo}{\mathcal{B}_{2}}
\newcommand{\hash}[2][]{\mathcal{H}^{#1} (#2)}
\newcommand{\concat}{\, \vert{} \vert{} \,}
\newcommand{\binwds}[1]{\{0, 1\}^{#1}}
\newcommand{\length}[1]{\vert{} #1 \vert{}}
\newcommand{\fhash}[1]{\hh{}: \binwds{*} \longrightarrow{} \binwds{#1}}
\newcommand{\random}{\stackrel{\$}{\longleftarrow}}
\newcommand{\bds}{\textsc{Bds}}
\newcommand{\lots}{\textsc{LD-Ots}}
\newcommand{\wots}{\textsc{Wots}}
\newcommand{\wotsprf}{\textsc{Wots-pr}}
\newcommand{\wotsplus}{\textsc{Wots+}}
\newcommand{\wotslm}{\textsc{Wots-lm}}
\newcommand{\wotst}{\textsc{Wots-t}}
\newcommand{\wotsb}{\textsc{Wots-b}}
\newcommand{\wotsr}{\textsc{Wots-r}}
\newcommand{\wotsbr}{\textsc{Wots-br}}
\newcommand{\hors}{\textsc{Hors}}
\newcommand{\horst}{\textsc{Horst}}
\newcommand{\mss}{\textsc{Mss}}
\newcommand{\cmss}{\textsc{Cmss}}
\newcommand{\gmss}{\textsc{Gmss}}
\newcommand{\sprmss}{\textsc{Spr-Mss}}
\newcommand{\xmss}{\textsc{Xmss}}
\newcommand{\xmsst}{\textsc{Xmss-t}}
\newcommand{\xmssmt}{\textsc{Xmss-mt}}
\newcommand{\xmssb}{\textsc{Xmss-b}}
\newcommand{\xmssr}{\textsc{Xmss-r}}
\newcommand{\xmssbr}{\textsc{Xmss-br}}
\newcommand{\sphincs}{\textsc{Sphincs}}
\pgfplotsset{compat=1.15}
\usetikzlibrary{
matrix, arrows, decorations.markings, shapes.geometric, patterns
}
\tikzset{
XOR/.style={draw, circle, append after command={
[shorten >=\pgflinewidth, shorten <=\pgflinewidth,]
(\tikzlastnode.north) edge (\tikzlastnode.south)
(\tikzlastnode.east) edge (\tikzlastnode.west)}},
}
\DeclareMathOperator*{\argmin}{argmin}
\DeclareMathOperator*{\argmax}{argmax}
\DeclareMathAlphabet{\mathcal}{OMS}{cmsy}{m}{n}
\vbadness=10000
% https://tex.stackexchange.com/a/193370
\makeatletter
\patchcmd{\pdfstringdef}
{\csname HyPsd@babel@}
{\let\bbl@info\@gobble\csname HyPsd@babel@}
{}{}
\makeatother
\instituicao[a]{Universidade Federal de Santa Catarina}
\departamento[o]{Departamento de Informática e Estatística}
\curso[o]{Programa de Graduação em Ciência da Computação}
\documento[o]{{Trabalho de Conclusão de Curso}}
\titulo{Otimização de desempenho do esquema de assinatura digital Winternitz}
\autor{Gustavo Zambonin}
\grau{Bacharel em Ciência da Computação}
\local{Florianópolis}
\data{11}{junho}{2018}
\orientador[Orientador]{Prof.\ Ricardo Felipe Custódio, Dr.}
\coorientador[Coorientador]{Prof.\ Daniel Panario, Dr.}
\coordenador[Coordenador]{Prof.\ Rafael Luiz Cancian, Dr.}
\numerodemembrosnabanca{1}
\orientadornabanca{nao}
\coorientadornabanca{nao}
\bancaMembroA{
Lucas Pandolfo Perin, Me. \\
Universidade Federal de Santa Catarina
}
\dedicatoria{Às mulheres em minha vida}
\agradecimento{Agradeço à minha mãe, Luciana, pela introdução antecipada às
linguagens, o uso prudente destas, e o desejo pela docência; ao meu pai,
Roberto, pelo incentivo à destreza numérica e tecnológica; e a ambos,
naturalmente, pelo perfeccionismo, firmeza e ambição, valores essenciais no
caminho para este trabalho.
Agradeço aos Professores Ricardo Custódio, Daniel Panario e Jean Martina, e
ao Mestre Lucas Perin, pela orientação e/ou co-autoria deste trabalho, e por
prover a infraestrutura necessária para que este trabalho fosse desenvolvido,
na forma do Laboratório de Segurança em Computação.
Agradeço aos amigos que fazem ou fizeram parte desta jornada, sem os quais não
seria possível chegar até aqui. Em especial, à Ana Letícia, pelo seu imutável
suporte e companheirismo, e pela contagiante sinceridade; à Larissa, pela sua
tamanha paciência, e sabedoria em momentos delicados; ao Douglas, pelos
momentos de descontração e por prover a oportunidade de trabalhar em um
ambiente proveitoso; aos caríssimos Dúnia, Emmanuel, Matheus e Ramna, pelas
incontáveis horas de discussões proveitosas sobre quaisquer assuntos acadêmicos
ou habituais; e à Poliana, pela sua confiança e entusiasmo, manifestados na
forma de seu inexorável, imensurável e imperturbável amor.}
\epigrafe{``How long do you want these messages to remain secret?'' [\ldots]
\emph{I want them to remain secret for as long as men are capable of evil.}
}{Neal Stephenson (\textit{Cryptonomicon}, 1999)}
\textoResumo{Algoritmos criptográficos utilizados em assinaturas digitais
atualmente, como RSA e ECDSA, têm sua segurança baseada na dificuldade de se
fatorar números muito grandes ou na obtenção de logaritmos discretos. Este tipo
de cômputo pode ser eficientemente realizado por um computador quântico,
utilizando algoritmos já conhecidos. Deste modo, para manter o ambiente de
assinaturas digitais seguro, é necessário oferecer alternativas pós-quânticas.
Este trabalho busca apresentar esquemas baseados apenas em funções de resumo
criptográfico, cuja segurança é baseada apenas na resistência à colisões da
função escolhida, com o intuito de discutir uma nova otimização para a família
de esquemas de assinatura Winternitz. Particularmente, esta proposta introduz
um parâmetro de compensação, a fim de reduzir o tempo de geração ou verificação
de uma dada assinatura.}
\palavrasChave{criptografia pós-quântica, função de resumo criptográfico,
assinatura digital, esquema de assinatura digital única Winternitz}
\textAbstract{Algorithms currently used in digital signature schemes, such as
RSA and ECDSA, feature security proofs based on the difficulty of calculating
large integer factorizations or discrete logarithms. This kind of computation
can be achieved through a sufficiently powerful quantum computer running
already known algorithms. Hence, to maintain the security \emph{status quo}, it
is imperative to offer post-quantum alternatives, that is, schemes resistant to
quantum computers. This work explores hash-based digital signature schemes, in
which security is reduced to the collision resistance of a chosen hash
function, showing that the construction of such secure schemes is independent
from hard problems from number theory or algebra. Finally, we introduce an
optimization for the Winternitz one-time signature scheme family in the form of
a tradeoff parameter, enabling reduced execution time for signature generation
or verification.}
\keywords{post-quantum cryptography, cryptographic hash function, digital
signature, Winternitz one time signature scheme}
\begin{document}
\pagenumbering{roman}
\capa{}
\pretextuais{}
\listadefiguras{}
\listadetabelas{}
\listadeabreviaturas{}
\listadesimbolos{}
\listadealgoritmos{}
\sumario{}
\chapter{Introdução}\label{chapter:intro}
A aplicação de protocolos criptográficos é essencial no contexto da validação e
proteção de quaisquer comunicações realizadas por um conjunto de entidades,
sejam estas dispositivos eletrônicos ou indivíduos, em virtude da possível
criticidade e sensibilidade atribuídas aos dados transmitidos. Esquemas de
assinatura digital são comumente utilizados para assegurar este processo de
maneira formal~\cite[Seção 6.1]{Goldreich:book:2004}, através da autenticidade
e não-repúdio do remetente e certeza da integridade dos dados, a fim de
traduzir o resguardo provido por uma assinatura de próprio punho no mundo real.
Na prática, a maior parte destes esquemas utilizam como alicerce algorítmico
criptossistemas assimétricos baseados em problemas ``difíceis'' da teoria dos
números, como a fatoração de inteiros ou resolução do logaritmo discreto. Este
fato provê a segurança necessária para os esquemas em computadores eletrônicos,
por conta da inexistência de algoritmos que resolvem estes problemas em tempo
polinomial. Entretanto, em computadores quânticos, algoritmos dessa forma já
existem, \emph{e.g.} o algoritmo de Shor~\cite{Shor:article:1997:oct},
efetivamente tornando estes esquemas clássicos inseguros neste novo contexto.
Para combater esta situação, a criptografia pós-quântica encarrega-se de buscar
algoritmos criptográficos cuja segurança é considerada ``suficiente'', mesmo na
utilização de um hipotético computador quântico para ataques especializados.
Esta área conta com diversas abordagens: a criptografia baseada em reticulados,
polinômios de múltiplas variáveis sobre um corpo finito, teoria de códigos,
morfismos entre curvas elípticas supersingulares e criptossistemas simétricos.
Entretanto, alguns destes métodos não podem ser utilizados no contexto de
esquemas de assinatura digital, e para outros, a inexistência de reduções de
segurança formais e o tamanho das chaves impossibilitam a utilização destes em
aplicações práticas~\cite{Bernstein:article:2017:sep}.
Não obstante, uma abordagem adicional de esquema de assinatura digital
resistente a computadores quânticos é baseada apenas em funções de resumo
criptográfico, construídas a partir de funções de mão
única~\cite{Katz:misc:2005:sep}. De fato, estas funções, desde que apresentem
requisitos de segurança como resistência à segunda pré-imagem e/ou à colisões,
são necessárias e suficientes para a construção de esquemas bem comportados e
seguros~\cite{Rompel:inproc:1990:may}. Visto que estas funções são estudadas
exaustivamente por conta de sua vasta presença em diversos âmbitos da segurança
da informação, reduções de segurança são mais comuns em relação a outras
abordagens pós-quânticas, e tamanhos de chaves e assinaturas são menos
proibitivos.
Esquemas de assinatura digital baseados em funções de resumo criptográfico
consistem da utilização de um esquema de assinatura digital única, onde apenas
uma mensagem pode ser assinada de modo seguro, possivelmente combinados à
estrutura de dados chamada de árvore de Merkle~\cite{Merkle:inproc:1989:aug},
que abriga pares de chaves de diversas instâncias do esquema supracitado como
suas folhas, e reduz a verificação destes para uma única chave, codificada em
sua raiz. Esta árvore é construída com a concatenação de resumos criptográficos
do conteúdo dos nós, habilitando assim a assinatura de diversas mensagens. Como
uma função específica não é necessária, é possível obter uma grande variedade
de esquemas, garantindo a versatilidade destas abordagens.
Embora os esquemas iniciais tenham sido construídos sem atenção particular à
eficiência de modo geral (\emph{e.g.} o esquema de assinatura de
Lamport~\cite{Lamport:report:1979:oct} assina apenas um \emph{bit} de
informação em sua forma mais simples), muitos resultados práticos demonstram a
redução contínua do tempo de verificação da assinatura, tamanho e tempo para
geração do par de chaves e assinatura, bem como avanços teóricos que
possibilitam a utilização de funções com requisitos de segurança
mínimos~\cite{Huelsing:inproc:2013:jun}, garantem o conceito de sigilo
encaminhado~\cite{Buchmann:inproc:2011:nov} e a ausência do gerenciamento de
estado~\cite{Bernstein:inproc:2015:apr}.
Neste trabalho, é enfatizado o estudo do esquema de assinatura digital única
Winternitz, no qual o resumo criptográfico da mensagem a ser assinada define
diretamente a complexidade dos passos de geração e verificação da assinatura.
De acordo com este comportamento, é apresentada uma adaptação para o esquema
na forma de um parâmetro adicional, que habilita a redução do cômputo de
verificação de assinatura em troca do aumento deste na geração da assinatura,
ou vice-versa.
Ambientes nos quais existem limitações de processamento para uma destas etapas,
como redes de sensores sem fio, podem configurar instâncias do esquema
Winternitz a fim de otimizar sua comunicação segura, aumentando o tempo de
execução do cômputo para a geração de assinaturas, geralmente feita em
dispositivos com poder de processamento amplificado. Ademais, as consequências
desta otimização são verificadas em esquemas mais complexos, baseados em
árvores de Merkle, que também podem ser aplicados a meios com restrições
similares.
\section{Objetivos}\label{section:objectives}
\subsection{Objetivo geral}\label{subsection:general}
Apresentar um estudo detalhado sobre os principais esquemas de assinatura
digital baseados em funções de resumo criptográfico. Em especial, um estudo
detalhado sobre o esquema de assinatura digital única Winternitz é realizado,
contextualizando-o junto aos algoritmos previamente descritos. Este processo
tem o intuito de fundamentar a otimização proposta, que afeta o tempo de
execução da criação ou verificação de uma assinatura.
\subsection{Objetivos específicos}\label{subsection:specific}
\begin{enumerate}[label=\roman*.]
\item Descrever os esquemas de assinatura digital única \lots{} e \wots{},
sua variante \wotsplus{}, e o esquema de poucas assinaturas \hors{};
\item Descrever os esquemas de assinatura digital baseado em árvores de
Merkle \mss{}, \xmss{} e \xmssmt{};
\item Apresentar a otimização para a família \wots{} e discutir consequências
desta modificação no contexto de esquemas baseados em árvores de Merkle.
\end{enumerate}
\section{Trabalhos relacionados}\label{section:related}
Artigos na literatura recente consistentes com o tema deste trabalho focam na
redução do tempo de execução da verificação da assinatura, através da definição
de novos esquemas variantes. Em especial, o esquema proposto
em~\cite{Cruz:inproc:2016:oct} torna a complexidade deste passo previsível
através de uma função que mapeia a mensagem para uma tupla com propriedades
especiais; em~\cite{Steinwandt:article:2008:oct}, a mensagem é modificada a fim
de gerar um resumo criptográfico cuja codificação \emph{run-length} é
otimizada; e em~\cite{McGrew:report:2018:apr}, um parâmetro é adicionado que
marca o número de \emph{bits} inutilizados na assinatura, a fim de que estes
não sejam verificados de maneira supérflua.
Neste trabalho, a estrutura do esquema base não é modificada, e um
pré-processamento da mensagem é feito alternativamente, permitindo a
escalabilidade de instâncias de esquemas Winternitz com quaisquer parâmetros,
introduzindo apenas um pequeno custo na etapa de assinatura da mensagem.
\section{Contribuições deste trabalho}\label{section:contributions}
Uma versão resumida deste trabalho~\cite{Perin:inproc:2018:jun} será publicada
como um artigo completo em \emph{22th IEEE Symposium on Computers and
Communications} (ISCC 2018), sob o nome \emph{Tuning the Winternitz Hash-Based
Digital Signature Scheme}, que pode ser consultado no
Apêndice~\ref{chapter:paper}. Este trabalho busca adicionalmente fornecer
explicações didáticas para vários esquemas baseados em funções de resumo
criptográfico presentes na literatura, bem como uma abordagem complementar aos
argumentos providos pelo artigo, no Capítulo~\ref{chapter:tuning}.
\chapter{Primitivas criptográficas}\label{chapter:primitives}
Neste capítulo, são explicados os conceitos necessários a fim de entender
inteiramente um esquema de assinatura digital, bem como outros algoritmos
discutidos ao longo do trabalho. A organização das seções é semelhante à
seguida em~\cite[Capítulo 2]{Gathen:book:2015}. Os conceitos de criptografia
simétrica e assimétrica são apresentados na Seção~\ref{section:crypto}, e uma
simples comparação entre os mesmos é realizada. Funções de sentido único, base
teórica para funções de resumo criptográfico, são discutidas na
Seção~\ref{section:hashfunc}, e exemplos de construções teóricas por trás
destas funções são apresentados nas Subseções~\ref{subsection:const}
e~\ref{subsection:sponge}. Por fim, a definição formal de um esquema de
assinatura digital é apresentada na Seção~\ref{section:digitalsig}, agregando
estas noções e apresentando o criptossistema RSA como exemplo, na
Subseção~\ref{subsection:rsa}.
\section{Criptografia simétrica e assimétrica}\label{section:crypto}
Define-se criptografia como a criação e análise de protocolos matemáticos que
habilitam comunicação segura, através de um canal inseguro, entre duas ou mais
entidades. Implementações destes, comumente chamadas de algoritmos
criptográficos, podem ser parametrizadas por uma chave, que habilita a
transformação do texto plano para texto cifrado de acordo com esta, de maneira
individual e inteligível, mas a fim de tornar o resultado irrecuperável sem a
apresentação da chave correspondente. De acordo com esta característica, estes
algoritmos são classificados em duas grandes famílias.
Sistemas que utilizam a mesma chave para as operações de codificação e
decodificação são chamados de simétricos. Nesta situação, a chave representa um
segredo compartilhado entre entidades desejando estabelecer comunicação segura.
Como o ato de compartilhar este segredo necessita, por si próprio, de um canal
seguro, este aspecto é uma desvantagem destes criptossistemas.
Cifras de bloco ou de fluxo são considerados exemplos convencionais de
criptossistemas simétricos. A construção destes geralmente é feita através do
encadeamento de operações binárias e matemáticas favoráveis para computadores,
assim permitindo aos algoritmos um desempenho altíssimo. Utilizando estas como
alicerce, é possível construir funções de resumo criptográfico. Este processo é
explorado na Subseção~\ref{subsection:const}.
No contexto da computação quântica, estes sistemas são ameaçados pelo algoritmo
de Grover~\cite{Grover:inproc:1996:may}, que possibilita a busca de elementos
em conjuntos em tempo reduzido. Por outra forma, suponha que é desejável
inverter uma função $f : A \longrightarrow B$, a partir de um elemento $b \in
B$. Classicamente, como não existe informação qualquer sobre a função, é
necessário calcular $f$ para cada um dos elementos de seu domínio, \emph{i.e.}
$\length{A}$\simbolo{$\length{\omega}$}{Tamanho da palavra $\omega$} vezes.
Entretanto, Grover permite que esta busca seja feita em
$\length{A}^{\frac{1}{2}}$ operações. Assim, um algoritmo criptográfico
simétrico que toma o lugar de $f$, neste exemplo, precisa de parâmetros de
segurança maiores, a fim de igualar a dificuldade da busca em se tratando de um
computador clássico.
Em contrapartida, a criptografia assimétrica, ou criptografia de chaves
públicas, engloba os algoritmos que utilizam um par de chaves: a chave privada,
conhecida apenas pela entidade que a gerou, e a chave pública, distribuída
livremente. Podem ser representadas por, respectivamente, $\sk{}$ e $\pk{}$.
Isto possibilita o uso livre de $\pk{}$ para a comunicação segura com o
detentor da chave sem a necessidade de um canal seguro, em virtude da
construção dos algoritmos.
A ideia foi introduzida abstratamente em~\cite{Diffie:article:1976:sep} e tem
como exemplos algoritmos como RSA, ElGamal e ECDSA\sigla{ECDSA}{\emph{Elliptic
Curve Digital Signature Algorithm}}. Diferentemente dos algoritmos simétricos,
estes sistemas utilizam operações matemáticas mais robustas e, portanto, de
desempenho reduzido. Assim, a utilização convencional destes dois tipos de
criptografia em protocolos ocorre através da codificação de uma chave
simétrica, responsável por cifrar um documento de tamanho não trivial, com uma
chave pública, e transmissão desta ``chave cifrada'' através de um canal
qualquer. Em especial, o algoritmo RSA é discutido como um simples exemplo de
esquema de assinatura digital, na Subseção~\ref{subsection:rsa}.
A segurança de sistemas assimétricos depende da ``dificuldade'' computacional
de determinar uma chave privada a partir da chave pública, e também do
armazenamento de $\sk{}$ em um lugar seguro. Problemas em teoria de números e
álgebra que atualmente não admitem soluções em tempo polinomial são comumente
utilizados como base para algoritmos assimétricos. Porém, com a introdução de
um computador quântico, estes problemas podem ser resolvidos de maneira
significativamente mais rápida, como visto em~\cite{Shor:article:1997:oct}.
\section{Funções de sentido único}\label{section:hashfunc}
Funções cuja aplicação é viável, porém a inversão desta torna-se um problema
difícil em se tratando de complexidade computacional, são chamadas de funções
de sentido único. Apresentam várias utilidades no âmbito de segurança da
informação e criptografia, em especial para o resumo de dados, ou seja, a
redução de uma mensagem de tamanho arbitrário para uma palavra pequena e
identificável. Neste contexto, um problema é considerado ``difícil'', ou
computacionalmente inviável, quando o tempo ou recursos gastos para esta
computação excedem a validade ou utilidade da informação desejada.
Estas funções podem possuir várias propriedades, apresentadas
abaixo de acordo com~\cite[Seção 9.2]{Menezes:book:1996}. Tome uma função
$\mathcal{H} : X \longrightarrow Y$. Comumente, os elementos de $Y$ são
chamados de resumos.
\begin{enumerate}[label= (\roman*)]
\item $\hh{}$ deve ser necessariamente \emph{determinística};
\item O cálculo de todo resumo deve ser \emph{computacionalmente
fácil}\footnote{Note que existem funções de desempenho reduzível, como
\texttt{bcrypt}, prevenindo ataques de força bruta a serviços que
armazenam resumos de dados sensíveis, \emph{e.g.} senhas.};
\item $\hh{}$ pode apresentar \emph{compressão}, ou seja, o mapeamento de uma
palavra $x \in X$ de tamanho arbitrário para um resumo $y \in Y$ de
tamanho fixo;
\item $\hh{}$ pode apresentar \emph{resistência à pré-imagem} (\textsc{Pre}),
caracterizada pelo seguinte comportamento: fornecido um resumo $h \in Y$,
é computacionalmente inviável achar alguma mensagem original $m \in X$
que gere $h$ através de $\hash{m} = h$;
\item $\hh{}$ pode apresentar \emph{resistência à segunda pré-imagem}
(\textsc{Sec}), caracterizada pelo seguinte comportamento: fornecida uma
mensagem $m_{0} \in X$, é computacionalmente inviável achar uma
mensagem $m_{1} \in X$ tal que $m_{0} \neq m_{1}$ e $\hash{m_{0}} =
\hash{m_{1}}$;
\item $\hh{}$ pode apresentar \emph{resistência à colisões} (\textsc{Col}),
caracterizada pelo seguinte comportamento: é computacionalmente inviável
encontrar duas mensagens $m_{0}, \; m_{1} \in X$ e $m_{0} \neq m_{1}$,
de tal forma que $\hash{m_{0}} = \hash{m_{1}}$;
\item $\hh{}$ pode ser parametrizada por uma chave $k$. Este comportamento é
representado por $\hh{}_{k}$.
\end{enumerate}
A classificação de $\hh{}$ é realizada de acordo com a presença destas
propriedades, criando funções com várias aplicabilidades distintas. Funções de
resumo simples contêm apenas os três primeiros itens, e são utilizadas em
vários âmbitos, em especial na estrutura de dados chamada de tabela de
espalhamento. Por outro lado, é imposto para uma função de sentido único que os
itens (i), (ii) e (iv) sejam respeitados. Por fim, funções de sentido único
Adicionalmente resistentes à segunda pré-imagem e/ou colisões são definidas
como funções de resumo criptográfico, adequadas para utilização no contexto de
segurança da informação. Finalmente, a relação da propriedade (vii) com estas
funções é discutida na Subseção~\ref{subsection:const}.
Funções de resumo criptográfico possibilitam a certeza da integridade de dados,
mesmo que armazenados em um dispositivo inseguro. Intuitivamente, é desejável
que não ocorra uma relação aparente entre entradas e saídas da função,
considerando o resumo por completo e mesmo subpalavras deste. Outra
característica desejada é o efeito avalanche, baseado no conceito de
difusão~\cite[pp. 72]{Stallings:book:2010}: trocar apenas um \emph{bit} da
mensagem $m$ deve modificar cerca de metade dos \emph{bits} do resumo, e
vice-versa.
\begin{figure}
\centering
\begin{tikzpicture}
\begin{scope}[fill opacity=0.5]
\clip (0, 0) circle (1.25cm);
\fill[black!35] (1.75, 0) circle (1.25cm);
\fill[black!35] (1.75, 0) circle (0.75cm);
\end{scope}
\draw[draw=black!50, thick] (0, 0) circle (1.25cm) node {\textsc{Pre}};
\draw[draw=black!50, thick] (1.75, 0) circle (1.25cm) node {};
\draw[draw=black!50, thick] (1.75, 0) circle (0.75cm) node {\textsc{Col}};
\draw node at (1.75, 1) {\textsc{Sec}};
\end{tikzpicture}
\caption{Diagrama de Venn das resistências desejáveis para uma função de
resumo no contexto de assinaturas digitais.}\label{fig:venn}
\end{figure}
Na Figura~\ref{fig:venn}, estão destacados os requisitos comuns para a
utilização de funções de resumo no contexto de esquemas de assinatura digital,
em vista da possibilidade de uma entidade maliciosa, geralmente chamada de
adversário, desejar produzir assinaturas forjadas. Observe que, embora exista
uma divisão estrita entre \textsc{Pre} e \textsc{Sec}, efetivamente, a segunda
implica a primeira resistência~\cite[Nota 9.20]{Menezes:book:1996}.
Ademais, note que \textsc{Sec} e \textsc{Col} apresentam uma sutil diferença:
na primeira, um adversário não pode escolher $m_{0}$, enquanto na segunda,
quaisquer pares de mensagens podem ser testados. A resistência à colisões,
portanto, implica na resistência à segunda pré-imagem, visto que basta um
adversário fixar $m_{0}$ para simular o cômputo de $m_{1}$.
Enumeram-se algumas aplicações comuns para estas funções: a verificação da
integridade de um arquivo, \emph{i.e.} determinar se mudanças neste foram
feitas ao longo de uma transmissão, ou qualquer outro evento; a fim de evitar o
armazenamento de senhas em texto plano, mantêm-se apenas o resumo criptográfico
destas, e no momento da autenticação do usuário perante o serviço, comparar
apenas estes resumos\footnote{Tabelas de resumos computados previamente, ou
\emph{rainbow tables}, são armazenadas a fim de atacar serviços que não
empregam uma maneira mais elaborada de autenticação, \emph{e.g.} um valor
pseudoaleatório concatenado ao resumo criptográfico da senha do usuário.};
resumos criptográficos são comumente empregados como identificadores únicos
para um arquivo, \emph{e.g.} \emph{commits} em um sistema de controle de
versões; entre outras aplicações, como a geração de números pseudoaleatórios.
\subsection{Construção a partir de cifras de bloco}\label{subsection:const}
Uma nova função de sentido único pode ter origem em algoritmos conhecidos como
cifras de bloco, descritos como encadeamentos de operações matemáticas
aplicadas sobre um estado de \emph{bits} com tamanho fixo, geralmente chamado
de bloco. Estes algoritmos comportam-se como uma famíla de permutações
aleatórias parametrizados por uma chave, ou seja, o ``embaralhamento'' da
mensagem em texto plano para um texto cifrado dependerá completamente da chave
imposta sobre o algoritmo. Em especial, como visto em~\cite[Exemplo
9.13]{Menezes:book:1996}, cifras com esta estrutura podem ser transformadas em
funções de sentido único com a extensão da entrada limitado ao tamanho do
bloco.
A extensão deste artifício para funções de sentido único com compressão pode
ser realizada através de vários métodos. Destaca-se a construção
Matyas-Meyer-Oseas~\cite[Algoritmo 9.41]{Menezes:book:1996}, descrita a seguir.
Assuma uma cifra de blocos genérica $E_{k}$ parametrizada pela chave $k$, cujo
bloco tem um tamanho de $n$ \emph{bits}. Tome um vetor de inicialização $IV$ de
tamanho $n$, e uma função $g$ que adapte sua entrada para chaves do tamanho
necessário por $E_{k}$.
Deseja-se obter um resumo $h_{k}$ de tamanho $n$ que represente uma palavra
$x$, e que sua inversibilidade seja computacionalmente inviável. Deste modo,
divida $x$ em uma $k$-tupla cujos elementos têm tamanho $n$, ou seja, $X =
(x_{0}, \dots, x_{k - 1})$. Preenchimento com zeros pode ser aplicado caso
existam elementos que desrespeitem esta regra. O resultado deste processo é
definido recursivamente como
\begin{equation}
\begin{split}
h_{0} &= IV, \\
h_{i} &= E_{g(h_{i - 1})}(x_{i}) \oplus x_{i}, 1 \leq i \leq t.
\end{split}
\end{equation}
A partir deste alicerce, a construção
Merkle---Damgård~\cite{Merkle:phd:1979:jun}, base para as funções MD5,
SHA1\sigla{SHA}{\emph{Secure Hash Algorithm}} e SHA2, pode ser aplicada a fim
de construir uma função de resumo criptográfico convencional, através do
encadeamento de aplicações de funções de sentido único com compressão sobre
partes da mensagem de entrada. Este método deve também tratar a entrada
original para que o tamanho desta seja um múltiplo do tamanho do bloco, com uma
função de preenchimento, possivelmente contendo o tamanho da mensagem original
como forma de fortalecimento deste arcabouço em se tratando de características
de segurança.
\subsection{Construção esponja}\label{subsection:sponge}
A construção esponja~\cite{Bertoni:misc:2011a:jan}, de característica
iterativa, permite a generalização de funções de resumo, naturalmente com
saídas de tamanho fixo, para funções com saídas de tamanho arbitrário, baseadas
em uma função interna, geralmente uma permutação $f$ de tamanho fixo $b$. Este
valor, também chamado de largura, é composto da adição da taxa de \emph{bits}
$r$ e da capacidade $c$. Assim, a construção opera em um estado de $b = r + c$
\emph{bits}.
O estado inicial, análogo a um vetor de inicialização no contexto de algoritmos
criptográficos, não necessita de valores especiais e é ocupado com valores
nulos. A entrada $m$ é preenchida com uma função de preenchimento \texttt{pad}
de tal modo que $r \mid \length{m}$, e dividida em blocos de tamanho $r$. A
fase de absorção de $m$ pela esponja procede da seguinte maneira: a operação de
ou exclusivo é calculada entre os blocos e os estados da construção,
intercalados por aplicações de $f$.
\begin{figure}
\centering
\begin{tikzpicture}[scale=0.35]
\begin{scope}[xshift=0cm]
\draw (0, 0) rectangle ++(1, 10);
\draw (0, 3) -- ++(1, 0);
\node[XOR] (xm0) at (2.5, 8) {};
\draw[->] (1, 8) -- (xm0);
\draw[->] (1, 2) -- ++(3, 0);
\draw[->] (2.5, 10.5) node[above] {\large $m_{0}$} -- (xm0);
\draw[->] (xm0) -- ++(1.5, 0);
\draw[<->, anchor=east] (-1, 3) -- node[left] {$r$} ++(0, 7);
\draw[<->, anchor=east] (-1, 0) -- node[left] {$c$} ++(0, 3);
\end{scope}
\begin{scope}[xshift=4cm]
\draw[rounded corners=4pt] (0, 0) rectangle node {\large$f$} ++(1, 10);
\node (xm1) at (2.5, 8) {$\dots$};
\draw[->] (1, 8) -- (xm1);
\draw[->] (xm1) -- ++(1.5, 0);
\node (xm1) at (2.5, 2) {$\dots$};
\draw[->] (1, 2) -- (xm1);
\draw[->] (xm1) -- ++(1.5, 0);
\end{scope}
\begin{scope}[xshift=8cm]
\draw[rounded corners=4pt] (0, 0) rectangle node {\large$f$} ++(1, 10);
\node[XOR] (xm1) at (2.5, 8) {};
\draw[->] (1, 8) -- (xm1);
\draw[->] (1, 2) -- ++(3, 0);
\draw[->] (2.5, 10.5) node[above] {\large $m_{i}$} -- (xm1);
\draw[->] (xm1) -- ++(1.5, 0);
\end{scope}
\begin{scope}[xshift=12cm]
\draw[rounded corners=4pt] (0, 0) rectangle node {\large$f$} ++(1, 10);
\draw[->] (1, 2) -- ++(3, 0);
\draw[->] (1, 8) -- ++(3, 0);
\end{scope}
\begin{scope}[xshift=16cm]
\draw (0, 0) rectangle ++(1, 10);
\draw (0, 3) -- ++(1, 0);
\draw[->] (1, 2) -- ++(3, 0);
\draw[->] (1, 8) -- ++(3, 0);
\draw[->] (2.5, 8) -- ++(0, 2.5) node[above] {\large $z_{0}$};
\draw[dashed] (-1.5, -1.5) -- ++(0, 13);
\end{scope}
\begin{scope}[xshift=20cm]
\draw[rounded corners=4pt] (0, 0) rectangle node {\large$f$} ++(1, 10);
\node (xm1) at (2.5, 8) {$\dots$};
\draw[->] (1, 8) -- (xm1);
\draw[->] (xm1) -- ++(1.5, 0);
\node (xm1) at (2.5, 2) {$\dots$};
\draw[->] (1, 2) -- (xm1);
\draw[->] (xm1) -- ++(1.5, 0);
\end{scope}
\begin{scope}[xshift=24cm]
\draw[rounded corners=4pt] (0, 0) rectangle node {\large$f$} ++(1, 10);
\draw[->] (1, 8) -- ++(1.5, 0)
-- ++(0, 2.5) node[above] {\large $z_{j}$};
\end{scope}
\end{tikzpicture}
\caption{Estrutura da construção esponja,
onde $i, j \in \mathbb{N}^{*}$.}\label{fig:sponge}
\end{figure}
Ao término do processamento dos blocos, a fase de compressão é iniciada, onde
$n$ blocos de tamanho $r$ compõem a saída da função, novamente intercalados por
aplicações de $f$, onde $n$ é parametrizável pelo usuário. Os últimos $c$
\emph{bits} do estado nunca são diretamente afetados pelos blocos, e também
nunca revelados durante a fase de compressão. Essencialmente, estão
correlacionados com o nível de segurança da construção esponja. Assim, uma
função esponja pode ser definida como $\textsc{Sponge}[f, \texttt{pad}, r]$, e
sua representação gráfica pode ser consultada na Figura~\ref{fig:sponge},
adaptada de~\cite{Jean:misc:2016:apr}.
A função esponja \textsc{Keccak}~\cite{Bertoni:misc:2011b:jan} é definida a
partir desta construção, e pode agir como uma função de resumo criptográfico.
Existem sete permutações passíveis de utilização nesta função: defina $w =
2^{\ell}, \; \ell \in \{0, \dots, 6\}$. Estas são chamadas de
$\textsc{Keccak}-f[b]$, onde $b = 25w$, cujo estado $a$ é descrito como uma
estrutura tridimensional com elementos em $\mathbb{F}_{2}$, de dimensões $5
\times 5 \times w$. Esta permutação é iterativa e consiste de um número de
rodadas $n_{R} = 12 \times 2 \ell$. Cada rodada $R$, por sua vez, consiste da
composição de cinco etapas: $R = \iota \circ \chi \circ \pi \circ \rho \circ
\theta$.
\begin{enumerate}
\item[] \emph{Etapa $\theta$.} Calcula o ou exclusivo entre um elemento de
$a$ e todos os elementos das colunas adjacentes a este.
\item[] \emph{Etapa $\rho$.} Dispersa os elementos entre cortes transversais
verticais de $a$.
\item[] \emph{Etapa $\pi$.} Rearranja elementos em cortes transversais
horizontais de $a$.
\item[] \emph{Etapa $\chi$.} Modifica um elemento de uma linha de $a$ de
acordo com uma função não-linear de dois outros \emph{bits} adjacentes.
Análogo a uma caixa-S.
\item[] \emph{Etapa $\iota$.} Calcula o ou exclusivo entre o estado $a$ e uma
sequência gerada por um \emph{linear-feedback shift
register}\footnote{Conjunto de registradores que deslocam \emph{bits} a
partir de funções lineares. Uma aplicação desta estrutura é a geração
de números pseudoaleatórios.} alimentado pelo índice da rodada atual,
tornando a rodada assimétrica.
\end{enumerate}
Tome \texttt{pad10*1} como uma função que gera palavras que iniciam e terminam
com $1$, e têm número não negativo de zeros. Formalmente, para uma mensagem
qualquer $m$ e um tamanho de saída $d \in \mathbb{N}^{*}$, a função esponja é
definida como
\begin{equation}
\textsc{Keccak}[r, c](m, d)
= \textsc{Sponge}[\textsc{Keccak}-f[r + c], \texttt{pad10*1}, r]
\end{equation}
onde $r$ tem um valor padrão de $1600 - c$. Assim,
\begin{equation}
\textsc{Keccak}[c] = \textsc{Keccak}[1600 - c, c].
\end{equation}
Finalmente, as funções padronizadas em~\cite{Dworkin:report:2015:jul} como a
família SHA-3 são definições de \textsc{Keccak} com parâmetros fixos,
\emph{e.g.}
\begin{equation}
\text{SHA3-}256(m) = \textsc{Keccak}[512](m \concat 01, 256).
\end{equation}\simbolo{$\concat$}{Concatenação de palavras}
\section{Esquemas de assinatura digital}\label{section:digitalsig}
Um esquema de assinatura digital é uma construção matemática que habilita a
demonstração de certas propriedades sobre mensagens assinadas: nomeadamente, a
autenticação do remetente, onde esta entidade pode ser facilmente identificada
como a emissora da assinatura digital; a integridade da mensagem, \emph{i.e.} a
certeza de que esta não foi modificada ao ser transmitida por um canal
possivelmente inseguro; e o não-repúdio do remetente, onde é impossível negar
que uma mensagem foi assinada e enviada, após este fato.
\begin{figure}
\centering
\begin{tikzpicture}
\node (hm) at (-1.25, 0) {$m$};
\node (in) at (0, -2) {$1^{n}$};
\node (sk) at (0, -1) {$\sk{}$};
\node (pk) at (4, -1) {$\pk{}$};
\node (ds) at (2, 0) {$\sigma$};
\node (res) at (5.5, 0) {\scriptsize $\binwds{}$};
\node[draw] (sig) at (0, 0) {\textsc{Sig}};
\node[draw] (gen) at (2, -2) {\textsc{Gen}};
\node[draw] (ver) at (4, 0) {\textsc{Ver}};
\draw[-latex] (gen) to (1.25, -1) to (sk);
\draw[-latex] (gen) to (2.75, -1) to (pk);
\draw[-latex] (sk) -- (sig);
\draw[-latex] (hm) -- (sig);
\draw[-latex] (sig) -- (ds);
\draw[-latex] (ds) -- (ver);
\draw[-latex] (pk) -- (ver);
\draw[-latex] (ver) -- (res);
\draw[-latex] (in) -- (gen);
\end{tikzpicture}
\caption{Funcionamento típico de um
esquema de assinatura digital.}\label{fig:sign}
\end{figure}
Esquemas de assinatura digital são fortemente baseados em criptografia de
chaves públicas, e consistem de três algoritmos: a geração de chaves
$\textsc{Gen}(1^{n})$, que gera um par de chaves aleatório $(\pk{}, \sk{})$ com
parâmetro de segurança $n \in \mathbb{N}^{*}$; o algoritmo de assinatura
$\textsc{Sig}(\sk{}, m)$, que produz uma assinatura $\sigma$ para uma mensagem
$m$; e o algoritmo de verificação $\textsc{Ver}(\pk{}, m, \sigma)$, que retorna
o estado de validade da assinatura como um valor verdade binário. De acordo
com~\cite[Subseção 6.1.3]{Goldreich:book:2004}, todas as assinaturas geradas
por \textsc{Sig} devem ser verificáveis por \textsc{Ver} utilizando todas as
chaves geradas por \textsc{Gen}. Formalmente,
\begin{multline}
\forall (p, s) \in \textsc{Gen}(1^{n}), \forall w \in \binwds{*}, \\
\text{Pr}[\textsc{Ver}(p, w, \textsc{Sig}(s, w)) = 1] = 1.
\end{multline}
É necessário apontar que esta definição não considera a segurança do esquema,
visto que existem algoritmos construídos trivialmente que respeitam a equação
acima, sem qualquer tipo de codificação a fim de ocultar mensagens. Na
Figura~\ref{fig:sign}, é apresentada uma visualização do comportamento de um
esquema de assinatura digital genérico. Note que $\sigma$ geralmente é composta
da concatenação da mensagem original com a assinatura do resumo criptográfico
desta, embora a saída do algoritmo \textsc{Sig} consista apenas da aplicação de
uma função interna ao resumo.
\subsection{O criptossistema RSA}\label{subsection:rsa}
O algoritmo conhecido como
RSA~\cite{Rivest:article:1978:feb}\sigla{RSA}{\emph{Rivest---Shamir---Adleman}}
é uma implementação de criptografia assimétrica amplamente utilizada. É baseado
na dificuldade de fatorar o produto de dois números primos suficientemente
grandes\footnote{O algoritmo é baseado no problema RSA, definido como realizar
uma operação de chave privada no algoritmo RSA utilizando apenas $\pk{}$.
Acredita-se que este problema seja equivalente à fatoração de
inteiros~\cite[Fato 3.30]{Menezes:book:1996}.}. Em virtude de seu baixo
desempenho computacional, geralmente apenas um resumo criptográfico da mensagem
desejada é codificado por este algoritmo, e sua transmissão é realizada junto à
mensagem original, de forma concatenada. Abaixo, uma descrição do funcionamento
do algoritmo. Tome $\phi(x)$ como a função totiente de Euler, que representa a
quantidade de números relativamente primos a $x$.
\begin{enumerate}
\item[] \emph{Geração de chaves.} Gere dois números primos $p, q$
aleatoriamente, suficientemente grandes e de tamanhos similares. Compute
$n = p q$ e $\phi(n) = (p - 1) (q - 1)$. Selecione um número aleatório
$e$ relativamente primo a $\phi(n)$. Então, use o algoritmo de Euclides
estendido para computar $d$ tal que $ed \equiv 1 \pmod{\phi(n)}$,
\emph{i.e.} a inversa multiplicativa modular de $e$. Finalmente,
\begin{align}
\begin{split}
\sk{} &= d, \\
\pk{} &= (n, e).
\end{split}
\end{align}
\item[] \emph{Geração da assinatura.} Para assinar uma mensagem, aplique uma
função de resumo criptográfico $\hh{}$ à mensagem $M$, produzindo $h =
\hash{M}$. O texto cifrado $c = h^{d} \pmod{n}$ é calculado e enviado
para a entidade desejada na forma
\begin{equation}
\sigma = M \concat c.
\end{equation}
\item[] \emph{Verificação da assinatura.} O receptor da mensagem isola o
resumo cifrado $c$ de $\sigma$, e verifica a assinatura com sucesso se
\begin{equation}
h = c^{e} \pmod{n}.
\end{equation}
\end{enumerate}
Para demonstrar $m^{ed} \equiv m \pmod{n}$, é suficiente mostrar que $m^{ed}
\equiv m \pmod{p}$ e $m^{ed} \equiv m \pmod{q}$, pelo Teorema Chinês do Resto.
Se $m \equiv 0 \pmod{p}$, então $mdc(m, p) = p$ e certamente $m^{ed} \equiv 0
\equiv m \pmod{n}$. Se $m \not\equiv 0 \pmod{p}$, então $mdc(m, p) = 1$ e pelo
Pequeno Teorema de Fermat, $m^{p - 1} \equiv 1 \pmod{p}$. Reescrevendo o
produto $ed$ como
\begin{equation}
ed = 1 + y\phi(n) = 1 + y(p - 1)(q - 1), \; y \in \mathbb{N},
\end{equation}
então
\begin{multline}
m^{ed} \equiv m^{1 + y(p - 1)(q - 1)}
\equiv {(m^{p - 1})}^{y(q - 1)}m \\
\equiv 1^{y(q - 1)}m \equiv m \pmod{p}.
\end{multline}
Analogamente, o processo acima pode ser aplicado para o inteiro $q$. Portanto,
$\forall m \in \mathbb{N}, \; m^{ed} \equiv m \pmod{n}$.
Observe que uma descrição do algoritmo acima sem a presença de uma função de
resumo criptográfico apresenta sérios problemas de segurança se aplicada de
maneira ingênua. Defina a noção de segurança semântica como, dado um texto
cifrado, a impossibilidade de revelar informações quaisquer sobre seu texto
plano correspondente~\cite{Goldwasser:inproc:1982:may}. Então, note que
não existe qualquer fator aleatório na assinatura da mensagem, habilitando uma
entidade maliciosa a aplicar um ataque de texto plano escolhido, \emph{i.e.} a
codificação de múltiplas mensagens a fim de descobrir informações sobre o
algoritmo baseado em semelhanças entre as mensagens cifradas. A função $\hh{}$
previne este comportamento por conta de sua ampla difusão.
Ademais, este criptossistema é um exemplo adequado para a discussão entre
codificação e assinatura de mensagens. Esta sutil diferença ocorre na
utilização do par de chaves. A codificação de um dado com a chave pública
impede que entidades externas à comunicação consigam ler o texto cifrado,
entretanto, é impossível afirmar algo sobre a identidade do remetente da
mensagem, ou o próprio conteúdo desta. Por outro lado, a assinatura de um dado
com a chave privada implica que o signatário é detentor deste par de chaves, e
isto pode ser verificado por qualquer indivíduo que possua a chave pública
correspondente, livremente distribuída.
\chapter{Assinatura digital baseada em
funções de resumo criptográfico}\label{chapter:hashsig}
Neste capítulo, os esquemas de assinatura digital baseados em funções de resumo
criptográfico mais reconhecidos são apresentados, a fim de contextualizar a
presença do esquema alvo, Winternitz, neste meio. Nomeadamente, a
Seção~\ref{section:onetime} introduz o conceito de assinaturas únicas e fornece
discussões sobre os esquemas \lots{}\sigla{\lots{}}{\emph{Lamport---Diffie
One-time Signature Scheme}}, \wots{}\sigla{\wots{}}{\emph{Winternitz One-time
Signature Scheme}} e \wotsplus{}, respectivamente nas
Subseções~\ref{subsection:ldots},~\ref{subsection:wots}
e~\ref{subsection:wotsplus}. Adicionalmente, o esquema de poucas assinaturas
\hors{} é explorado na Subseção~\ref{subsection:hors}. Por fim, os esquemas
baseados em árvores de Merkle são definidos na Seção~\ref{section:merkle}, e os
exemplos \mss{}\sigla{\mss{}}{\emph{Merkle Signature Scheme}}, \xmss{} e
\xmssmt{} são dirimidos nas
Subseções~\ref{subsection:mss},~\ref{subsection:xmss}
e~\ref{subsection:xmssmt}. Finalmente, a Seção~\ref{section:timeline} abrange
uma visão cronológica dos esquemas discutidos ao longo deste Capítulo.
\section{Esquemas de assinatura única}\label{section:onetime}
Esquemas de assinatura única, ou \emph{one-time signature schemes},
possibilitam a assinatura de apenas uma mensagem, facilitando a falsificação
deste processo no caso da reutilização do par de chaves. São construções
fundamentais para a criação de esquemas baseados apenas em funções de resumo
criptográfico, visto que vários esquemas continuam utilizando este recurso e
compõem o estado da arte da
literatura~\cite{Bernstein:misc:2017:dec,Huelsing:report:2018:may}.
\subsection{\lots{}}\label{subsection:ldots}
A utilização de funções de resumo criptográfico para a criação de esquemas de
assinatura digital foi iniciada por Lamport~\cite{Lamport:report:1979:oct} e
estendida subsequentemente em~\cite{Diffie:article:1976:sep,
Merkle:inproc:1989:aug}, permitindo assinar um \emph{bit} de cada vez para uma
dada mensagem. O par de chaves consiste de um par de palavras pseudoaleatórias
$x_{0}, x_{1}$ como $\sk{}$, e seus resumos como $\pk{}$. O assinante assina um
\emph{bit} $b$ distribuindo $x_{b}$, e o recipiente verifica se $\hash{x_{b}}$
é o valor correto em $\pk{}$. Como parte de $\sk{}$ é distribuída, não é
recomendável reutilizar o par de chaves, e os elementos não distribuídos devem
ser destruídos. Assinar mensagens mais longas envolve o cálculo do resumo
desta, visto que do contrário, o tamanho do par de chaves e assinaturas
torna-se extremamente proibitivo.
Formalmente, tome um parâmetro de segurança $m \in \mathbb{N}$, geralmente
considerado como o tamanho da saída da função de resumo criptográfico
escolhido. Considere as funções\footnote{Na prática, o esquema pode ser
instanciado utilizando $\hh{}$ no lugar de $f$.} de sentido único $f : \binwds{m}
\longrightarrow \binwds{m}$ e de resumo criptográfico $\fhash{m}$. Seu
funcionamento e algumas de suas características são discutidas abaixo.
\begin{enumerate}
\item[] \emph{Geração de chaves.} Defina
\begin{equation}
\sk{} = (x_{0, m - 1}, x_{1, m - 1}, \dots, x_{0, 0}, x_{1, 0})
\random{} \binwds{(m, 2m)}
\end{equation}
como a chave privada.\simbolo{$\random{}$}{Seleção aleatória} A chave
pública $\pk{}$ é derivada de $\sk{}$,\simbolo{$\Sigma^{(l, t)}$}{Todas
as $t$-tuplas de palavras de tamanho $l$ construídas com $\Sigma$}
computando $f(x) \; \forall x \in \sk{}$. Logo,
\begin{align}
\pk{} &= (f(x_{0, m - 1}), f(x_{1, m - 1}),
\dots, f(x_{0, 0}), f(x_{1, 0})) \\
&= (y_{0, m - 1}, y_{1, m - 1},
\dots, y_{0, 0}, y_{1, 0}).
\end{align}
\item[] \emph{Geração da assinatura.} Tome uma mensagem $M$ e calcule $d =
\hash{M}$. O resumo $d$ pode ser representado como $d_{m - 1} \dots
d_{0}$. A assinatura consiste de elementos de $\sk{}$ operados por $f$
de acordo com $d$:
\begin{equation}
\sigma = (f(x_{d_{m - 1}, m - 1}), \dots, f(x_{d_{0}, 0})).
\end{equation}
\item[] \emph{Verificação da assinatura.} Para assegurar a corretude da
assinatura $\sigma$, todos os blocos de $\sigma$ precisam ser verificados
separadamente através do recálculo de $d = d_{m - 1} \dots d_{0}$, para
que os elementos corretos de $\pk{}$ sejam escolhidos. Assim, $\sigma$
está correta se
\begin{equation}
(\sigma_{m - 1}, \dots, \sigma_{0})
= (y_{d_{m - 1}, m - 1}, \dots, y_{d_{0}, 0}).
\end{equation}
\end{enumerate}
É necessário comentar que assinaturas produzidas por este esquema podem ser
forjadas~\cite[Capítulo 3]{Merkle:inproc:1989:aug}, visto que é possível
computar $f$ para os \emph{bits} da mensagem que são iguais a zero. Assim, uma
soma de verificação representando a quantidade de zeros na mensagem original
também é assinada e enviada ao recipiente, adicionando apenas $m \cdot
\log_2(m)$ \emph{bits} na assinatura. Esta característica será explicada em
mais detalhes no próximo esquema.
Ademais, uma otimização simples para reduzir o tamanho de $\sk{}$ pode ser
implementada através da utilização de um gerador de números pseudoaleatórios
criptograficamente seguro. Assim, é necessário apenas guardar uma palavra de
tamanho $m$ que age como a semente deste gerador. No caso de $\pk{}$, basta
guardar o resumo criptográfico de seus valores concatenados. Reduzir o tamanho
das assinaturas exige soluções mais complexas; entretanto, a generalização
deste esquema permite esta otimização.
\subsection{\wots{}}\label{subsection:wots}
A introdução de um parâmetro que habilita compensar a criação de chaves e
assinaturas menores com uma diminuição no desempenho do esquema foi sugerida
por Winternitz e publicada por Merkle~\cite[Capítulo
5]{Merkle:inproc:1989:aug}. Este esquema permite assinar múltiplos \emph{bits}
em cada bloco da assinatura, generalizando a proposta de Lamport. A definição
do esquema é elaborada abaixo e seu funcionamento é representado na
Figura~\ref{fig:wots}.
Um parâmetro de segurança $m$ é necessário, como acima. O parâmetro Winternitz,
da forma $w \in \mathbb{N}^{*}\setminus\{1\}$, também deve ser definido, que
representa a quantidade de \emph{bits} a serem assinados simultaneamente. A
partir destes, são calculados os valores \[t_{1} = \left\lceil \frac{m}{w}
\right\rceil, \; t_{2} = \left\lceil \frac{\left\lfloor \log_2 t_{1}
\right\rfloor + 1 + w}{w} \right\rceil \text{ e } t = t_{1} + t_{2},\] que
representarão, respectivamente, a quantidade de palavras em base-$w$ na
assinatura referente à mensagem, à soma de verificação, e à quantidade total.
Por fim, considere as funções de sentido único $f : \binwds{m} \longrightarrow
\binwds{m}$ e de resumo criptográfico $\fhash{m}$.
\begin{enumerate}
\item[] \emph{Geração de chaves.} Defina
\begin{equation}
\sk{} = (x_{t - 1}, \dots, x_{0}) \random{} \binwds{(m, t)}
\end{equation}
como a chave privada. A chave pública $\pk{} = (y_{t - 1}, \dots,
y_{0})$ pode ser derivada de $\sk{}$, computando $f^{2^{w}-1}(x) \;
\forall x \in \sk{}$\simbolo{$f^{\alpha}$}{Aplicação de $f$ $\alpha$
vezes}. Logo,
\begin{equation}
\pk{} = (f^{2^{w}-1}(x_{t - 1}), \dots, f^{2^{w}-1}(x_{0})).
\end{equation}
\item[] \emph{Geração da assinatura.} Tome uma mensagem $M$ e calcule $d =
\hash{M}$. Por conveniência, $m$ ou $w$ são escolhidos de forma que $w
\mid m$, mas podem ser concatenados zeros ao resumo para que esta
restrição seja satisfeita. O resumo $d$ é dividido em uma $t_{1}$-tupla
de palavras em base-$w$, $\bone = (b_{t - 1}, \dots, b_{t - t_{1}})$.
Adicionalmente, uma soma de verificação é calculada usando a
representação inteira dos elementos de $\bone{}$: $c = \sum_{b \in
\bone{}} 2^{w} - 1 - b$. Novamente, $c$ pode ser arredondado com zeros
até que $w \mid \length{c}$. Finalmente, $c$ é dividido em uma
$t_{2}$-tupla de palavras base-$w$, $\btwo{} = (b_{t_{2}-1}, \dots,
b_{0})$. Assim, $\mathcal{B} = \bone{} \cup \btwo{}$ e
\begin{equation}
\sigma = (f^{b_{t - 1}}(x_{t - 1}), \dots, f^{b_{0}}(x_{0})).
\end{equation}
\item[] \emph{Verificação da assinatura.} Para assegurar a corretude da
assinatura $\sigma$, todos os blocos $\sigma_{i}$ precisam ser
verificados separadamente através do cálculo das aplicações restantes
de $f$. Assim, computando $\mathcal{B}$ novamente, $\sigma$ está
correta se
\begin{equation}
\pk{} = (f^{2^{w} - 1 - b_{t - 1}}(\sigma_{t - 1}),
\dots, f^{2^{w} - 1 - b_{0}}(\sigma_{0})).
\end{equation}
\end{enumerate}
Note que não é possível decrementar valores $b_{i} \in \mathcal{B}$, pois isto
implicaria em achar uma pré-imagem de $f$, o que é computacionalmente inviável
em vista de sua restrição imposta. Então, resta apenas a tentativa da
falsificação de $\sigma$ incrementando algum valor $b_{i}$. A soma de
verificação $c$ é necessária a fim de proteger o esquema contra esta situação.