[AccessD] OT(kinda): Crack Code

Jim Lawrence accessd at shaw.ca
Fri Mar 23 13:26:26 CDT 2007


Hi Marty:

Quite an impressive conclusion and solution. The difficult part was to
resolve how the value was parsed. 

The question is why did the writers of the Informix app use that scheme
considering that there are time-stamp fields and functions available in the
Informix DB as far back as the 1990. 

Jim

-----Original Message-----
From: accessd-bounces at databaseadvisors.com
[mailto:accessd-bounces at databaseadvisors.com] On Behalf Of MartyConnelly
Sent: Thursday, March 22, 2007 6:33 PM
To: Access Developers discussion and problem solving
Subject: Re: [AccessD] OT(kinda): Crack Code

 I played around with this last night and figured out it was based on 
some date in 1974
with AM and PM being indicated by last two characters and first 6 as seconds
from the start date whatever that is, still  it seems a little out as to 
accuracy


Here is some code I used from some old code, you want to switch
to Base 36 and omit 0 will alter some counters

Const hashFactor As Integer = 37
Const hashLength As Integer = 9

Function HashString(strHash As String) As Double
' Create Hash string for indexing using
'Base 37 Hash Value
' Convert
' spaces punctuation odd chars = 0
' numeric = 0 - 9                1-10
' alpha chars a-z A-Z            11-37
' only use lower case
'such that string "Ab-12" =
'      A           b          -          1          2
'  (11*37^4) + (12*37^3) + (0*37^2) + (2*37^1) + (3*37^0)
'The Hash Length is 9 so it fits a double without precision loss

Dim iStrLen As Integer
Dim decAsc As Double
Dim i As Integer
Dim strPad As Integer
Dim strToHash As String
HashString = 0

' convert to all lower case
strToHash = UCase(strHash)
iStrLen = Len(strToHash)

'pad out string to 9 chars with blanks
If iStrLen < hashLength Then
 For strPad = (iStrLen + 1) To hashLength
    strToHash = strToHash & " "
 Next
Else
' or just grab first nine chars of string
   If iStrLen > hashLength Then
     strToHash = Left(strToHash, hashLength)
   End If
End If

For i = 1 To hashLength
  decAsc = Asc(Right(strToHash, i))
  'convert all odd Ascii character values and punctuation to 0
  If (decAsc < 48) Or (decAsc >= 58) And (decAsc <= 64) _
     Or (decAsc > 91) Then
    decAsc = 0
  Else
     'numbers
    If (decAsc >= 48) And (decAsc <= 57) Then
       decAsc = decAsc - 47
     Else
     'letters
      If (decAsc >= 65) And (decAsc <= 91) Then
         decAsc = decAsc - 54
         ' 54 not 64 as want to start "A" as 11
        End If
     End If
  End If

  HashString = HashString + (decAsc * hashFactor ^ (i - 1))
Next

End Function

Sub unhash()
' H9WDH701
Dim total As Double
Dim mydate As Date
Dim days As Double
total = (2 * 37 ^ 0)
Debug.Print total
total = total + (0 * 37 ^ 1)
Debug.Print total
total = total + (7 * 37 ^ 2)
Debug.Print total
total = total + ((Asc("H") - 54) * 37 ^ 3)
Debug.Print total
total = total + ((Asc("D") - 54) * 37 ^ 4)
Debug.Print total
total = total + ((Asc("W") - 54) * 37 ^ 5)
Debug.Print total
total = total + (9 * 37 ^ 6)
Debug.Print total
total = total + ((Asc("H") - 54) * 37 ^ 7)
Debug.Print total
'mydate = total
days = total / (3600# * 24# * 365#)
Debug.Print "days=" & days
End Sub
Sub unhashA()
' H9WDH701
Dim total As Double
Dim mydate As Date
Dim days As Double
total = (2 * 36 ^ 0)
Debug.Print total
total = total + (0 * 36 ^ 1)
Debug.Print total
total = total + (7 * 36 ^ 2)
Debug.Print total
total = total + ((Asc("H") - 55) * 36 ^ 3)
Debug.Print total
total = total + ((Asc("D") - 55) * 36 ^ 4)
Debug.Print total
total = total + ((Asc("W") - 55) * 36 ^ 5)
Debug.Print total
total = total + (9 * 36 ^ 6)
Debug.Print total
total = total + ((Asc("H") - 55) * 36 ^ 7)
Debug.Print total
'mydate = total
days = total / (3600# * 24# * 365#)
Debug.Print "days=" & days
End Sub
Sub unhashB()
' H9WDH701 02/06/03 09:19:55 AM
'days=33.1225264776763
' 12/02/1974 10:45:12 PM
Dim total As Double
Dim mydate As Date
Dim days As Double

total = total + (7 * 36 ^ 0)
Debug.Print total
total = total + ((Asc("H") - 55) * 36 ^ 1)
Debug.Print total
total = total + ((Asc("D") - 55) * 36 ^ 2)
Debug.Print total
total = total + ((Asc("W") - 55) * 36 ^ 3)
Debug.Print total
total = total + (9 * 36 ^ 4)
Debug.Print total
total = total + ((Asc("H") - 55) * 36 ^ 5)
Debug.Print total
'mydate = total
days = total / (3600# * 24# * 365#)
Debug.Print "days=" & days
Debug.Print DateAdd("s", -total, Now)
End Sub

Sub unhashC()
'  H9WLA903=02/06/03 12:08:33 PM
'12/02/1974 7:59:40 PM
Dim total As Double
Dim mydate As Date
Dim days As Double

total = total + (9 * 36 ^ 0)
Debug.Print total
total = total + ((Asc("A") - 55) * 36 ^ 1)
Debug.Print total
total = total + ((Asc("L") - 55) * 36 ^ 2)
Debug.Print total
total = total + ((Asc("W") - 55) * 36 ^ 3)
Debug.Print total
total = total + (9 * 36 ^ 4)
Debug.Print total
total = total + ((Asc("H") - 55) * 36 ^ 5)
Debug.Print total
'mydate = total
days = total / (3600# * 24# * 365#)
Debug.Print "days=" & days
Debug.Print DateAdd("s", -total, Now)
End Sub
Sub test()
Dim date1 As Date
Dim date2 As Date
date1 = #2/6/2003 12:08:33 PM#
date2 = #2/6/2003 9:19:55 AM#

Debug.Print DateDiff("s", date1, date2)
date1 = #12/2/1974 7:59:40 PM#
date2 = #12/2/1974 10:45:12 PM#

Debug.Print DateDiff("s", date1, date2)
End Sub

Mark A Matte wrote:

> Tha might be what the guy meant by 'shift a bit or 2'.
>
> I'm running frequency distribution on each char...and 7th char is 0 
> everytime except for 2 times out of 500K...
>
> Thanks for the 'shift'  I'll move all calcs over to spaces...and see 
> what I get.
>
> Thanks,
>
> Mark A. Matte
>
>
>
>> From: "Gary Kjos" <garykjos at gmail.com>
>> Reply-To: Access Developers discussion and problem 
>> solving<accessd at databaseadvisors.com>
>> To: "Access Developers discussion and problem 
>> solving"<accessd at databaseadvisors.com>
>> Subject: Re: [AccessD] OT(kinda): Crack Code
>> Date: Thu, 22 Mar 2007 13:57:32 -0500
>>
>> If you use that logic and you forget about the rightmost two positions
>> - maybe an occurance number or something, you can get close....
>> H = 1027924991 +
>> 9 = 15116544
>> W = 1492992
>> D = 16848
>> H = 612
>> 7 = 7
>> ---------------------
>> 1044551995
>>
>> which translates to Thursday, February 06, 2003 11:19:55 AM
>>
>> 2 hours off?
>>
>> I haven't tried it for any others but that one seems pretty scary
>> close for the first one I tried.
>>
>> For example in your first example. H9WDH701 = 02/06/03 09:19:55 = that
>> translates to 1044523195 in UNIX time. According to the time
>> calculators I googled.
>>
>> On 3/22/07, Mark A Matte <markamatte at hotmail.com> wrote:
>> > Rocky,
>> >
>> > I've actually made some progress.  Last year I learned how to do 
>> Mayan Math
>> > and applied the logic as a counting system not 10 or 20 base...but 
>> 36...and
>> > after learning that this thing is counting seconds since 1/1/70 
>> 00:00:00...I
>> > assigned values to the numbers and letters. and started running 
>> some tests.
>> > 0=0,1=1,2=2...9=9,A=10,B=11...Z=35.
>> >
>> > This makes it a 36 base counting system...so you take the value of 
>> each
>> > position...calculate and add like below:
>> >
>> > 1st  ???
>> > 2nd  ???
>> > 3rd  Value*60466176
>> > 4th  Value*1679616
>> > 5th  Value*46656
>> > 6th  Value*1296
>> > 7th  Value*36
>> > 8th  Value
>> >
>> > So if you had 00bfk5t2...you math would be Value of third position
>> > ('B'11*60466176) added to each position calculated...so:
>> > 0's are 0...('B'11*60466176)
>> > +('F'15*1679616)+('K'20*46656)+('5'5*1296)+('T'29*36)+('2'2)
>> >
>> > Beginning of time for this count is 12/31/69 04:00:00 PM...if you 
>> do the
>> > calcs above you get 691262822...if you add this many seconds to the
>> > beginning time you get 11/27/91 9:27:02 AM...
>> >
>> > Which validates in the system.  The guy I talked to that help 
>> create it over
>> > 12 years ago...said he remembered something about haveing to 'shift 
>> a bit or
>> > 2'...but I didn't get much more from him...he just didn't remember the
>> > specifics.  The 1st and 2nd positions I am having issues with...if 
>> I try to
>> > calculate it out...I get crazy results...and also in the validation
>> > tool...with the above example it validated...but if I added a
>> > letter(00bfk5t2 changed to 0bbfk5t2)...just added value in second
>> > position...it would not accept it as valid???  This is probably 
>> what he was
>> > talking about"Shifting a bit or 2".
>> >
>> > Anyway...any thoughts?
>> >
>> > What info would your cousin need?
>> >
>> > Thanks,
>> >
>> > Mark A. Matte
>> >
>> > 
>

-- 
Marty Connelly
Victoria, B.C.
Canada

-- 
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com




More information about the AccessD mailing list