• Nenhum resultado encontrado

4.2 Resultado: TRSS

4.2.3 Tamanhos das Assinaturas

Neste trabalho mostramos uma aplicação da heurística de Fiat-Shamir a um esquema de identicação baseado em reticulados. Com isto obtivemos um esquema de assinaturas com segurança demonstrável. Nossa construção adaptou elementos de um esquema de assinatura em anel originalmente projetado sobre códigos corretores de erro. O resultado mostrou-se mais eciente e com evidências mais fortes de segurança. Substituímos o pressuposto de segurança: ao invés da intratabilidade do problema de decodicação de síndrome, utilizamos a intratabilidade do problema SIS. Para um conjunto adequado de parâmetros, permite reduções de pior caso do problema GapSVP para o caso médio do SIS. Isto permite argumentar que o esquema correspondente tem fortes evidências de segurança.

Além disto, o esquema de identicação CLRS utilizado como base em nossa cons- trução possui um erro de consistência de aproximadamente 1/2, sendo menor que o do esquema de Stern utilizado pela construção baseada em códigos, que é de 2/3. Como nosso esquema requer um menor número de repetições da sequência compromisso-desao- resposta necessário para se atingir um dado grau de erro de consistência global, isto tem um efeito benéco no comprimento da assinatura obtida, fazendo com que seja mais curta que a resultante do emprego de códigos.

Em termos de esforço computacional com reticulados, pode-se conseguir eciência através do uso de reticulados ideais. Com isto, obtêm-se representações mais compactas das bases, ao mesmo tempo que, através do emprego de FFT, aceleram-se as operações envolvendo multiplicação de vetores e matrizes. Tais operações passam a tomar tempo

˜ O(n).

Como discutido em [62], esquemas de identicação com conhecimento zero, tais como os de Kawachi [57] ou CLRS [21], são menos favorecidos que o de Lyubashevsky em termos de tamanhos de assinatura gerada, quando se utiliza a heurística de Fiat-Shamir. Isto é consequência do erro de consistência extremamente baixo deste último. A princípio, um esquema de assinatura em anel poderia fazer uso deste fato e obter uma construção gerando assinaturas mais curtas. Entretanto, as modicações estruturais são necessárias para manter a propriedade de anonimidade.

Esquemas de Cifradores de Fluxo

5.1 Denições e Propriedades

Introdução

Um gerador de números pseudoaleatórios (PRNG, abreviação de pseudo-random number generator) é um algoritmo cujo objetivo é produzir uma sequência de números com propriedades próximas daquelas de números aleatórios. Dentre as aplicações deste tipo de algoritmo em Criptograa, temos a construção de cifras de uxo. Estas podem ser obtidas, por exemplo, através da operação de ou-exclusivo entre um texto em claro e uma sequência pseudoaleatória de bits.

5.1.1 Cifradores de Fluxo Baseados em Códigos

Nesta seção descreveremos duas construções baseadas em códigos: o gerador de sequências pseudoaleatórias (PRNG) de Fischer-Stern, e o cifrador SYND.

Fischer-Stern PRNG

Descrição. Apresentado na Eurocrypt de 1996, este foi o primeiro PRNG baseado em códigos. Ele utiliza como pressuposto de segurança a intratabilidade do problema de decodicação de síndrome [36]. Sua construção segue a sequência abaixo. Dada uma matriz binária de vericação de paridade de dimensões r × n associada a um código binário com capacidade de correção de até w erros. Os parâmetros (n, r, w) são escolhidos de tal forma que a condição GV seja satisfeita, ou seja, n

w ≈ 2 r.

Com isto, podem-se denir instâncias do problema de decodicação de síndrome para as quais se tenha em média uma solução e construir uma coleção de funções de mão única (fr,w

n )n≥0 da seguinte forma. Denimos subconjuntos Dnr,w ⊂ F r×n

2 × Fn2 como Dnr,w =(H, x) ∈ Fr×n2 × Fn2, kxk = w ,

Então, tomamos uma coleção de funções (fr,w

n )n≥0 relacionadas ao problema de decodi- cação de síndrome:

fnr,w : Dnr,w → Fr(n+1)2 (5.1) x 7→ fnr,w(x) = H, HxT (5.2) Cada função fr,w

n expande sua entrada, tomando um elemento de 2rn nw 

e dando como saída um de 2r(n+1).

Tomando como ponto de partida fr,w

n denida sobre Dr,wn , Fischer e Stern propuseram um gerador interativo Gr,w

n , seguido o Algoritmo 10. Em cada interação, para produzir r−dlog2 wnebits através de Gr,wn , calculamos o produto de H por um vetor de inicialização e0 com dimensão n e peso de Hamming w.

Atribuímos o resultado a um vetor z de comprimento r, o qual é decomposto em duas partes z1 e calculamos z2 de comprimentos dlog2

n

we e r − dlog2 n

we, respectivamente. A primeira parte z1 é codicada como um vetor de comprimento n e peso w, que será a entrada da interação seguinte, ao passo que a segunda parte z2 é utilizada como saída. A geração de vetores de dimensão n e peso w a partir de z1 segue o método de codicação enumerativa de Guillot [45]. Através dele um inteiro x ∈ 1, n

w 

é transformado numa palavra binária de comprimento n e peso w. Sua complexidade é de O(n2log

2n). Para melhorar desempenho, Fischer e Stern sugerem que os coecientes binomiais utilizados pelo algoritmo sejam tabelados. Para um código com parâmetros (n, r, w), o espaço necessário para tal tabela é de (n · r · w) bits, dado que há n · w entradas de tamanho r bits. Adicionalmente, r(n − r) bits são necessários para armazenar a matriz H.

Algoritmo 9 Algoritmo de codicação Fischer-Stern 1: Entrada : inteiros positivos i ∈ Fdlog2(

n w)e

2 , n e w

2: Saída : palavra e = (e1, e2, · · · , en)de comprimento n e peso w 3: t ← wn, t0 ← 0, j ← n 4: while j > 0 do 5: t0 ← t · j−wj 6: if i ≤ t0 then 7: ej ← 0 8: t ← t0 9: else 10: ej ← 1 11: i ← i − t0 12: t ← t ·wn 13: j ← j − 1 14: end if 15: end while

Análise de Segurança. Em [36], o caráter pseudoaleatório de Gr,w

n é decorrente do pressuposto de que (fr,w

n )n≥0 denidas sobre Dnr,w seja uma família de funções de mão única. Se assumirmos, por absurdo, que Gn,w

r não é pseudoaleatória podemos construir um algoritmo para distinguir sequências de bits geradas por Gn,w

Algoritmo 10 Fischer-Stern PRNG

Entrada : matriz binária H e vetor de inicialização x tais que (H, x) ∈ Dr,w n Saída : Sequência binária (yi)i tal que yi ∈ F

r−dlog2( n w)e

2 1: Computar z = H · x

2: Dividir z em dois vetores z1 e z2 tais que z = (z1, z2) ∈ F

dlog2(nw)e 2 × F r−dlog2( n w)e 2 3: Dar como saída z2

4: Codicar z1 como string binário x0 de dimensão n e peso de Hamming w. 5: Substituir x por x0

6: Voltar para início.

n r w tamanho da saída nível de segurança

512 256 56 5 67 512 256 55 8 66 512 256 50 23 55 728 364 78 11 91 728 364 71 32 82 1024 512 110 12 126 1024 512 100 43 114

Tabela 5.1: Parâmetros para Fischer-Stern PRNG

Fn2. Podemos, então, utilizar tal algoritmo para prever o valor de um produto interno entre xe y com uma probabilidade superior a 1

p(n). Este último resultado, no entanto, contradiz a propriedade de mão única de (fr,w

n )n≥0, considerando-se o resultado de Goldreich-Levin sobre hardcore bits [43].

Desempenho. A cada rodada do algoritmo, para gerar uma sequência aleatória z per- tencente ao conjunto Fr−dlog2(wn)e

2 , faz-se necessário calcular o produto de H por um vetor binário de dimensão n e peso de Hamming w. Pode-se fazer isto através da operação ou-exclusivo de w colunas de H, totalizando rw operações binárias. As posições das colunas são dadas pelos índices j de ej para os quais ej = 1. Assim, o custo do algo- ritmo como um todo é dominado pela parte descrita no subalgoritmo 9, de complexidade O(n2log

2(n)). Portanto, a geração de r−dlog2 n

webits através do esquema Fischer-Stern custa O(n2log

2(n))operações binárias.

Parâmetros. A Tabela 5.1 mostra o conjunto de parâmetros (n, r, w) proposto em [36]. O nível de segurança corresponde ao obtido através das técnicas de Finiasz e Sendrier [35].

Cifrador SYND

Descrição. Proposto por Gaborit, Lauradoux e Sendrier [39], este esquema corresponde a uma melhoria sobre o esquema Fisher-Stern PRNG [36] descrito acima. Notadamente, a introdução de códigos quase-cíclicos reduz as necessidades de armazenamento. Além

disso uso de palavras regulares in [7] acelera o PRNG. As fases que o compõem são: inicialização, atualização e saída.

(1) Inicialização: produz um estado inicial e0 a partir de uma chave privada K e de um vetor de inicialização IV de comprimento r/2 bits, como descrito a seguir. Sejam g1 e g2 dois mapeamentos denidos como

g1 : Fr2 → F r 2 (5.3) x 7→ g1(x) = H1· (φ(x))T (5.4) e g2 : Fr2 → F r 2 (5.5) x 7→ g2(x) = H2· (φ(x))T (5.6) H1 e H2 são duas matrizes circulantes de mesma dimensão r × n, com

r = w log2(n/w). Além disso, o algoritmo de codicação regular, x 7→ φ(x) mapeia strings de r bits em palavras de tamanho n e peso de Hamming w. A saída é composta por w blocos de comprimento n/w (restrito a potências de 2), contendo apenas um bit não-nulo. Com isto, consegue-se acelerar multiplicações entre vetores e matrizes.

A partir de (gi)i=1,2, constrói-se a função de inicialização f, como descrito a seguir f : Fr/22 × F

r/2 2 → F

r 2

(x||y) 7→ f (x||y) = (x||y) ⊕ g1(x||y) ⊕ g2((x||y) ⊕ g1((x||y) ⊕ g1(x||y))) A obtenção de e0 requer 3(r + w) XORs.

(2) Atualização: nesta fase utiliza-se o mapeamento g1 para produzir um novo estado interno ei+1 como ei+1← g1(ei) e e0 = f (K, IV ).

(3) Saída: o estado interno eN passa pelo mapeamento g2 para gerar parte do string de saída, que posteriormente a adicionado módulo-2 ao texto claro, resultando no texto cifrado.

Análise de segurança A segurança do SYND pode ser reduzida ao de um caso especial do problema de decodicação de síndrome sobre palavras regulares (RSD), que é NP- completo [7]. A obtenção da chave privada ou do estado interno envolvem a inversão de g1 ou g2, que são instanciações do RSD. De acordo com Gaborit, Lauradoux e Sendrier, a prova das armações acima decorre de [11] e [36], de onde se conclui que a existência de um adversário A capaz de distinguir a sequência gerada pelo PRNG de uma sequência aleatória em tempo T com vantagem  implica na existência de um algoritmo A0 capaz de obter o estado interno e em tempo T0 27n2λ2T

2 , onde λ é o número de iterações. Eles

n = 8192 w r Bits de Segurança 16 128 44 24 192 61 32 256 78 48 384 111 64 512 144 128 1024 275

Tabela 5.2: Parâmetros para SYND

Desempenho. A complexidade do algoritmo SYND é dominada pelas operações XOR. Atualização e saída requerem Nw e w XORs, respectivamente, considerando N rodadas. Assim, para gerar um string de r bits temos

3r + w(N + 4) = O(N ) operações binárias

No que concerne armazenamento, precisa-se de r para chave e vetor de inicialização e n para caracterizar a matriz quase-cíclica de vericação de paridade.

Parâmetros Listados na Tabela 5.2, onde se vê uma comparação com o AES. Os níveis de segurança calculados seguem os pressupostos de [35].

5.1.2 Trabalhos Relacionados sobre Reticulados

PRNG baseado em problemas de aprendizado Baseados na diculdade do pro- blema Aprendendo de Paridade com Ruído` (LPN), Applebaum, Cash, Peikert e Sahai [6] construíram um PRNG que dobra o comprimento da entrada e pode ser implementado através de um circuito booliano com tamanho ˜O(n). Tal circuito tem, portanto, tamanho quase-linear com relação à entrada. Isto representa uma melhoria em relação a outras construções com extensão linear da entrada, tais como as propostas de Damgård e Niel- sen [29], Dodis, Kalai e Lovett [30], e Gennaro [42]. Adicionalmente, quando aplicadas às reduções propostas por Ishai, Kushilevitz, Ostrovsky e Sahai[51], tal PRNG resulta numa implementação com acréscimo polilogarítmico para várias primitivas, dentre as quais es- quemas de compromisso, encriptação simétrica e de chave pública.

Funções de Alçapão com Perdas (LTDF, de Lossy Trapdoor Functions) e Problemas de Aprendizado Peikert e Waters [86] propuseram construções do tipo LTDF utilizando os pressupostos de diculdade computacional dos problemas de Decisão de Die-Hellman (DDH) e de Aprendizado com Erros (LWE, de Learning with Errors). Sua proposta permite a reutilização de aleatoriedade com várias chaves de encriptação, de forma semelhante a variações do esquema ElGamal tais como a de Bellare et al. [10]. Tal reutilização implica ganho em eciência. A construção baseada em LTDF assemelha-se ao PRNG proposto por Naor e Reingold [77], no que diz respeito à indistinguibilidade entre as funções injetoras e as com perdas, tomando como ponto de partida a pseudoaleatoriedade

dos números gerados. A inovação introduzida por Peikert e Waters reside na utilização da estrutura homeomórca para calcular produtos lineares cifrados, e em limitar o número possível de saídas para o caso de funções com perdas.

Nosso trabalho faz uma adaptação do SYND [39] para a área de reticulados. Nossa construção utiliza reticulados ideais para melhoria de desempenho, a semelhança do obtido com a família de funções SWIFFT [64].

Preliminares

Micciancio e Regev mostram em [71] as condições sob as quais a solução de GapSVP no pior caso pode ser reduzida à solução de SIS no caso médio, assintoticamente. Ataques de aniversário, como o proposto por Wagner [98], e o estado-da-arte em algoritmos de redução em reticulados [40] podem servir como guia para estabelecer parâmetros para um nível desejado de segurança. O comprimento do vetor mais curto que se pode obter atualmente a partir de algoritmos de redução é limitado por (δ ≈ 1, 011):

norma = min{q, qn/mδm} (5.7)

Na Tabela 5.3, propomos a utilização dos mesmos parâmetros empregados na família de funções hash SWIFFT[64]. Sob tais condições, o melhor ataque atualmente conhecido para obter vetores curto [98] é um método combinatório com complexidade acima de 2100. Denição 5.1.1 (Discriminante de um gerador de números através de uma única per- gunta). Seja um gerador de números g : {0, 1}n

→ {0, 1}L com L > n, que expande uma semente secreta aleatória de n bits numa sequência de L bits. Denimos como discri- minante em tempo t para g como um algoritmo probabilístico A que, recebendo como entrada uma sequência de comprimento L bits, dá como resultado 0 ou 1 com complexi- dade em tempo limitada por t. Denimos como vantagem de A em distinguir g de um gerador aleatório Advprngg (A) = P rx∈{0,1} n(A(g(x)) = 1) − P r y∈{0,1}L(A(y) = 1) .

A probabilidade é considerada sobre os valores de escolhas aleatórias de x ∈ {0, 1}n, de y ∈ {0, 1}L, e do algoritmo A. Dizemos que a vantagem em distinguir a função g em tempo t é dada por

Advprngg (t) = maxAAdvprngg (A) .

Denição 5.1.2 (Gerador de Números Pseudoaleatórios (PRNG)). Consideramos uma função g como PRNG se Advprng

g (t)for desprezível para valores de t abaixo de um limiar xo. Isto permite ajustar a denição de um PRNG a níveis aceitáveis de segurança. Denição 5.1.3 (Distinguindo um gerador de funções). Dado um gerador de funções, que corresponde a uma família F = {fK}de funções de n-bits para m-bits indexadas por uma chave K aleatoriamente escolhida de {0, 1}k, chamamos de discriminante em tempo t com numq consultas para F um algoritmo probabilístico Af, ao qual se permite fazer até numq consultas a um oráculo de funções de n-bits par m-bits. Este algoritmo permite distinguir uma função fK (aleatoriamente escolhida de F) de uma função perfeitamente aleatória f∗

(aleatoriamente escolhida do conjunto Fn,m de todas as funções {0, 1} → {0, 1} ) com vantagem

AdvprfF (A) = P r(AfK = 1) − P r(Af∗ = 1)

.

As probabilidades são tomadas sobre as escolhas aleatórias de K ∈ {0, 1}k, de f Fn,m∗ (o conjunto das funções de n-bits para m-bits) e de A. Chamamos de vantagem do discriminante da família F tem tempo t com q consultas como

Advprfg (t, numq) = maxA n

AdvprfF (A)o,

onde o máximo é tomado sobre todos os algoritmos A trabalhando em tempo de no máximo t e limitados a fazer até numq consultas ao oráculo de funções de n-bits para m-bits.

Denição 5.1.4 (Função Pseudoaleatória (PRF)). Quando Advprf

g (t, numq) for despre- zível para t e q abaixo de limiares xos, a família de funções F = {fK} é dita PRF.

5.2 Resultado: Cifrador de Fluxo Baseado em SIS

Um PRNG baseado no SIS

A seguir propomos a adaptação do cifrador de uxo SYND, construído sobre códigos corretores de erro, para o domínio de reticulados, objetivando uma construção baseada em intratabilidade no pior caso, sem prejuízo de eciência.

Como discutido na seção 5.1, LWE tem sido usado em algumas propostas de cifra de uxo. Diferentemente, nossa escolha de projeto toma o problema SIS como base de segurança. Isto possibilita uma implementação comparativamente mais simples, evitando os mecanismos de amostra normalmente associados ao LWE. Além disso, SIS permite reduções clássicas de pior caso para caso médio [71], ao contrário de LWE, onde tal redução é quântica [89].

Bloco central Consideremos a família de funções de mão-única F denida por f : Fm2 → Znq, mapeando x em f(x) = Ax mod q, com A ∈ Zn×mq e q um número primo. Assumimos mão-única computacional, à semelhança de [52], por exemplo. Nossa escolha para q, não sendo uma potência de 2, implica numa predisposição na sequência gerada, que será detalhado no módulo Atualizador de Estado.

Construção Iterativa - Pseudocódigo Aplicando uma construção-padrão, seme- lhante à do SYND, obtemos um gerador iterativo capaz de produzir uma sequência pseu- doaleatória de bits de comprimento arbitrário. Cada iteração corresponde à aplicação da construção básica mostrada na Figura 5.1. Posteriormente, detalharemos cada bloco constituinte do PRNG.

Figura 5.1: PRNG baseado no problema SIS

1 Inicializador : Obter o estado atual w através de uma rede Feistel aplicada a K e IV.

2 Atualizador de Estado :

Calcular S = Ax mod q, onde S ∈ Zn

q e x ∈ Fm2 com peso de Hamming m/2. Dividir o estado atual S = (y||z) numa parte que alimentará a saída y ∈ Zn/2

q e numa parte que será realimentada z ∈ Zn/2

q .

3 Equalizador de Peso : Transformar o vetor z em x ∈ Fm

2 com peso de Hamming m/2.

• Saída: O vetor y ∈ Zn/2q é mapeado em Zn/2256. A imagem é permutada através SBox antes de ser salva na sequência de bits de saída. O propósito deste passo é melhorar a propriedade de não-linearidade, similarmente ao feito com a família de funções hash SWIFFT.

4 Voltar ao passo 2.

Diagrama em Blocos do PRNG Seu projeto é dado na Figura 5.1 e segue os prin- cípios do cifrador de uxo SYND [39]. Seus maiores componentes são:

Inicializador: g : Fm/4

2 × F

m/4

2 → Fm2 . Segue o paradigma Feistel usado pelo cifra- dor de uxo SYND [39]. Escolhemos f1 e f2 como mapeamentos de vetores bi- nários de dimensão m em vetores de Fm

2 através de f1(x) = dup(A1x mod q) e f2(x) = dup(A2x mod q), onde A1, A2 ∈ Z

n/2×m

q , tais que A = [A1; A2] ∈ Zn×mq correspondem à matriz utilizada pelo módulo Atualizador de Estado, descrito a se- guir. As matrizes A1 e A2 são parâmetros do sistema. O estado inicial é obtido como

g(K, IV) = z + f2(y + f1(z))

onde y = dup(K || IV) e z = f1(y) + y. A função dup duplica o comprimento de sua entrada convertendo suas coordenadas para Z256, e mapeando cada bit 0 em 01, e cada bit 1 em 10. Isto faz y assumir valores em Fm

Atualizador de Estado: Seja f : F2 → Zq denido com f(x) = Ax mod q, com A ∈ Zn×m

q . Então, a saída de f é dividida em dois vetores. O mais à esquerda é atribuído a y ∈ Zn/2

q , e alimentado à saída correspondente à sequência pseudo- aleatória sendo gerada, depois que cada coordenada é convertida em elementos de Z256, pela remoção do bit mais signicativo e pela passagem através da permutação Sbox. A parte mais à direta, denotada por z ∈ Zn/2

q , e usada como realimentação para a entrada do Atualizador de Estado, depois de passar pelo módulo Equali- zador de Peso, que também converte cada coordenada para Z256 usando Sbox e aplicando quadruplicação de bits, resultando num novo estado em Fm

2 . A matriz A é um parâmetro de entrada para o sistema. Aplicamos os parâmetros descritos na Tabela 5.3. O Atualizador de Estado representa uma instância do problema SIS. Nossa construção corresponde a instâncias bastante difíceis deste problema, dado que corresponde a encontrar pre-imagens com norma muito pequena. Tais soluções são computacionalmente difíceis de se obter.

Ao obter valores para y e z no Atualizador de Estado, escolhemos descartar o bit mais signicante de cada coordenada dos vetores. Isto evita o problema de ter a sequência gerada tendendo fortemente em direção ao zero, considerando os bits que distam 9 unidades, a contar do primeiro bit gerado. Isto é consequência de termos as coordenadas de y assumindo valores uniformemente em Zq, onde apenas o elemento de valor 256 tem o nono bit setado. Os demais elementos têm este bit assumindo valore zero. Assim, a probabilidade de termos o nono bit assumindo o valor zero na sequência correspondendo a y é de aproximadamente 256/257. Filtrando-se tal bit da sequência de saída faz com que tenhamos um resultado mais próximo de uma distribuição uniforme. A solução não é completa, no entanto, por que a coordenada com valor 00000000 (em binário) torna-se mais frequente que as outras 255, pois ao eliminarmos o nono bit temos o valores 256 também sendo mapeado em 00000000 (binário). Endereçamos este problema pela remoção sistemática de toda coordenada de valor 256.

Equalizador de Peso: θ : Zn/2

q → Fm2 . Em modo de inicialização, este módulo não executa nenhuma ação. Em modo de operação, ele toma o vetor de realimentação z ∈ Zn/2q e converte-o em x ∈ Fm2 com peso de Hamming m/2. Esta conversão garante que a instanciação de SIS não homogêneo realizada pelo Atualizador de Estado tem como entrada um vetor de norma muito pequena, sendo difícil de ser obtido por inversão. Este módulo toma cada coordenada pertencente a Zq, remove seu bit mais signicativo e passa o resultado através de uma permutação Sbox, obtendo um valor em Z256. O vetor resultante é tomado como uma coleção de bits que será passada por duas sequências de duplicação. Cada sequência substitui bits 0 por 01, e bits 1 por 10. A saída deste módulo corresponde a um valor em Fm

2 . A Tabela 5.3 lista os parâmetros envolvidos numa instanciação de nosso PRNG. Os valores de n, m e q tomaram por base a família de funções hash SWIFFT [64]. Utilizando uma abordagem padronizada, este PRNG dá origem a um cifrador de uxo através da operação de XOR entre o texto em claro e a sequência pseudoaleatória gerada.

Variável Domínio Descrição Tamanho em bits w Fm 2 Estado m = 1024 y Zn/2q PRNG bn/2 log2(q)c = 256 z Zn/2q Realimentação bn/2 log2(q)c = 256 K Fm/42 Chave m/4 = 256 IV Fm/22 Vetor de Inicialização m/4 = 256 A Zn×mq Base do Reticulado bnm log2(q)c

Tabela 5.3: Parâmetros (n, q, m) = (64, 257, 1024).

Construções Alternativas Em nossa construção, em cada rodada de cálculo da ope- ração básica f = Ax mod q, uma fração da saída é utilizada como realimentação para a próxima entrada. Abaixo, damos duas construções alternativas. A primeira, que con- sideramos mais segura do ponto de vista teórico, aproxima-se mais de uma instanciação padrão do problema SIS. A segunda, que é mais eciente, utiliza casos mais particulares

Documentos relacionados