Laboratórios

O Algoritmo CripFix

Sab

22

Nov

2003


22:00

  • Imprimir
(4 votos, média 5.00 de 5) 


O autor do CripFix, Yugi Tumro, disponibiliza um pacote "zipado" contendo o texto explicativo do seu algoritmo, um programa para cifrar e decifrar textos além de um texto desafio cifrado com o CripFix mas de chave desconhecida.

Image Faça o download do CRIPFIX.

OBSERVAÇÕES

CripFix é um Algoritmo Criptográfico de Fluxo. Não é um algoritmo semelhante ao DES, IDEA, AES ou SERPENT. Todos estes algoritmos são baseados em uma cifra de bloco. A maioria deles codifica a mensagem clara em blocos de 128 bits.

CripFix é simplesmente um pequeno Algoritmo Criptográfico onde a mensagem clara é codificada byte a byte. A chave é de 128 bits e ela deve ser digitada em formato ASCII.

CripFix não cria um arquivo temporário ao codificar ou decodificar os arquivos. Como o Algoritmo CripFix foi implementado apenas para o teste do algoritmo estas questões não foram consideradas em sua codificação. Para sua segurança convém criar um diretório e copiar o [CRIPFIX.EXE] para ele. Depois copie o arquivo que você deseja criptografar ou decodificar para este diretório. É necessário verificar que ao informar o arquivo que será criptografado ao CripFix você deve informar o nome com o formato 8.3. O CripFix utiliza o padrão MS-DOS para os nomes dos arquivos.

Anote cuidadosamente a chave utilizada para codificação. Na decodificação a chave de cifra deve ser a mesma da codificação. Cuidado ao misturar letras maiúsculas e minúsculas para compor uma chave. Elas são diferentes para o CripFix. Na realidade o que importa é o código ASCII de cada caracter e não se este caracter é uma letra maiúscula, minúscula, um número ou caracter especial.

Caso você queira acrescentar caracteres especiais à sua chave basta utilizar as teclas no campo onde a chave está sendo digitada.

O arquivo [CRIPFIX.EXE] não é indicado para uso comercial. O software foi implementado para mostrar o uso do criptossistema CripFix. O CripFix não possui um banco de dados para guardar as chaves utilizadas. O gerenciamento de chaves fica por conta do usuário. Quaisquer prejuízos decorrentes do uso ou da impossibilidade do uso deste software serão de total responsabilidade do usuário. O autor do algoritmo somente informa que as funções de cifragem e decifragem funcionam perfeitamente se não houver erro ao digitar as chaves de cifra.

DESCRIÇÃO DO ALGORITMO

A cifragem dos dados com o Cripfix acontece byte a byte. Cada rodada da cifragem com o Cripfix codifica 8 bytes. Caso o tamanho do arquivo não seja múltiplo de 8 a rodada é interrompida.

Vamos codificar a mensagem "aaaaaaaa" com a chave "0123456789ABCDEF".

Dividindo a chave de 16 bytes nos valores A, B, C, D, E, F, G, H

        A = "01" => 12592
B = "23" => 13106
C = "45" => 13620
D = "67" => 14134
E = "89" => 14648
F = "AB" => 16961
G = "CD" => 17475
H = "EF" => 17989

Os valores são obtidos da seguinte forma, tomando como exemplo B = "23": o código ASCII do caracter "2" é 50 (ou 32 hexadecimal) e o do caracter "3" é 51 (ou 33 hexadecimal) portanto, em valores hexadecimais, a string "23" corresponde aos valores hexadecimais 32 e 33. O valor 32 é o byte mais significativo e 33 é o byte menos significativo portanto, na memória, estão dispostos em ordem inversa: 33 32. O valor decimal correspondente ao hexadecimal 3332 é 13106

(observação da vovó Vicki com a devida autorização do autor)

.

Início da cifragem propriamente dita

Nesta fase começamos a codificar o arquivo claro. Antes temos que fazer alguns cálculos. Será necessário uma variável X do tipo caracter com tamanho 20. Esta variável é auxiliar e não é utilizada diretamente para cifrar ou decifrar. Primeiro vamos calcular A * A e B * B, lembrem que A = 12592 e B = 13106:

    A * A = 0158558464
B * B = 0171767236

OBS: As Variáveis A e B permanecem inalteradas!!!

Para padronizar o tamanho de A * A e B * B completamos os números com zeros à esquerda para que eles tenham 10 dígitos. Para obter X basta concatenar estes dois números considerando-os como se eles fossem caracteres.

    X = 01585584640171767236

Vamos utilizar duas variáveis auxiliares: XA e XB. Estas variáveis são numéricas. XA é igual a um número de 5 dígitos assim com XB também é. Para obter os valores de XA e XB basta ler 5 dígitos de X a partir das posições 6 e 11, respectivamente.

    X = 01585584640171767236
XA = 58464

X = 01585584640171767236
XB = 01717

Agora é hora de modificar os valores das variáveis A, B, C, D. Elas permaneceram inalteradas até agora. Os novos valores serão calculados da seguinte forma:

    A = (A + XA + C) MOD 65536
B = (B + XB + D) MOD 65536
C = (C + B) MOD 65536
D = (D + A) MOD 65536

A = (12592 + 58464 + 13620) MOD 65536 => 19140
B = (13106 + 01717 + 14134) MOD 65536 => 28957
C = (13620 + 28957) MOD 65536 => 42577
D = (14134 + 19140) MOD 65536 => 33274

Neste ponto as variáveis A e B serão utilizadas para codificar 4 bytes do arquivo claro. A e B representam um número de 16 bits. Precisamos dividir A e B em 2 partes de 8 bits para criptografar cada byte que possui 8 bits.

    A = 19140
A[1] = 196
A[2] = 74

B = 28957
B[1] = 29
B[2] = 113

A operação de divisão das variáveis A e B é simples de se fazer utilizando um computador. Basta transformar A em uma string de 2 bytes e achar o código ASCII de cada byte. O primeiro será A[1] e o segundo será A[2]. O mesmo vale para a variável B. Na falta de um computador basta utilizar os operadores DIV e MOD. MOD é o resto da divisão e DIV é a parte inteira do resultado da divisão. Vejam abaixo:

    A = 19140
A[1] = (A MOD 256) = 19140 MOD 256 => 196
A[2] = (A DIV 256) = 19140 DIV 256 => 74

B = 28957
B[1] = (B MOD 256) = 28957 MOD 256 => 29
B[2] = (B DIV 256) = 28957 DIV 256 => 113

As variáveis A[1], A[2], B[1] e B[2] contém valores de 0 até 255. A cifragem dos primeiros 4 bytes da mensagem clara fica assim:

    Mensagem = "aaaa"
"a" => 97 (O código ASCII de "a" ‚ 97)

A[1] = (A[1] + "a") MOD 256 => (196 + 97) MOD 256 => 37
A[2] = (A[2] + "a") MOD 256 => (74 + 97) MOD 256 => 171
B[1] = (B[1] + "a") MOD 256 => (29 + 97) MOD 256 => 126
B[2] = (B[2] + "a") MOD 256 => (113 + 97) MOD 256 => 210

Então "aaaa" corresponde a "%«~Ò". Na decifragem o processo é o mesmo, só que ao invés de utilizarmos adição usamos a subtração. Veja:

    Criptograma = "%«~Ò"
"%" => 37
"«" => 171
"~" => 126
"Ò" => 210

A[1] = (- A[1] + "%") MOD 256 => (-196 + 37) MOD 256 => 97
A[2] = (- A[2] + "«") MOD 256 => (-74 + 171) MOD 256 => 97
B[1] = (- B[1] + "~") MOD 256 => (-29 + 126) MOD 256 => 97
B[2] = (- B[2] + "Ò") MOD 256 => (-113 + 210) MOD 256 => 97

Notem que a operação é a mesma. Apenas utilizamos os valores de A[1], A[2], B[1], B[2] negativos.

Vamos repetir todo o processo utilizando as variáveis E, F, G, H. Agora codificamos os outros 4 bytes restantes ("aaaa").

    E = 14648
F = 16961
E * E = 0214563904
F * F = 0287675521

OBS: As Variáveis E e F permanecem inalteradas!!!

Para padronizar o tamanho de E * E e F * F completamos os números com zeros à esquerda para que eles tenham 10 dígitos. Para obter X basta concatenar estes dois números considerando-os como se eles fossem caracteres.

    X = 02145639040287675521

Vamos utilizar duas variáveis auxiliares: XA e XB. Estas variáveis são numéricas. XA é igual a um número de 5 dígitos assim com XB também é. Para obter os valores de XA e XB basta ler 5 dígitos de X a partir das posições 6 e 11, respectivamente.

    X = 02145639040287675521
XA = 63904

X = 02145639040287675521
XB = 02876

Agora é hora de modificar os valores das variáveis E, F, G, H. Elas permaneceram inalteradas até agora. Os novos valores serão calculados da seguinte forma:

    E = (E + XA + G) MOD 65536
F = (F + XB + H) MOD 65536
G = (G + F) MOD 65536
H = (H + E) MOD 65536

E = (14646 + 63904 + 17475) MOD 65536 => 30491
F = (16961 + 02876 + 17989) MOD 65536 => 37826
G = (17475 + 37826) MOD 65536 => 55301
H = (17989 + 30491) MOD 65536 => 48480

Neste ponto as variáveis E e F serão utilizadas para codificar 4 bytes do arquivo claro. E e F representam um número de 16 bits. Precisamos dividir A e B em 2 partes de 8 bits para criptografar cada byte que possui 8 bits.

    E = 30491
E[1] = 27
E[2] = 119

F = 37826
F[1] = 194
F[2] = 147

A operação de divisão das variáveis E e F é simples de se fazer utilizando um computador. Basta transformar E em uma string de 2 bytes e achar o código ASCII de cada byte. O primeiro será E[1] e o segundo será E[2]. O mesmo vale para a variável F. Na falta de um computador basta utilizar os operadores DIV e MOD. MOD é o resto da divisão e DIV é a parte inteira do resultado da divisão. Vejam abaixo:

    E = 30491
E[1] = (E MOD 256) = 30491 MOD 256 => 27
E[2] = (E DIV 256) = 30491 DIV 256 => 119

F = 37826
F[1] = (F MOD 256) = 37826 MOD 256 => 194
F[2] = (F DIV 256) = 37826 DIV 256 => 147

As variáveis E[1], E[2], F[1] e F[2] contém valores de 0 até 255. A cifragem dos primeiros 4 bytes da mensagem clara fica assim:

    Mensagem = "aaaa"
"a" => 97 (O código ASCII de "a" ‚ 97)

E[1] = (E[1] + "a") MOD 256 => (27 + 97) MOD 256 => 124
E[2] = (E[2] + "a") MOD 256 => (119 + 97) MOD 256 => 216
F[1] = (F[1] + "a") MOD 256 => (194 + 97) MOD 256 => 35
F[2] = (F[2] + "a") MOD 256 => (147 + 97) MOD 256 => 244

Então "aaaa" corresponde a "|Ø#ô". Na decifragem o processo é o mesmo, só que ao invés de utilizarmos adição usamos a subtração. Veja:

    Criptograma = "|Ø#ô"
"|" => 124
"Ø" => 216
"#" => 35
"ô" => 244

E[1] = (- E[1] + "|") MOD 256 => (-27 + 124) MOD 256 => 97
E[2] = (- E[2] + "Ø") MOD 256 => (-119 + 216) MOD 256 => 97
F[1] = (- F[1] + "#") MOD 256 => (-194 + 35) MOD 256 => 97
F[2] = (- F[2] + "ô") MOD 256 => (-147 + 244) MOD 256 => 97

Notem que a operação é a mesma. Apenas utilizamos os valores de E[1], E[2], F[1], F[2] negativos.

Agora faremos a junção das variáveis C, D, G, H. Utilizaremos duas variáveis AUX1 e AUX2. Vejam abaixo:

        AUX1 = C
AUX2 = D
C = G + 1
D = H + 3
G = AUX1 + 5
H = AUX2 + 7

AUX1 = 42577
AUX2 = 33274
C = 55301 + 1 => 55302
D = 48480 + 3 => 48483
G = 42577 + 5 => 42582
H = 33274 + 7 => 33281

Neste ponto voltamos ao início do passo 2.2. Os primeiros 8 bytes da mensagem "aaaaaaaa" são os bytes cifrados "%«~Ò|Ø#ô".


ATENÇÃO!!!

CRIPFIX É ENVIADO A ALDEIA NUMABOA COMO UMA CORTESIA DO AUTOR DESTE SOFTWARE. JUNTAMENTE COM O CRIPFIX ESTÁ UM ARQUIVO CRIPTOGRAFADO. É UM DESAFIO PARA OS CURIOSOS DE PLANTÃO TENTAREM DECODIFICAR O ARQUIVO SEM CONHECER A CHAVE DE CIFRA!

O ALGORITMO CRIPFIX FOI UM DOS PRIMEIROS ALGORITMOS QUE EU CONSTRUÍ. SUA ARQUITETURA, NO QUE DIZ RESPEITO A SEGURANÇA, É COMPROMETEDORA. NA VERDADE OS CIFRÁRIOS DE FLUXOS QUE CODIFICAM O ARQUIVO BYTE A BYTE NÃO APRESENTAM A CARACTERÍSTICA DA DIFUSÃO. A DIFUSÃO CONSISTE EM QUE DUAS MENSAGENS MUITO PARECIDAS QUANDO CODIFICADAS COM UMA MESMA CHAVE DEVEM GERAR CRIPTOGRAMAS COMPLETAMENTE DIFERENTES. ISTO ACONTECE QUANDO UTILIZAMOS UM CODIFICADOR DE BLOCOS NO MODO CBC (REALIMENTAÇÃO DE BLOCOS).

SE O ALGORITMO CRIPFIX NÃO REPRESENTA UM VERDADEIRO CRIPTOSSISTEMA, EXTREMAMENTE SEGURO, TALVEZ ELE REPRESENTE O INÍCIO DE UM SONHO, COMPREENDIDO NO SENTIDO MAIS AMPLO QUE ESTA PALAVRA PODE TER. NÓS, OS CRIPTÓGRAFOS, SONHAMOS (EM VÃO?) COM UM CRIPTOSSISTEMA INQUEBRÁVEL.

O ARQUIVO [DESAFIO.DOC] CONTÉM UMA MENSAGEM CRIPTOGRAFADA COM O ALGORITMO CRIPFIX. BOA SORTE!!!

Yugi Tumro

Sobre o autor

O Yugi fez o primeiro contato com a Aldeia em 25.09.03. Em Outubro do mesmo ano enviou o algoritmo CripFix, de sua autoria, enfatizando que o CripFix é um algoritmo prático e que não está enquadrado em nível científico.

O trabalho enviado pelo autor inclui um texto explicativo muito bom, um texto cifrado que o autor coloca para que seja quebrado e um programa para cifrar e decifrar que roda em DOS.

Conheça o Cripfix e aceite o desafio de encontrar a chave do texto cifrado enviado pelo Yugi.

vovo vovó Vicki

mfx brokerблинный торт купитьооо полигон киевкак подобратькласс лобановскийпоследние новостиполигон ооо