• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Gurzi

MD5

12 mensagens neste tópico

Boas,

estava a tentar perceber o código do md5 e desisti completamente :P

Preciso da vossa ajuda, talvez o importante é saber aplicar, ou seja, fazer include e está a andar, mas gostava de perceber o que realmente algumas partes do código fazem, visto que isto é para utilizar numa grande empresa, todo o cuidado é pouco .

Coisas como :

Private m_lOnBits(30)

Private m_l2Power(30)

    m_lOnBits(0) = CLng(1)

Porque raio fazer um convert totalmente do valor 1 para inteiro ? o 1 já não é inteiro ?

        If lValue And 1 Then

            LShift = &H80000000

O que significa o &H80000000 ???  :mad:

Ou por exemplo isto :

    If (lValue And &H80000000) Then

        RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))

    End If

xD

isto é programação assério, estou a ver xD!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou se calhar complicação a sério lol. Uma pergunta já que o título é muito vago, o código que tu tens, pega uma string e encoda pa md5 ou pega num ficheiro e devolve a hash md5?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ou se calhar complicação a sério lol. Uma pergunta já que o título é muito vago, o código que tu tens, pega uma string e encoda pa md5 ou pega num ficheiro e devolve a hash md5?

pega numa string

mas eu posso deixar aqui o código todo para vocês

É que no php é so chamar o md5() mas nem sabemos o que estamos a fazer, no asp eles dão o código completo :

<%

Private Const BITS_TO_A_BYTE = 8
Private Const BYTES_TO_A_WORD = 4
Private Const BITS_TO_A_WORD = 32

Private m_lOnBits(30)
Private m_l2Power(30)

   m_lOnBits(0) = CLng(1)
   m_lOnBits(1) = CLng(3)
   m_lOnBits(2) = CLng(7)
   m_lOnBits(3) = CLng(15)
   m_lOnBits(4) = CLng(31)
   m_lOnBits(5) = CLng(63)
   m_lOnBits(6) = CLng(127)
   m_lOnBits(7) = CLng(255)
   m_lOnBits(8) = CLng(511)
   m_lOnBits(9) = CLng(1023)
   m_lOnBits(10) = CLng(2047)
   m_lOnBits(11) = CLng(4095)
   m_lOnBits(12) = CLng(8191)
   m_lOnBits(13) = CLng(16383)
   m_lOnBits(14) = CLng(32767)
   m_lOnBits(15) = CLng(65535)
   m_lOnBits(16) = CLng(131071)
   m_lOnBits(17) = CLng(262143)
   m_lOnBits(18) = CLng(524287)
   m_lOnBits(19) = CLng(1048575)
   m_lOnBits(20) = CLng(2097151)
   m_lOnBits(21) = CLng(4194303)
   m_lOnBits(22) = CLng(8388607)
   m_lOnBits(23) = CLng(16777215)
   m_lOnBits(24) = CLng(33554431)
   m_lOnBits(25) = CLng(67108863)
   m_lOnBits(26) = CLng(134217727)
   m_lOnBits(27) = CLng(268435455)
   m_lOnBits(28) = CLng(536870911)
   m_lOnBits(29) = CLng(1073741823)
   m_lOnBits(30) = CLng(2147483647)

   m_l2Power(0) = CLng(1)
   m_l2Power(1) = CLng(2)
   m_l2Power(2) = CLng(4)
   m_l2Power(3) = CLng(8)
   m_l2Power(4) = CLng(16)
   m_l2Power(5) = CLng(32)
   m_l2Power(6) = CLng(64)
   m_l2Power(7) = CLng(128)
   m_l2Power(8) = CLng(256)
   m_l2Power(9) = CLng(512)
   m_l2Power(10) = CLng(1024)
   m_l2Power(11) = CLng(2048)
   m_l2Power(12) = CLng(4096)
   m_l2Power(13) = CLng(8192)
   m_l2Power(14) = CLng(16384)
   m_l2Power(15) = CLng(32768)
   m_l2Power(16) = CLng(65536)
   m_l2Power(17) = CLng(131072)
   m_l2Power(18) = CLng(262144)
   m_l2Power(19) = CLng(524288)
   m_l2Power(20) = CLng(1048576)
   m_l2Power(21) = CLng(2097152)
   m_l2Power(22) = CLng(4194304)
   m_l2Power(23) = CLng(8388608)
   m_l2Power(24) = CLng(16777216)
   m_l2Power(25) = CLng(33554432)
   m_l2Power(26) = CLng(67108864)
   m_l2Power(27) = CLng(134217728)
   m_l2Power(28) = CLng(268435456)
   m_l2Power(29) = CLng(536870912)
   m_l2Power(30) = CLng(1073741824)

Private Function LShift(lValue, iShiftBits)
   If iShiftBits = 0 Then
       LShift = lValue
       Exit Function
   ElseIf iShiftBits = 31 Then
       If lValue And 1 Then
           LShift = &H80000000
       Else
           LShift = 0
       End If
       Exit Function
   ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
       Err.Raise 6
   End If

   If (lValue And m_l2Power(31 - iShiftBits)) Then
       LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000
   Else
       LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits))
   End If
End Function

Private Function RShift(lValue, iShiftBits)
   If iShiftBits = 0 Then
       RShift = lValue
       Exit Function
   ElseIf iShiftBits = 31 Then
       If lValue And &H80000000 Then
           RShift = 1
       Else
           RShift = 0
       End If
       Exit Function
   ElseIf iShiftBits < 0 Or iShiftBits > 31 Then
       Err.Raise 6
   End If

   RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits)

   If (lValue And &H80000000) Then
       RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1)))
   End If
End Function

Private Function RotateLeft(lValue, iShiftBits)
   RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits))
End Function

Private Function AddUnsigned(lX, lY)
   Dim lX4
   Dim lY4
   Dim lX8
   Dim lY8
   Dim lResult

   lX8 = lX And &H80000000
   lY8 = lY And &H80000000
   lX4 = lX And &H40000000
   lY4 = lY And &H40000000

   lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF)

   If lX4 And lY4 Then
       lResult = lResult Xor &H80000000 Xor lX8 Xor lY8
   ElseIf lX4 Or lY4 Then
       If lResult And &H40000000 Then
           lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8
       Else
           lResult = lResult Xor &H40000000 Xor lX8 Xor lY8
       End If
   Else
       lResult = lResult Xor lX8 Xor lY8
   End If

   AddUnsigned = lResult
End Function

Private Function F(x, y, z)
   F = (x And y) Or ((Not x) And z)
End Function

Private Function G(x, y, z)
   G = (x And z) Or (y And (Not z))
End Function

Private Function H(x, y, z)
   H = (x Xor y Xor z)
End Function

Private Function I(x, y, z)
   I = (y Xor (x Or (Not z)))
End Function

Private Sub FF(a, b, c, d, x, s, ac)
   a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac))
   a = RotateLeft(a, s)
   a = AddUnsigned(a, b)
End Sub

Private Sub GG(a, b, c, d, x, s, ac)
   a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac))
   a = RotateLeft(a, s)
   a = AddUnsigned(a, b)
End Sub

Private Sub HH(a, b, c, d, x, s, ac)
   a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac))
   a = RotateLeft(a, s)
   a = AddUnsigned(a, b)
End Sub

Private Sub II(a, b, c, d, x, s, ac)
   a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac))
   a = RotateLeft(a, s)
   a = AddUnsigned(a, b)
End Sub

Private Function ConvertToWordArray(sMessage)
   Dim lMessageLength
   Dim lNumberOfWords
   Dim lWordArray()
   Dim lBytePosition
   Dim lByteCount
   Dim lWordCount

   Const MODULUS_BITS = 512
   Const CONGRUENT_BITS = 448

   lMessageLength = Len(sMessage)

   lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD)
   ReDim lWordArray(lNumberOfWords - 1)

   lBytePosition = 0
   lByteCount = 0
   Do Until lByteCount >= lMessageLength
       lWordCount = lByteCount \ BYTES_TO_A_WORD
       lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE
       lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition)
       lByteCount = lByteCount + 1
   Loop

   lWordCount = lByteCount \ BYTES_TO_A_WORD
   lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE

   lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition)

   lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3)
   lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29)

   ConvertToWordArray = lWordArray
End Function

Private Function WordToHex(lValue)
   Dim lByte
   Dim lCount

   For lCount = 0 To 3
       lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1)
       WordToHex = WordToHex & Right("0" & Hex(lByte), 2)
   Next
End Function

Public Function MD5(sMessage)
   Dim x
   Dim k
   Dim AA
   Dim BB
   Dim CC
   Dim DD
   Dim a
   Dim b
   Dim c
   Dim d

   Const S11 = 7
   Const S12 = 12
   Const S13 = 17
   Const S14 = 22
   Const S21 = 5
   Const S22 = 9
   Const S23 = 14
   Const S24 = 20
   Const S31 = 4
   Const S32 = 11
   Const S33 = 16
   Const S34 = 23
   Const S41 = 6
   Const S42 = 10
   Const S43 = 15
   Const S44 = 21

   x = ConvertToWordArray(sMessage)

   a = &H67452301
   b = &HEFCDAB89
   c = &H98BADCFE
   d = &H10325476

   For k = 0 To UBound(x) Step 16
       AA = a
       BB = b
       CC = c
       DD = d

       FF a, b, c, d, x(k + 0), S11, &HD76AA478
       FF d, a, b, c, x(k + 1), S12, &HE8C7B756
       FF c, d, a, b, x(k + 2), S13, &H242070DB
       FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE
       FF a, b, c, d, x(k + 4), S11, &HF57C0FAF
       FF d, a, b, c, x(k + 5), S12, &H4787C62A
       FF c, d, a, b, x(k + 6), S13, &HA8304613
       FF b, c, d, a, x(k + 7), S14, &HFD469501
       FF a, b, c, d, x(k + 8), S11, &H698098D8
       FF d, a, b, c, x(k + 9), S12, &H8B44F7AF
       FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1
       FF b, c, d, a, x(k + 11), S14, &H895CD7BE
       FF a, b, c, d, x(k + 12), S11, &H6B901122
       FF d, a, b, c, x(k + 13), S12, &HFD987193
       FF c, d, a, b, x(k + 14), S13, &HA679438E
       FF b, c, d, a, x(k + 15), S14, &H49B40821

       GG a, b, c, d, x(k + 1), S21, &HF61E2562
       GG d, a, b, c, x(k + 6), S22, &HC040B340
       GG c, d, a, b, x(k + 11), S23, &H265E5A51
       GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA
       GG a, b, c, d, x(k + 5), S21, &HD62F105D
       GG d, a, b, c, x(k + 10), S22, &H2441453
       GG c, d, a, b, x(k + 15), S23, &HD8A1E681
       GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8
       GG a, b, c, d, x(k + 9), S21, &H21E1CDE6
       GG d, a, b, c, x(k + 14), S22, &HC33707D6
       GG c, d, a, b, x(k + 3), S23, &HF4D50D87
       GG b, c, d, a, x(k + 8), S24, &H455A14ED
       GG a, b, c, d, x(k + 13), S21, &HA9E3E905
       GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8
       GG c, d, a, b, x(k + 7), S23, &H676F02D9
       GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A

       HH a, b, c, d, x(k + 5), S31, &HFFFA3942
       HH d, a, b, c, x(k + 8), S32, &H8771F681
       HH c, d, a, b, x(k + 11), S33, &H6D9D6122
       HH b, c, d, a, x(k + 14), S34, &HFDE5380C
       HH a, b, c, d, x(k + 1), S31, &HA4BEEA44
       HH d, a, b, c, x(k + 4), S32, &H4BDECFA9
       HH c, d, a, b, x(k + 7), S33, &HF6BB4B60
       HH b, c, d, a, x(k + 10), S34, &HBEBFBC70
       HH a, b, c, d, x(k + 13), S31, &H289B7EC6
       HH d, a, b, c, x(k + 0), S32, &HEAA127FA
       HH c, d, a, b, x(k + 3), S33, &HD4EF3085
       HH b, c, d, a, x(k + 6), S34, &H4881D05
       HH a, b, c, d, x(k + 9), S31, &HD9D4D039
       HH d, a, b, c, x(k + 12), S32, &HE6DB99E5
       HH c, d, a, b, x(k + 15), S33, &H1FA27CF8
       HH b, c, d, a, x(k + 2), S34, &HC4AC5665

       II a, b, c, d, x(k + 0), S41, &HF4292244
       II d, a, b, c, x(k + 7), S42, &H432AFF97
       II c, d, a, b, x(k + 14), S43, &HAB9423A7
       II b, c, d, a, x(k + 5), S44, &HFC93A039
       II a, b, c, d, x(k + 12), S41, &H655B59C3
       II d, a, b, c, x(k + 3), S42, &H8F0CCC92
       II c, d, a, b, x(k + 10), S43, &HFFEFF47D
       II b, c, d, a, x(k + 1), S44, &H85845DD1
       II a, b, c, d, x(k + 8), S41, &H6FA87E4F
       II d, a, b, c, x(k + 15), S42, &HFE2CE6E0
       II c, d, a, b, x(k + 6), S43, &HA3014314
       II b, c, d, a, x(k + 13), S44, &H4E0811A1
       II a, b, c, d, x(k + 4), S41, &HF7537E82
       II d, a, b, c, x(k + 11), S42, &HBD3AF235
       II c, d, a, b, x(k + 2), S43, &H2AD7D2BB
       II b, c, d, a, x(k + 9), S44, &HEB86D391

       a = AddUnsigned(a, AA)
       b = AddUnsigned(b, BB)
       c = AddUnsigned(c, CC)
       d = AddUnsigned(d, DD)
   Next

   MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d))
End Function
%>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo, eu tenho um prgrama que fiz em VB.NET que calcula a hash MD5 de um ficheiro e nem de perto é assim tão complicado. Pedi ajuda para fazer como o fiz (queria ter barra progresso), mas é muito mais simples do que isso. No entanto, aquilo está é preparado para receber ficheiros e não uma string.

De qualquer forma, se a ideia é só implementar isso e não importa como, ou seja, preciso mesmo de ter o código exacto para cacular isso ou desde que a funcionalidade exista, chega? Se chegar, tens no meu site o código fonte do programa que falei, podes ver lá como o fiz e adaptar ao que necessitas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tipo, eu tenho um prgrama que fiz em VB.NET que calcula a hash MD5 de um ficheiro e nem de perto é assim tão complicado. Pedi ajuda para fazer como o fiz (queria ter barra progresso), mas é muito mais simples do que isso. No entanto, aquilo está é preparado para receber ficheiros e não uma string.

De qualquer forma, se a ideia é só implementar isso e não importa como, ou seja, preciso mesmo de ter o código exacto para cacular isso ou desde que a funcionalidade exista, chega? Se chegar, tens no meu site o código fonte do programa que falei, podes ver lá como o fiz e adaptar ao que necessitas.

Ok vou usar B)

Obrigado patrão :P

sempre a contribuir para o desenvolvimento :)

vende-me o teu conhecimento :P

abraço

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual conhecimento? Já te disse que pedia ajuda para fazer o que fiz nesse programa :D Porque o .NET framework até em +- funções próprias para gerar hashes MD5, não como no PHP, mas quase igual. O que eu fiz está ligeiramente + avançado para que pudesse saber se falta muito ano para ter a barra de progresso a funcionar ;)

Tipo, primeiro post no google por "md5 vb.net":

Imports System.Text
Imports System.Security.Cryptography

Private Function GenerateHash(ByVal SourceText As String) As String
'Create an encoding object to ensure the encoding standard for the source text
Dim Ue As New UnicodeEncoding()
'Retrieve a byte array based on the source text
Dim ByteSourceText() As Byte = Ue.GetBytes(SourceTStext)
'Instantiate an MD5 Provider object
Dim Md5 As New MD5CryptoServiceProvider()
'Compute the hash value from the source
Dim ByteHash() As Byte = Md5.ComputeHash(ByteSourceText)
'And convert it to String format for return
Return Convert.ToBase64String(ByteHash)
End Function

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No tópico indicas ASP.NET, isso não usa a framework também? Eu acho que sim, mas nunca trabalhei em ASP...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora