Text 332, 338 rader
Skriven 2005-03-12 08:58:00 av "elef" <m.P.B@*toglimi*ro (1:278/230)
Ärende: Re: Beginner JPG header question
========================================
"John" <jtk93063-nrvbmisc01@KILLSPAM.com> ha scritto nel messaggio
news:Xns960B9AE2DD244Valhalla@64.164.98.7...
> "Elef" <m.p.b@*toglimi*rocketmail.com> wrote in
> news:hHFUd.72278$2h5.37963@tornado.fastwebnet.it:
>
>>
>> "Jason Keats" <jkeats@melbpcDeleteThis.org.au> ha scritto
>> nel messaggio news:cvv001$f8v$1@possum.melbpc.org.au...
>>> John wrote:
>>>> John <jtk93063-nrvbmisc01@KILLSPAM.com> wrote in
>>>> news:Xns960A8ADFC5F3DValhalla@64.164.98.6:
>>>>
>>>>> Hello Group,
>>>>>
>>>>> I posted in the other VB group and it was quite a long
>>>>> post so I don't think anyone will answer it LOL.
>>>>>
>>>>> However, it seems I'm finding a bit of information on my
>>>>> own. The really BIG hurdle I have is this.
>>>>>
>>>>> I am going to a site (or several sites) that post a .jpg
>>>>> file. Sometimes the update it quite regularly, sometimes
>>>>> it stays out there for a day or so.
>>>>>
>>>>> What I would like to do, exclusive of checking the
>>>>> regular file name (say, XYZ.JPG), is to be able to
>>>>> examine the JPG header to see if it is the same picture
>>>>> as downloaded before, or if it is different.
>>>>>
>>>>> I am assuming that internally, the jpg file might store
>>>>> it's original file name, or some other identification
>>>>> exclusive that that individual picture.
>>>>>
>>>>> I've been Googling until my head hurts, and can't seem
>>>>> to find the information I need. It seems there was
>>>>> something out there in the 1992 to 1998 time frame, but
>>>>> now it is not available. (I'm not sure if it was an ocx,
>>>>> dll or what.)
>>>>>
>>>>> Anyway, does ANYONE know of a snippet or source
>>>>> available on the web, or here for posting, where a
>>>>> beginner can get information such as described above?
>>>>>
>>>>> Or perhaps someone may have another suggestion? (I
>>>>> already have a procedure I'm working on where I compare
>>>>> the filename and size. But this seems more academic,
>>>>> because after I save the file on my HD it's got the
>>>>> current time stamp and not the original one ... and the
>>>>> user always posts the jpg file name with the same
>>>>> prefix, i.e. XYZ for XYZ.JPG. So I'm more or less just
>>>>> chasing in circles on this).
>>>>>
>>>>> TIA for any ideas, snippets, links to code, etc.
>>>>>
>>>>>
>>>>>
>>>>
>>>> Oh, now this is what happens when I post something while
>>>> on pain meds for my back LOL!
>>>>
>>>> I forgot to mention, he more often than not has a TEXT
>>>> box in the JPG which states the time, date, and some
>>>> other information, when he compiled the chart. Perhaps
>>>> there is a way to search for the text box and read the
>>>> text itself, as a string, and compare it to the previous
>>>> JPG that was posted?
>>>>
>>>> OK, that's it ... sorry for the add-on post.
>>>
>>> Information on the JPEG file format is available at:
>>>
>>> http://www.wotsit.org/search.asp?page=5&s=graphics
>>>
>>> Text within a picture is not accessible without using OCR.
>>> Good luck with that!
>>>
>>> I'm assuming you already know how to download webpages,
>>> etc.
>>>
>>>
>>
>> Fully agree with Jason. You may assume as the original name
>> of the jpg is its MD5 hash. This way you'll be able to
>> identify two identical images even if they are named
>> differentely. You can find plenty MD5 hashing routines for
>> VB on the web. Hope it helps
>> Marco
>>
>>
>
> Thanks Marco!
>
> Whew. I've never worked with Crypto or digital signatures.
>
> I've found a few resources on the Web and it seems fairly
> straight forward though. So I'm just looking for a source code
> example.
>
> Seems what I have to do is:
> When I save the first file, give it a unique file name
> (I'm thinking of giving it a date/time name)
> Get the digital signature of the first file
> Download the new file and save with date/time filename
> Calculate the digital signature of the new file
> Compare the two
> If equal, delete the new file else keep it
>
> Simple. Just have to figure out the MD5 hash LOL.
>
> Thanks again to both of you, Jason and Marco. This looks like
> it's gonna be fun :)
>
> --
>
> John Kalenda
> Simi Valley, CA
> ------------------
> to reply, replace KILLSPAM with yahoo
>>>
>>
>> Fully agree with Jason. You may assume as the original name
>> of the jpg is its MD5 hash. This way you'll be able to
>> identify two identical images even if they are named
>> differentely. You can find plenty MD5 hashing routines for
>> VB on the web. Hope it helps
>> Marco
>>
>>
>
> Thanks Marco!
....
> Simple. Just have to figure out the MD5 hash LOL.
>
Here is the code i use to hash a file:
Option Explicit
Private Declare Function CryptAcquireContext Lib "advapi32.dll" _
Alias "CryptAcquireContextA" ( _
ByRef phProv As Long, _
ByVal pszContainer As String, _
ByVal pszProvider As String, _
ByVal dwProvType As Long, _
ByVal dwFlags As Long) As Long
Private Declare Function CryptReleaseContext Lib "advapi32.dll" ( _
ByVal hProv As Long, _
ByVal dwFlags As Long) As Long
Private Declare Function CryptCreateHash Lib "advapi32.dll" ( _
ByVal hProv As Long, _
ByVal Algid As Long, _
ByVal hKey As Long, _
ByVal dwFlags As Long, _
ByRef phHash As Long) As Long
Private Declare Function CryptDestroyHash Lib "advapi32.dll" ( _
ByVal hHash As Long) As Long
Private Declare Function CryptHashData Lib "advapi32.dll" ( _
ByVal hHash As Long, _
pbData As Byte, _
ByVal dwDataLen As Long, _
ByVal dwFlags As Long) As Long
Private Declare Function CryptGetHashParam Lib "advapi32.dll" ( _
ByVal hHash As Long, _
ByVal dwParam As Long, _
pbData As Any, _
pdwDataLen As Long, _
ByVal dwFlags As Long) As Long
Private Const PROV_RSA_FULL = 1
Private Const CRYPT_NEWKEYSET = &H8
Private Const ALG_CLASS_HASH = 32768
Private Const ALG_TYPE_ANY = 0
Private Const ALG_SID_MD2 = 1
Private Const ALG_SID_MD4 = 2
Private Const ALG_SID_MD5 = 3
Private Const ALG_SID_SHA1 = 4
Enum HashAlgorithm
MD2 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD2
MD4 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD4
MD5 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_MD5
SHA1 = ALG_CLASS_HASH Or ALG_TYPE_ANY Or ALG_SID_SHA1
End Enum
Private Const HP_HASHVAL = 2
Private Const HP_HASHSIZE = 4
Function HashFile( _
ByVal Filename As String, _
Optional ByVal Algorithm As HashAlgorithm = MD5) As String
Dim hCtx As Long
Dim hHash As Long
Dim lFile As Long
Dim lRes As Long
Dim lLen As Long
Dim lIdx As Long
Dim abHash() As Byte
' Check if the file exists (not the best method BTW!)
If Len(Dir$(Filename)) = 0 Then Err.Raise 53
' Get default provider context handle
lRes = CryptAcquireContext(hCtx, vbNullString, _
vbNullString, PROV_RSA_FULL, 0)
If lRes = 0 And Err.LastDllError = &H80090016 Then
' There's no default keyset container!!!
' Get the provider context and create
' a default keyset container
lRes = CryptAcquireContext(hCtx, vbNullString, _
vbNullString, PROV_RSA_FULL, CRYPT_NEWKEYSET)
End If
If lRes <> 0 Then
' Create the hash
lRes = CryptCreateHash(hCtx, Algorithm, 0, 0, hHash)
If lRes <> 0 Then
' Get a file handle
lFile = FreeFile
' Open the file
Open Filename For Binary As lFile
If Err.Number = 0 Then
Const BLOCK_SIZE As Long = 32 * 1024& ' 32K
ReDim abBlock(1 To BLOCK_SIZE) As Byte
Dim lCount As Long
Dim lBlocks As Long
Dim lLastBlock As Long
' Calculate how many full blocks
' the file contains
lBlocks = LOF(lFile) \ BLOCK_SIZE
' Calculate the remaining data length
lLastBlock = LOF(lFile) - lBlocks * BLOCK_SIZE
' Hash the blocks
For lCount = 1 To lBlocks
Get lFile, , abBlock
' Add the chunk to the hash
lRes = CryptHashData(hHash, abBlock(1), BLOCK_SIZE, 0)
' Stop the loop if CryptHashData fails
If lRes = 0 Then Exit For
Next
' Is there more data?
If lLastBlock > 0 And lRes <> 0 Then
' Get the last block
ReDim abBlock(1 To lLastBlock) As Byte
Get lFile, , abBlock
' Hash the last block
lRes = CryptHashData(hHash, abBlock(1), lLastBlock, 0)
End If
' Close the file
Close lFile
End If
If lRes <> 0 Then
' Get the hash lenght
lRes = CryptGetHashParam(hHash, HP_HASHSIZE, lLen, 4, 0)
If lRes <> 0 Then
' Initialize the buffer
ReDim abHash(0 To lLen - 1)
' Get the hash value
lRes = CryptGetHashParam(hHash, HP_HASHVAL, abHash(0), lLen,
0)
If lRes <> 0 Then
' Convert value to hex string
For lIdx = 0 To UBound(abHash)
HashFile = HashFile & _
Right$("0" & Hex$(abHash(lIdx)), 2)
Next
End If
End If
End If
' Release the hash handle
CryptDestroyHash hHash
End If
End If
' Release the provider context
CryptReleaseContext hCtx, 0
' Raise an error if lRes = 0
If lRes = 0 Then Err.Raise Err.LastDllError
End Function
Bye
Elef
--- UseNet To RIME Gateway @ 3/12/05 8:56:38 AM ---
* Origin: MoonDog BBS, Brooklyn,NY, 718 692-2498, 1:278/230 (1:278/230)
|