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 Cifrário SHJ

Seg

10

Abr

2006


20:37

(2 votos, média 5.00 de 5) 


2.0 Sobre o processo de cifragem

A cifragem do sistema SHJ é muito simples. A estrutura de cifragem tem 20 voltas e inicia com a adição de 4 palavras chaves nas words A, B, C e D que representam um bloco de texto claro com 64 bits. As palavras chaves são inseridas através de soma e XOR (N = 1, índice das sub-chaves e KEY é o vetor com 84 sub-chaves):

A = (A + KEY[N + 0]) MOD 65536
B = B XOR KEY[N + 1]
C = C XOR KEY[N + 2]
D = (D + KEY[N + 3]) MOD 65536

O próximo passo representa a estrutura de difusão do sistema SHJ. Neste passo procurou-se fazer com que a interação entre as 4 words que representam o bloco em processamento seja o mais confusa possível (sem complicar demais o código de cifragem!). Vejam:

X1 = A XOR B
X2 = (A + B) MOD 65536
X1 = X1 XOR ROT(X2,3)
X2 = (X1 * X2) MOD 65536
X1 = X1 XOR ROT(C,9)

C = C XOR X2
D = D XOR X1

O código acima altera as palavras C e D com X2 e X1. Este representa uma fusão entre A, B e C; aquele representa fusão entre A e B.

O próximo passo é a alteração da palavra B:

B = (B + ((CAIXA1[(C MOD 256) + 1] * 256) + (CAIXA2[(D DIV 256) + 1]))) MOD 65536

CAIXA1 e CAIXA2 são SBOX’s do sistema. MOD representa módulo e DIV representa a parte inteira de uma operação de divisão; * = multiplicação.

O próximo passo é a alteração da palavra A. A alteração processa-se como segue:

X = ROT(B,(C + D) MOD 16)
X = (CAIXA3[(X DIV 256) + 1] * 256) + CAIXA4[(X MOD 256) + 1]
A = A XOR X

Uma pequena observação deve ser feita em relação ao código acima. Ele é executado em 19 das 20 voltas da estrutura de cifragem. Na volta de número 13 a palavra A fica inalterada (esta rotina é desprezada na 13ª volta).

Para finalizar a estrutura de cifragem temos a inversão das palavras A e C; B e D. Veja:

TMP = A
A = C
C = TMP

TMP = B
B = D
D = TMP

A última instrução antes de começar a próxima volta é incrementar o índice de sub-chaves N. Neste caso N = N + 4. Depois voltamos ao início da estrutura de cifragem e começamos a 2ª volta. Faremos o mesmo para as voltas restantes até que se complete a 20ª volta.

Após a 20ª volta inserimos mais 4 sub-chaves nas words e terminamos a cifragem:

A = (A + KEY[N + 0]) MOD 65536
B = B XOR KEY[N + 1]
C = C XOR KEY[N + 2]
D = (D + KEY[N + 3]) MOD 65536

O bloco cifrado é a concatenação das words A, B, C e D.

2.1 Sobre o processo de decifragem

O processo de decifragem com o algoritmo SHJ é quase idêntico ao processo de cifragem. Ele pode ser condensado no pseudocódigo abaixo:

* Passo 1: Inverso do passo final:

A = (A - KEY[81] + 65536) MOD 65536
B = B XOR KEY[82]
C = C XOR KEY[83]
D = (D - KEY[84] + 65536) MOD 65536

N := 77 // INDICE DE SUB-CHAVES

FOR CONT := 20 TO 1 STEP -1

* DECIFRAGEM DA INVERSÃO:

TMP = A
A = C
C = TMP

TMP = B
B = D
D = TMP

* Passo 2: DECIFRAGEM DA ESTRUTURA DE DIFUSÃO:

X = ROT(B,(C + D) MOD 16)
X = CAIXA3[(X DIV 256) + 1] * 256) + CAIXA4[(X MOD 256) + 1]
A = A XOR X
B = (B - ((CAIXA1[(C MOD 256) + 1] * 256) + (CAIXA2[(D DIV 256) + 1] )) + 65536) MOD 65536

X1 = A XOR B
X2 = (A + B) MOD 65536
X1 = X1 XOR ROT(X2,3)
X2 = (X1 * X2) MOD 65536


C = C XOR X2
X1 = X1 XOR ROT(C,9)
D = D XOR X1

* Passo 1: Inverso do passo inicial


A = (A - KEY[N + 0] + 65536) MOD 65536

B = B XOR KEY[N + 1]
C = C XOR KEY[N + 2]
D = (D - KEY[N + 3] + 65536) MOD 65536

N = N - 4
NEXT

Informações adicionais