Crypton é um algoritmo de cifra de bloco que representa um candidato para o Advanced Encryption Standard (AES). É um sucessor da cifra Square [1], uma cifra de bloco criada por Vincent Rijmen e Joan Daemen, que teve sua primeira publicação em 1997. A estrutura de Square é uma rede de substituição permutação com 8 etapas, operando com blocos de 128 bits e usando uma chave também de 128 bits [2]. Os criadores de Square também foram responsáveis pela criação do algoritmo Rijndael que seria considerado o novo padrão AES.

O algoritmo foi desenvolvido por Chae Hoon Lim em 1998 que na época era diretor de pesquisa no centro de Criptografia e Segurança de Rede da Future Systems Inc. Desde de 2002 trabalha como professor-assistente no departamento de engenharia para internet na Universidade de Sejong (Koréia do Sul).

A estrutura de Crypton é similar a de Square, também processa seus blocos de dados em uma matriz 4x4 byte. No entanto, Crypton se difere de Square em sua permutação de bits e a forma como seus S-boxes são construídos, componentes que são parte essencial no design das cifras de bloco. Chae Hoon Lim resolveu utilizar a estrutura de Square, considerando sua eficiência em processadores modernos que fazem uso de cada vez mais paralelismo.

Uma desvantagem dessa estrutura é que mais registros são necessários para lidar com variáveis intermediárias. A permutação de bits tem uma ordem de difusão de 4, enquanto a multiplicação da matriz MDS em Square tem a ordem de difusão de 5. No entanto, sua permutação de bits é bem simples e eficiente (é implementada utilizando apenas XOR's) e, já que sua involução, isto é, , o processo de criptografia e descriptografia pode ser idêntico. Existem várias opções para um vetor máscara M para .

Atualmente não existem nenhuma patente para o Algoritmo Crypton, sendo considerado de domínio público.

Princípios do Crypton editar

O intuito do projeto principal era:

  • Criar uma cifra simples de ser implementada e usada;
  • Utilizar conceitos na época de criptografias avançada (as S-boxes);
  • Criar uma linguagem que poderia ser usada como gerador de números aleatórios e Stream Cipher.
  • Criar um candidato para o Advanced Encryption Standard (AES).


Estrutura de funcionamento editar

Como foi já foi dito, a estrutura de Crypton é semelhante a de Square, também processa seus blocos de dados em uma matriz 4x4 byte. A rodada de transformação do Crypton funciona em 4 etapas paralelas, são elas: substituição de byte, permutação de byte, transposição de byte e adição da chave. Essas etapas são realizadas 12 vezes, isto é, 12 rodadas, e em cada roda uma subchave é gerada a partir da chave do usuário.

O processo de criptografia e descriptografia pode ser idêntico, exceto que subchaves diferentes são aplicada.

Na Figura 1, podemos ver como é a estrutura de fucionamento de Crypton.

 
Figura 1: Estrutura de funcionamento do Crypton.


Funcionamento do algoritmo editar

[3] [1]

Crypton criptografa blocos de 128 bits com uma chave de até 256 bits, utilizando 12 rodadas (r) para o processo de criptografia. O algoritmo consiste da função de criptografia em si e um keyschedule que deriva (r + 1) subchaves de 128 bits da chave e função de criptografia. A função de encriptação consiste de r rodadas rodeadas por uma transformação dos valores de entrada (definidos por um XOR entre o texto base e a primeira subchave) e uma transformação de valores na saída (definida como um modelo fixo 2 de mapeamento linear).

Vamos representar um bloco A de 128 bits por:

 


Onde cada   é um byte.

Uma rodada consiste em uma substituição de bytes   seguida por uma permutação de bits , uma transposição de bites   e a adição de uma subchave  .   (  para rodadas ímpares e   para rodadas pares) usa duas S-boxes   e  . Só será preciso descrever   visto que para se obter o   é necessário apenas trocar   e  .

   

 (  para rodadas ímpares,   para rodadas pares) é uma permutação de bits. Só é necessário descrever os efeitos de   para rodadas pares visto que, os efeitos de   são similares.   é dado por:

 

 

 

 

 

Onde:        


Nós podemos notar que se omitirmos a adição com T,   resultará em permutações de 4 palavras de 2 bits em cada uma das 16 colunas de palavras de 2 bis na matriz A.

A transposição   apenas consiste em trocar todos os pares de bytes   e   na matriz A e a adição da chave   consiste apenas de XOR entre A e uma subchave de 128 bits K.

   


 

 

 

 

Criptoanálise editar

A seguir serão apresentados dois ataques ao Crypton.

Truncated Differential Attacks on 8-Round Crypton editar

[4]

Ataques em um Crypton de 7 e 8 rounds, com a primeira adição da subchave   e a transformação final  . Vai ser apresentado primeiramente o algoritmo para atacar o Crypton de 7 rounds e depois o algoritmo usando diferentes tabelas de distribuição para as S-boxes. Usando o segundo algoritmo podemos atacar a cifra Crypton até 8 de seus 12 rounds.

O algoritmo para o ataque do Crypton de 7 rounds é realizado da seguinte maneira:

  1. Prepare   conjuntos de    , j = 0, ...,  , i = 0, ...,   que tenham todos os possíveis valores em bytes (1, 2),(1, 0),(3, 2) e (3, 0) e são constantes em outros bytes. Criptografe os conjuntos para ter   conjuntos de   textos cifrados  .
  2. Descriptografe os   conjuntos de   através de  , e então subtraia os conjuntos de   para conseguir   (cada   representa 128 bits depois da adição da chave   no sétimo round).
  3. Inicialize um vetor de   contadores correspondentes a possíveis subchaves para  .
  4. Para cada subchave de 32 bits de valor   faça o seguinte:
    1. Parcialmente criptografe   através das 4 S-boxes ativas no round 1, e subtraia o valor que obtemos em   (cada   representa dados de 128 bits depois da parte não linear   no round 1), e classificar cada conjunto de bytes (1,2), (1,0), (3,2) e (3,0) e escolher o pares do texto  , tal que, a diferença entre   e   são de   de Tipo d.
    2. Verifique se   e   tem diferença zero nas linhas 1 e 3.
    3. Para cada subchave de 64 bits de valor   faça o seguinte:
      1. Parcialmente descriptografe os pares   através   nos 8 bytes ativos, e subtraia o valor que obtemos em   representa dados de 128 bits depois da parte de adicionar a chave   no round 6).
      2. Verifique que   e   tem diferença 0 no bytes (1,2), (1,0), (3,2) e (3,0).
      3. Para cada subchave de 32 bits de valor  , parcialmente descriptografe os pares   através   nas 4 S-boxes ativas, e verifique que a diferença entre decriptar dois textos é de   de Tipo b onde  . Se assim for, aumentar o contador correspondente por 1.
  5. Cheque todos os contadores, e saída de subchaves em que seu valor seja maior ou igual a 6.

A complexidade das informações é   textos-base escolhidos. Devido ao tamanho e quantidade dos textos escolhidos e os   contadores para subchaves, o algoritmo parece requerer um número de bytes maior de memória. No entanto, se lidarmos com o algoritmo delicadamente, a quantidade de memória necessária pode ser reduzida para   bytes. A chance de sucesso dessa técnica é de  .

Agora descrevemos o segundo algoritmo para atacar o Crypton de 7 rounds, é importante primeiro adicionar o passo de pré-computação:

Prepara tabelas de distribuição de diferenças para as 4 S-boxes e armazena os possíveis pares de suas entradas em uma tabela já processada, denominada tabela A, e prepara outra grande tabela especial de processamento, denominada Tabela B, associada com as diferenças de entrada e saída de   nos rounds 6 e 7. Para criar a tabela B primeiro processamos   (valor de entrada e saída) pares de   onde os valores de entrada de   tem todos os valores possíveis em bytes (0,2), (0,0), (2,2) e (2,0) e são zero em outros bytes. (Note que os valores de entrada de   representam as diferenças de saída de   no round 6, e os valores de saída de   representam as diferenças de entrada de   no round 7). A tabela B consiste de um vetor   em que suas linhas correspondem a (valor de entrada, valor de saída) pares de   no round 6, e as colunas correspondem a possíveis diferenças de saída de   no round 7 (ou seja, as colunas correspondem a todos as possíveis diferenças na linha 0 e 2) Se uma entrada do vetor de   for designada por um (I,O) par de   e a diferença de saída   de   no round 7, nós armazenamos nessa entrada todos os possíveis pares que satisfazem   na tabela A onde   representa qualquer diferença do tipo B, junto com todos os possíveis pares que satisfazem:   na tabela A.

  1. Realize os passos 1,2 e 3 do primeiro algoritmo.
  2. De cada conjunto, geramos   pares   e verifique que   e   tem diferença 0 nas linhas 1 e 3.
  3. Para cada par de texto base   relacionados a   que passaram no teste acima faça o seguinte:
    1. Obtenha o valor da subchave   de 32 bits usando a tabela A.
    2. Para cada par  , e para cada   faça o seguinte:
      1. Obtenha os valores da subchave   de 64 bits usando a tabela B.
      2. Usando a subchave   de 64 bits obtida, parcialmente descriptografe   através de   nos 16 bytes ativos, e obtenha os valores da subchave   de 32 bits usando os dois textos descriptados e a tabela B. Aumente o número de contadores relacionados a chave obtida por 1.
  4. Cheque todos os contadores, e saída de subchaves em que seu valor seja maior ou igual a 6.

Esse método foi definido como 99\% eficaz em criptografias de até 8 rounds, no entanto é interessante constar que o recomendado para o Crypton é 12 rounds. O que tornaria essa técnica ineficaz em altos níveis de rounds de criptografia.

Stochastic Attack Using Differential Properties editar

[3]

Esse é um ataque em uma cifra de Crypton completa em 8 rounds.

Apresentamos aqui um ataque em uma cifra encriptada com 6 rounds. Usando leis Heuristicas, podemos calcular as probabilidades das maiores diferenças em vários rounds. Em particular obtemos a seguinte figura para os 6 rounds internos de Crypton: se a diferença de entrada é (18, 18) par dos valores de  , a probabilidade que a saída   pareie com   é  . Da mesma forma, se a entrada é o (128, 128) par de valores   a probabilidade que o valor de saída seja um   par dos valores de   é  .

Esse resultado interno calculado com 6 rounds pode ser um usado em um ataque a uma cifra de 8 rounds. Devido a adição tardia da chave   no primeiro round interno, podemos controlar diferenças na saída da primeira ocorrência de   , e assim o primeiro round pode ser tratado como apenas uma "permutação inicial" sem chave. Um ataque 1R permite também ganhar o último round. Logo podemos explorar as propriedades dos 6 últimos rounds e escolher um ataque via plaintext para obter informações sobre a última chave do round 8.

Para obter pares eficientes dos textos-base cuja diferença   é igual à primeira ocorrência de  , agrupamos os textos-base em estruturas. Dois elementos de 128 bits pertencem a mesma estrutura se e somente se, suas imagens de   forem iguais exceto por alguns dos 16 bits de  . Cada estrutura tem   elementos. Sabemos disso, se dois textos-base X e X' pertecem a mesma estrutura, com probabilidade  , as estradas correspondentes para o oitavo round são da forma de   e  . Apenas consideramos aqueles pares   como o texto cifrado   e checando se   tem a forma correta. Alguns pares são "falsos alarmes" passando pela condição de filtro mas não pertencendo em nenhum conjunto. Uma vez selecionados os 'bons" pares, nós testamos os possíveis valores da chave que vai ser usada no final do oitavo round. O valor candidato que aparecer em maior quantidade é quase sempre o correto. Obtemos 4 bytes de informação em  .

Podemos passar pela última transformação   porque ela não muda o valor de saída do oitavo round. Levando em consideração a primeira adição de uma chave   apenas aumenta o número de falsos alarmes. O número de textos bases para cifras é  . Mas nós precisamos ter uma segurança contra falsos alarmes. Definimos que tirar $N=2^{114.62}$ é o suficiente. Então podemos obter 32 bits de informação da   cifrando   pares   e   na versão completa de Crypton com 8 rounds. A complexidade desse ataque é   encriptações e   computações adicionais.

Esse ataque é mais rápido do que busca exaustiva e ataques diferenciais. De fato, pode mostrar que a probabilidade da melhor caracteristica de um ataque de 8 rounds é  .


Na Prática editar

Nesta seção será apresentado o uso atual do algoritmo de Crypton na prática.

Implementando Crypton em máquinas Little Endian editar

[5]

Já que a especificação original descreve Cryptonde acordo com a convenção de máquinas Little Endian, nós primeiros revisamos uma implementação baseada na convenção nas Little Endian, e usamos de referência para a implementação em uma máquina Big Endian.

Em máquinas Little Endian, uma mensagem de 16 bytes é mapeada como dado interno. A primeira palavra de 4 bits é ordenada por convenção Little Endian e colocada na primeira linha de uma matriz 4 x 4 e a próxima palavra de 4 bytes na segunda linha e assim por diante. Note que isso é equivalente a converter uma string de 16 bytes em um vetor de 4 palavras de 4 bytes.

O texto-base que é representado por uma matriz 4 x 4 é agora sujeito a uma encriptação como nas definições da documentação do Crypton. Depois que a encriptação está completa, a cifra internamente representada como uma matriz 4X4 deve ser transformada novamente em uma mensagem de saída de 16 bytes, pelo processo reverso de encriptação. Nessa especificação Little Endian, o byte do topo a direita serve como a origem da matriz 4 x 4 em termos de ordem.

Crytpon aceita uma chave de 32 bytes. Esses bytes da chaves são mapeados em matrizes de 4 x 4 bytes, uma com bytes pares e outra com ímpares. Essas duas matrizes de chaves de usuários estão sujeitos a expansão de chave (que consiste em preencher os espaços vazios das chaves com 0's) para produzir duas matrizes de chaves expandidas. Então chaves são geradas suscetivamente atualizando a estruturação das chaves.

Implementando Crypton em máquinas Big Endian editar

[5]

Na convenção Big Endian, a ordem dos bytes, quando lendo uma palavra de 4 bytes da memória como um inteiro não definido, é exatamente o reverso da Little Endian. A reorganização dos bytes consume ciclos não negligenciais em implementação de software. Logo seria interessante para um algoritmo permitir reestruturação dos processos lógicos internos para evitar esse problema. Isso é possível em Crypton, já que ele possui essencialmente, porque ele processa a mensagem de entrada byte por byte. Para isso, no entanto, nós temos que rearranjar o processamento interno dos componentes para que o os dados de saída sejam os mesmos que antes.

Nesse ambiente, uma mensagem de entrada de 16 bytes é mapeada em uma matriz interna de 4 x 4 palavras de 4 bytes. Nesse caso o byte do topo esquerdo está servindo como o byte de origem da matriz 4 x 4 em termos de ordem., o que difere o Big Endian do Little Endian, isto é, a diferença do Big Endian e o Little Endian é a ordem dos byte numa palavra de 4 bytes. Depois de completa o processo de criptografia/descriptografia, a matriz 4 x 4 deve ser transformada de volta em uma mensagem de 16 bytes usando o processo reverso de transformação.

Para obter o mesmo resultado na criptografia/descriptografia como em uma convenção Little Endian, é necessário ajustar as operações básicas   e   de uma forma que cada byte esteja sujeito as mesmas operações que uma convenção Little Endian.

A chave interna do processo também deve estar sujeita a mudança de acordo com a ordem de bytes Big Endian. Note que a chave também tem componentes de uma transformação de round. Para garantir o mesmo processamento interno em cada byte como em uma máquina Little Endian, é necessário rearranjar a chave de usuário e produzir rounds de chave na ordem de bytes do Big Endian.

Referências

  1. a b {Chae Hoon Lim, CRYPTON: A New 128-bit Block Cipher - Specification and Analysis (Version 0.5), 1998}
  2. Joan Daemen, Lars Knudsen, Vincent Rijmen. The Block Cipher Square. Fast Software Encryption (FSE) 1997, Volume 1267 of Lecture Notes in Computer Science. Haifa, Israel: Springer-Verlag, pp. 149–165, 1997
  3. a b Marine Minier, Henri Gilbert, Stochastic Cryptanalysis of Crypton, 2001.
  4. Jongsung Kim, Seokhie Hong, Sangjin Lee, Junghwan Song, Hyungjin Yang. Truncated Differential Attacks on 8-Round Crypton, 2004.
  5. a b Chae Hoon Lim. A Note on implementing CRYPTON - Endian-neutral implementation, 2001