- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Has anybody got a function for the calculation of a MD5 Checksum of a string for fortran??
Link Copied
11 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
No. We don't even know what you are talking about. Try "Numerical Recipies" (Press, et al.) to see if they do.
Regards,
Keith
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
MD5 is a well known cryptography algorithm
(similar to CRC32, AES or SHA-2)
I need this because i need to create a license manager for my program.
The benefit of a MD5 Checksum is that it is not reversible. So it can only be cracked by a brute force attack which tries all possible combinations.
I found a sample source in C but i'm not sure if i can manage to translate it:
Please Reply if someone has any ideas to it.
PS: Itneeds not tobe MD5 - any other crypto algorithm should do it as well
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
FWIW, Windows has native APIs to do it (not that I know how). See e.g. CryptEncrypt in documentation (but follow the link to chapter heading & click "Locate" button to see entire chapter).
Jugoslav
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Attached is an example of using the Win32 Crypto API, though it doesn't use EncryptHash. Using the hash function would be much simpler than this example, but it will give you some clues as to how to use the API.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I did many researches about the cryptography api and developed the following program:
Code:
This program really(!) creates some sort of hash chacksum........ program hash
character*32 string
string = "c"
call md5(trim(string))
end program
subroutine md5(string)
USE DFWINTY
USE ADVAPI32
IMPLICIT NONE
character*(*) string
integer(HANDLE) :: hCryptProv
integer(HANDLE) :: hHash
integer(DWORD) :: ret
character*32 myhash
integer(DWORD) :: HASHSIZE
HASHSIZE = 32
! Create handle to CSP
ret = CryptAcquireContext(hCryptProv, NULL_CHARACTER, NULL_CHARACTER, PROV_RSA_FULL, 0)
if (ret == FALSE) then
write(6,'("ERROR: CryptAcquireContext")')
STOP
endif
! Create Hash Handle
ret = CryptCreateHash (hCryptProv, CALG_MD5, 0, 0, hHash)
if (ret == FALSE) then
write(6,'("ERROR: CryptCreateHash")')
STOP
endif
! Hash Data
write(6,'("String: >",a,"< ",/,"Length: ",i8)') string, len(string)
ret = CryptHashData (hHash, string, len(string), 0)
if (ret == FALSE) then
write(6,'("ERROR: CryptHashData")')
STOP
endif
! Finish Crypting
ret = CryptGetHashParam (hHash, HP_HASHVAL, myhash, HASHSIZE, 0)
if (ret == FALSE) then
write(6,'("ERROR: CryptGetHashParam")')
STOP
endif
write(6,'("Hashlength: ",i8,/,"Hash: ",z32)') HASHSIZE,myhash
end subroutinebut if you try to create the checksum with another program (i tried php) i get other values!!
Does anyone know what I've done wrong??
Help appreciated!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Problem Solved!
Everything works fine now!
THX
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Does anybody know how to calculate a md5 hash or has a source code?
Steves example isnt here any more and the code from the original poster doesnt compute the right md5 hash. Its bad that he hasnt told us, what he did wrong, I cannot find the error.
Markus
Steves example isnt here any more and the code from the original poster doesnt compute the right md5 hash. Its bad that he hasnt told us, what he did wrong, I cannot find the error.
Markus
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The sample I referenced is now part of the product. If all you want to do is find the MD5 hash of a file, I recommend HashTab.
I once tried to write my own Fortran version of MD5 but could not duplicate the C results. There is some aspect of it that escaped me.
I once tried to write my own Fortran version of MD5 but could not duplicate the C results. There is some aspect of it that escaped me.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Steve,
I want to get the md5 hash of a string, so the example wont help.
But your example can be useful in another way!
Does anybody knows how to retrieve the md5 hash of a string?
I could program the pseudo-code like it is shown in wikipedia, but I dont want to ;-)
Markus
I want to get the md5 hash of a string, so the example wont help.
But your example can be useful in another way!
Does anybody knows how to retrieve the md5 hash of a string?
I could program the pseudo-code like it is shown in wikipedia, but I dont want to ;-)
Markus
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Okay, here comes some messy code.. It could be more elegant, but it works :-)
Its an implemtation of the pseudo code, that I found on Wikipedia.
Its an implemtation of the pseudo code, that I found on Wikipedia.
[bash]! **********************************************************************
character*32 function md5(string)
! ---------------------------------------------------------------------*
! Programmierer : VEZ2/Pieper *
! Version : 1.0 *
! letzte nderung : 07.05.2010 *
! Aufgabe : Erzeugt aus einem String einen MD5 Hashwert *
! **********************************************************************
implicit none
character*(*) string
character*((int(len(string)/64)+1)*64) newString
character*8 wtmp
integer(kind=4) j,n1,n2,n3,n4,umdrehen,pos
integer(kind=4) r(64),k(64),h0,h1,h2,h3,a,b,c,d,f,g,temp,w(16),leftrotate,i,intLen
integer(kind=8) hoch32
real(kind=8) sinus,absolut,real8i
r = [7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]
do i=1,64
real8i = floatk(int8(i))
sinus = dsin(real8i)
absolut = dabs(sinus)
hoch32 = 2.**32.
k(i) = int8(absolut * floatk(hoch32))
end do
h0 = #67452301
h1 = #EFCDAB89
h2 = #98BADCFE
h3 = #10325476
j = len(string)+1
newString(:j) = string // char(128)
i = mod(j, 64)
do while(i /= 56)
j = j + 1
newString(j:j) = char(0)
i = mod(j, 64)
end do
intLen = len(string)*8
do i = 0,3
temp = intLen .and. #FF
j = j + 1
newString(j:j) = char(temp)
intLen = shiftr(intLen, 8)
end do
do i = 1,4
j = j + 1
newString(j:j) = char(0)
end do
do i = 1,int(len(newString)/64)
do j = 1,16
pos = (j-1)*4+(i-1)*64
n1 = ichar(newString(4+pos:4+pos))
n2 = ichar(newString(3+pos:3+pos))
n3 = ichar(newString(2+pos:2+pos))
n4 = ichar(newString(1+pos:1+pos))
write(wtmp,'(4(z2.2))') n1,n2,n3,n4
read(wtmp,'(z8)') w(j)
end do
a = h0
b = h1
c = h2
d = h3
do j = 1,64
if (j >= 1 .and. j <= 16) then
f = (b .and. c) .or. ((.not. b) .and. d)
g = j
else if (j >= 17 .and. j <= 32) then
f = (d .and. b) .or. ((.not. d) .and. c)
g = mod(5*(j-1) + 1, 16) + 1
else if (j >= 33 .and. j <= 48) then
f = ieor(b, ieor(c, d))
g = mod(3*(j-1) + 5, 16) + 1
else if (j >= 49 .and. j <= 64) then
f = ieor(c, (b .or. (.not. d)))
g = mod(7*(j-1), 16) + 1
end if
temp = d
d = c
c = b
b = b + leftrotate((a + f + k(j) + w(g)) , r(j))
a = temp
end do
h0 = h0 + a
h1 = h1 + b
h2 = h2 + c
h3 = h3 + d
end do
h0 = umdrehen(h0)
h1 = umdrehen(h1)
h2 = umdrehen(h2)
h3 = umdrehen(h3)
write(md5,'(4(z8))') h0,h1,h2,h3
return
end function md5
!
!
! **********************************************************************
integer(kind=4) function leftrotate (x, c)
! ---------------------------------------------------------------------*
! Programmierer : VEZ2/Pieper *
! Version : 1.0 *
! letzte nderung : 07.05.2010 *
! Aufgabe : Fhrt ein Leftrotate der Bits durch *
! **********************************************************************
implicit none
integer(kind=4) x,c,result1,result2
result1 = shiftl(x,c)
result2 = shiftr(x, (32-c))
leftrotate = result1 .or. result2
return
end function leftrotate
!
!
! **********************************************************************
integer(kind=4) function umdrehen(zahl)
! ---------------------------------------------------------------------*
! Programmierer : VEZ2/Pieper *
! Version : 1.0 *
! letzte nderung : 07.05.2010 *
! Aufgabe : Macht aus Big Endian -> Little Endian Bits *
! **********************************************************************
implicit none
integer(kind=4) i,tmp,zahl
umdrehen = 0
do i = 1,4
umdrehen = shiftl(umdrehen, 8)
tmp = zahl .and. #FF
umdrehen = umdrehen + tmp;
zahl = shiftr(zahl, 8)
end do
return
end function umdrehen[/bash]
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
There is one little thing to do, instead if a "0" there is only a blank " " in the generated md5 hash.
So the have to replace " " with "0" and your md5 is just fine.
Markus
So the have to replace " " with "0" and your md5 is just fine.
Markus
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page