A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Laboratórios

O Algoritmo CripFix

Sab

22

Nov

2003


22:00

(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 "%«~Ò|Ø#ô".

Informações adicionais