Como as cifras SHACAL-2 são calculadas?
Estou tentando aprender sobre a funcionalidade subjacente das diferentes funções hash (atualmente SHA) e estou muito preso, mesmo depois de assistir a um vídeo de Stanford sobre isso.
Um método de hash é usando a construção Merkel-Damgård com a função David Meyers e cifras de bloco SHACAL-2.
Pelo que entendi, MD é a mensagem dividida em uma cadeia de blocos de 64 bits contendo o valor do bloco anterior ou IV (vetor inicial definido pela função hash ou uma chave salt personalizada). O valor do bloco ou IV junto com o valor do bloco atual e alguma chave de x bits é depois de passar pela função SHACAL-2 e então a nova cifra.
Isso está correto entendido? Se for: O que acontece dentro da função SHACAL? O que é matemática?
Achei isso, mas realmente não responde à minha pergunta: SHACAL em SHA-256
Respostas
A construção MD usa uma função de compressão $C$ ($F$ nas figuras) de modo que tenha duas entradas.
$$h_i = C(h_{i-1},m_i)$$
e a primeira $h_{-1} = IV$ e o último $H = h_{2^k-1}$ é o valor de hash.
A função de compressão pode usar uma cifra de bloco, em que a mensagem para a cifra de bloco é o valor de hash anterior e a chave é a mensagem. $h_i = E_{m}(h_{i-1})$
A primeira descrição do uso de uma cifra de bloco para a função de compressão existe na tese de Merkle na página 11 . Esta construção é totalmente insegura visto que a cifra de bloco existente encadeada diretamente e pode-se comprovar que possui$\mathcal{O}(2^{n/2})$ resistência de segunda pré-imagem em vez de $\mathcal{O}(2^{n})$.
Não queremos ataques de chave relacionados como existem em algumas das cifras de bloco como AES e DES. Isso não cria um problema para a criptografia, uma vez que as chaves são escolhidas de maneira uniforme e aleatória; no entanto, as chaves relacionadas podem ser usadas para atacar a função hash. Isso é amplamente discutido por Mannik e Preenel
Queremos grandes entradas devido aos ataques de colisão nas funções de compressão [1] e, portanto, mais rodadas para processar. Assim, os designers criam uma nova cifra de bloco para construções de MD em vez de usar as existentes. Para SHA-1 é denominado SHACAL e para SHA-2 é denominado SHACAL-2.
O valor de divisão depende da função de compressão, MD5, SHA-1 e SHA256 usa blocos de mensagem de 512 bits, SHA512 está usando blocos de mensagem de 1024 bits. As mensagens são preenchidas para serem múltiplas do tamanho do bloco com o tamanho da mensagem codificado no final.
Por exemplo, preenchimento SHA-512 em NIST FIPS 180-4
Suponha que o comprimento da mensagem, $M$, é $\ell$bits. Acrescente o bit
1
ao final da mensagem, seguido por$k$ zero bits, onde $k$ é a menor solução não negativa para a equação $$\ell + 1 + k \equiv 896 \bmod 1024$$ Em seguida, anexe o bloco de 128 bits que é igual ao número $\ell$ expresso usando uma representação binária
Formalizar para tamanho de bloco arbitrário $b$ e $d$tamanho da mensagem codificada de bits (64 para SHA-1 e SHA256, 128 para SHA512.
$$\ell + 1 + k \equiv b-d \bmod b$$
Portanto, os critérios de design são ter uma cifra de bloco com muitas rodadas, SHACAL tem 80, SHA-256 tem 64 e SHA512 tem 80 rodadas, mantendo a função de rodada simples.
E a cifra de bloco é usada como Davies – Meyer para criar uma função de compressão unilateral.
Por exemplo, a matemática para SHA256 é
- $\operatorname{Ch}(E,F,G) = (E \land F) \oplus (\neg E \land G)$
- $\operatorname{Ma}(A,B,C) = (A \land B) \oplus (A \land C) \oplus (B \land C)$
- $\Sigma_0(A) = (A\!\ggg\!2) \oplus (A\!\ggg\!13) \oplus (A\!\ggg\!22)$
- $\Sigma_1(E) = (E\!\ggg\!6) \oplus (E\!\ggg\!11) \oplus (E\!\ggg\!25)$
A rotação bit a bit usa constantes diferentes para SHA-512. Os números fornecidos são para SHA-256.
O vermelho$\boxplus$ significar $ c = a + b \mod 2^{32}$, ou seja, adição de módulo.
Como podemos ver, operações simples que as CPUs podem realizar, função redonda leve, com estrutura Feistel um pouco desequilibrada degradada.
E aprendemos com o algoritmo Tiny Encryption que mesmo rodadas simples podem ser seguras após 32 rodadas.