Laboratórios
O Cifrário SHJ
Seg 10 Abr 2006 20:37 |
- Detalhes
- Categoria: Laboratório de Criptografia
- Atualização: Terça, 16 Fevereiro 2010 18:37
- Autor: Yugi
- Acessos: 12634
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