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...

Criptografia Numaboa

SHA-1 *

Qui

7

Set

2006


20:06

(22 votos, média 4.64 de 5) 


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.

CÁLCULO DE DIGESTOS SHA-1
Mensagem:
Hash:
Observação: O hash SHA-1 de ‘abc’ deve ser
a9993e364706816aba3e25717850c26c9cd0d89d

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:

> 5] |= 0x80 << (24 - len % 32); x[((len + 64 >> 9) << 4) + 15] = len; var w = Array(80); var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; var e = -1009589776; for(var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; var olde = e; for(var j = 0; j < 80; j++) { if(j < 16) w[j] = x[i + j]; else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j))); e = d; d = c; c = rol(b, 30); b = a; a = t; } a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); e = safe_add(e, olde); } return Array(a, b, c, d, e); } /* * Perform the appropriate triplet combination function for the current * iteration */ function sha1_ft(t, b, c, d) { if(t < 20) return (b & c) | ((~b) & d); if(t < 40) return b ^ c ^ d; if(t < 60) return (b & c) | (b & d) | (c & d); return b ^ c ^ d; } /* * Determine the appropriate additive constant for the current iteration */ function sha1_kt(t) { return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514; } /* * Calculate the HMAC-SHA1 of a key and some data */ function core_hmac_sha1(key, data) { var bkey = str2binb(key); if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz); var ipad = Array(16), opad = Array(16); for(var i = 0; i < 16; i++) { ipad[i] = bkey[i] ^ 0x36363636; opad[i] = bkey[i] ^ 0x5C5C5C5C; } var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz); return core_sha1(opad.concat(hash), 512 + 160); } /* * Add integers, wrapping at 2^32. This uses 16-bit operations internally * to work around bugs in some JS interpreters. */ function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } /* * Bitwise rotate a 32-bit number to the left. */ function rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } /* * Convert an 8-bit or 16-bit string to an array of big-endian words * In 8-bit function, characters >255 have their hi-byte silently ignored. */ function str2binb(str) { var bin = Array(); var mask = (1 << chrsz) - 1; for(var i = 0; i < str.length * chrsz; i += chrsz) bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32); return bin; } /* * Convert an array of big-endian words to a string */ function binb2str(bin) { var str = ""; var mask = (1 << chrsz) - 1; for(var i = 0; i < bin.length * 32; i += chrsz) str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask); return str; } /* * Convert an array of big-endian words to a hex string. */ function binb2hex(binarray) { var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var str = ""; for(var i = 0; i < binarray.length * 4; i++) { str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF); } return str; } /* * Convert an array of big-endian words to a base-64 string */ function binb2b64(binarray) { var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var str = ""; for(var i = 0; i < binarray.length * 4; i += 3) { var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16) | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 ) | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF); for(var j = 0; j < 4; j++) { if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); } } return str; } <form name="form1"> <table align="center"> <tr><td colspan="2" bgcolor="#C0C0C0" align="center">CÁLCULO DE DIGESTOS SHA-1</td></tr> <tr> <td>Mensagem:</td> <td><input type="text" name="message" size="48" value="abc"></td> </tr> <tr> <td></td> <td><input name="button" type="button" onClick="document.form1.hash.value=hex_sha1(document.form1.message.value)" value="Calcular Hash"></td> </tr> <tr bgcolor="#C0C0C0"> <td>Hash:</td> <td><input type="text" name="hash" size="48" readonly></td> </tr> <tr align="center"> <td colspan="2" style="font-size: smaller">Observação: O hash SHA-1 de ‘abc’ deve ser<br />a9993e364706816aba3e25717850c26c9cd0d89d</td> </tr> </table> </form>

Fontes de referência

скачать покер на реальные деньгиинтернет магазин посуда руполигон ооо ноутбук lenovoрепертуар кинотеатров харьковаветрогенераторхарьков никас

Informações adicionais