Criptografia Numaboa
SHA-1 *
Qui 7 Set 2006 20:06 |
- Detalhes
- Categoria: Funções Hash
- Atualização: Domingo, 06 Dezembro 2009 22:22
- Autor: vovó Vicki
- Acessos: 20407
O SHA-1 (Secure Hash Algorithm - Algoritmo Hash Seguro) foi aprovado pelo governo dos EUA em 1995 para ser usado por todos os departamentos e agências federais na autenticação de documentos digitais.
O que é o SHA-1
O SHA-1 é um padrão usado para calcular a representação condensada de uma mensagem ou arquivo de dados. Partindo de uma mensagem menor do que 264 bits, o SHA-1 produz uma saída de 160 bits chamada de digesto da mensagem. Este digesto pode ser a entrada para o DSA (Digital Signature Algorithm - Algoritmo de Assinatura Digital), o qual gera ou faz a verificação da assinatura da mensagem. Criar uma assinatura para o digesto, ao invés de criar uma para a mensagem, costuma melhorar a eficiência do processo porque o digesto da mensagem habitualmente é muito menor do que a mensagem. Tanto o verificador, quanto o criador, precisam usar o mesmo algoritmo hash para gerar e verificar uma assinatura digital.
O SHA-1 foi considerado seguro porque é impraticável encontrar uma mensagem que corresponda a um determinado digesto ou encontrar duas mensagens diferentes que produzam o mesmo digesto. Qualquer alteração feita numa mensagem em trânsito, com grande probabilidade dará como resultado um digesto diferente e a assinatura não poderá ser confirmada. O SHA-1 é uma revisão técnica do SHA - foi adicionada uma operação de deslocamento circular para a esquerda para aumentar a segurança oferecida por este padrão. O SHA-1 foi baseado em princípios semelhantes aos usados no algoritmo MD4, criado pelo professor do MIT, Ronald L. Rivest.
Aplicações do SHA-1
O SHA-1 pode ser aplicado, juntamente com o DSA, em e-mails, transferências eletrônicas de fundos, distribuição de software, armazenamento de dados e outras aplicações que requeiram garantia de integridade de dados e autenticação da origem dos dados. O SHA-1 também pode ser utilizado sempre que for necessário gerar uma versão condensada de uma mensagem.
O algoritmo SHA-1
Antes do cálculo do digesto propriamente dito, o tamanho em bits da mensagem precisa ser ajustado, as funções para os cálculos precisam ser preparadas e algumas constantes precisam ser definidas.
Ajuste do tamanho da mensagem
O objetivo deste ajuste é transformar o comprimento da mensagem num múltiplo de 512 bits porque o cálculo do digesto pelo SHA-1 processa sequencialmente blocos do referido tamanho. Se a mensagem que servirá de base para o cálculo do digesto for menor do que 264 bits, a primeira etapa é adicionar 1 bit no final da mensagem. Se usarmos a mensagem teste como base, seus bits serão os mostrados na linha identificada por ASCII (binário):
Mensagem | t | e | s | t | e | ASCII (hexa) | 74 | 65 | 73 | 74 | 65 | ASCII (binário) | 0111 0100 | 0110 0101 | 0111 0011 | 0111 0100 | 0110 0101 |
Ou seja, o primeiro passo é transformar a mensagem
01110100 01100101 01110011 01110100 01100101
em
01110100 01100101 01110011 01110100 01100101 1
Neste caso temos apenas um bloco de 41 bits, longe dos 512 necessários. Para completar este número, após o bit delimitador são acrescentados tantos bits zero quantos forem necessários para alcançar o tamanho desejado. Acontece que os últimos 64 bits do último bloco da mensagem devem ficar reservados para guardarem o tamanho original da mensagem. Neste nosso exemplo temos apenas um bloco, ou seja, é o primeiro e último. Neste caso, ao invés de adicionarmos 512 - 41 = 471 bits zero, acrescentaremos 512 - 64 - 41 = 407 bits zero. Em notação hexadecimal, a fonte para o SHA-1 com os zeros adicionados passa a ser:
74657374 65800000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
Os últimos 64 bits serão adicionados levando o valor do comprimento da mensagem original, ou seja, 40 (o bit delimitador não é contado). A representação binária do valor 40 é 0010 1000, e a representação hexadecimal do valor 40 ocupando 64 bits é 00000000 00000028. Adicionando este valor, o bloco completo fica
74657374 65800000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000028
As funções do SHA-1
O SHA-1 usa uma sequência de funções lógicas conhecidas por f0, f1, ..., f79. Cada uma destas funções atua sobre três words de 32 bits (B, C e D) para produzirem apenas um word. Para estes três words B, C e D, a função ft(B,C,D) é definida como:
ft(B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19) ft(B,C,D) = B XOR C XOR D (20 <= t <= 39) ft(B,C,D) = (B AND C) OR (B AND D) OR (C AND D) (40 <= t <= 59) ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).
As constantes do SHA-1
A seguinte sequência de constantes de 32 bits K(0), K(1), ... , K(79) é usada. Os valores hexadecimais destas constantes são:
K = 5A827999 ( 0 <= t <= 19) Kt = 6ED9EBA1 (20 <= t <= 39) Kt = 8F1BBCDC (40 <= t <= 59) Kt = CA62C1D6 (60 <= t <= 79).
O cálculo do SHA-1
O digesto é calculado a partir da mensagem ajustada. Para realizar o cálculo são necessários dois buffers que possam armazenar temporariamente cinco words de 32 bits e uma sequência de oitenta words de 32 bits. Os words do primeiro buffer são identificados por A, B, C, D e E. Os words do segundo buffer são identificados por H0, H1, H2, H3 e H4. Os words da sequência de oitenta words são identificados por W0, W1, ..., W79.
Além dos buffers citados acima, usa-se também um buffer TEMP de um word. Os blocos da mensagem (no nosso exemplo temos apenas um), cada um deles com 16 words, são processados sequencialmente como mostrado a seguir:
Inicializando o buffer H
Os cinco words do buffer H recebem os seguintes valores iniciais (expressos em hexadecimal):
H0 = 67452301 H1 = EFCDAB89 H2 = 98BADCFE H3 = 10325476 H4 = C3D2E1F0
O loop de cálculo
Chamando os blocos de 512 bits/16 words da mensagem ajustada de M1, M2, ..., Mn, os seguintes cálculos são realizados:
1. Divide-se Mi em 16 words W0, W1, ... , W15, onde W0 é o word da esquerda. 2. Para t = 16 até 79 faça Wt = S1(Wt-3 XOR Wt-8 XOR Wt-14 XOR Wt-16) 3. Faça A = H0, B = H1, C = H2, D = H3, E = H4 4. Para t = 0 até 79 faça TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt; E = D; D = C; C = S30(B); B = A; A = TEMP; 5. Faça H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E
Depois de processar todos os blocos, o digesto da mensagem será constituído pelos 160 bits representados pelos 5 words H0 H1 H2 H3 H4.
Calcule digestos online
Este pequeno aplicativo permite calcular digestos SHA-1 a partir da mensagem fornecida. Para funcionar é preciso que a JavaScript esteja habilitada no seu navegador.
SHA-1 em Javascript
Este script é da autoria de Paul Johnston e o original pode ser encontrado nas fontes de referência. Para os curiosos, aqui está o script e a form que chama o mesmo:
Fontes de referência
- FIPS 180-1
- A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS PUB 180-1
- Movable Type Scripts - JavaScript da autoria de Chris Veness