March 30th, 2013, 08:33 PM

Byte of hashcode
Hi, lets say i have md5sum like "d41d8cd98f00b204e9800998ecf8427e" and I want to generate 256 numbers in random sequence from range 0 to 255 using this md5sum.
Any idea how to deal with it ?
March 30th, 2013, 10:20 PM

The simplest method would be to, say, break the hash into four parts of 8 digits, convert each part into a number (hex>dec), XOR them together, and use the result as an RNG seed.
But do you need something cryptographically secure? Reproducible on different machines? Can you use the original input to MD5 instead? Any constraints?
March 31st, 2013, 08:21 AM

Originally Posted by requinix
The simplest method would be to, say, break the hash into four parts of 8 digits, convert each part into a number (hex>dec), XOR them together, and use the result as an RNG seed.
But do you need something cryptographically secure? Reproducible on different machines? Can you use the original input to MD5 instead? Any constraints?
Yes, I need to make it reproducible.
For example, it's like that:
1. USER INPUT: "MIKE" (can be different with 1 char, or 120 chars  I need to md5 it)
2. "MIKE" to MD5
3. Generate reproducible random sequence of numbers from 0255 using this md5sum
How do you think about my idea, but I am not sure is it good at all:
Let's take string "MIKE" as user input (key).
"MIKE" in md5 is "94f4a1c41b8358205fdc712dd5f12dc8".
It's 32 digits and I need to get 256 numbers (0255).
256/32=8, so I seperate my md5sum in 8 groups for 4 chars (32/8=4) and i get: "94f4a1c4 1b835820 5fdc712d d5f12dc8c"
Now I md5 each of group i got before (g? is variable just for help):
g1 = md5("94f4a1c4") = "23567aa89eae688c3a6f02d07b2beeeb"
g2 = md5("1b835820") = "499a930d757a1ad7e6b983d532e2fb1a"
g3 = md5("5fdc712d") = "761fb78a69470de96155e89df6990a8d"
g4 = md5("d5f12dc8c") = "24d1f27c5fecff6f731794bfd32e72d9"
And again I seperate each group I got to 8 groups of 4 chars.
.
.
.
And i am doing it until I get 256 groups of 8 chars.
But does it make any sense ? I think its not reproducible and anyway i would have to get somehow only 1 number from this from this 8 chars group and i don't have an idea how to
How to deal with it ?
March 31st, 2013, 10:14 AM

If you only need something that seems random then you probably could get away with just rehashing the data. Although simply rehashing the previous hash (not the broken up pieces) is simpler.
By the way, what is this for?
March 31st, 2013, 01:39 PM

Originally Posted by requinix
If you only need something that seems random then you probably could get away with just rehashing the data. Although simply rehashing the previous hash (not the broken up pieces) is simpler.
By the way, what is this for?
What do you mean to rehash the data ?
Do you mean do it like that (?):
md5("MIKE") = "94f4a1c41b8358205fdc712dd5f12dc8"
md5("94f4a1c41b8358205fdc712dd5f12dc8") = "e3e1ff3d938a5cece2cfaecb231f4ab5"
md5("e3e1ff3d938a5cece2cfaecb231f4ab5") = "f7ec1e24382d9dfe9b1a6028d0fba3f6"
md5("f7ec1e24382d9dfe9b1a6028d0fba3f6") = "aaebc56f98dc31501c92c23f1b27db36"
md5("aaebc56f98dc31501c92c23f1b27db36") = "a7871acf8a406e8abe706a8363742b35"
And what about that ? I think it's a good idea but I don't understand it yet enough, I think Do you mean i should generate each number from each md5sum and make md5 sum 256 times ? But how to get 1 digit from 32digit md5sum and keep it reproducible ?
It's part of my project at IT studies. I got an obligation to use it by hashing a key.
March 31st, 2013, 05:45 PM

You still break a hash into four to get your numbers. I'm just saying you don't then have to use the hash of each of those parts to get the next hash  just hash the string you got.
Code:
MIKE => 94f4a1c4 1b835820 5fdc712d d5f12dc8
1 2 3 4
94f4a1c41b8358205fdc712dd5f12dc8 => e3e1ff3d 938a5cec e2cfaecb 231f4ab5
5 6 7 8
e3e1ff3d938a5cece2cfaecb231f4ab5 => f7ec1e24 382d9dfe 9b1a6028 d0fba3f6
9 10 11 12
f7ec1e24382d9dfe9b1a6028d0fba3f6 => aaebc56f 98dc3150 1c92c23f 1b27db36
13 14 15 16
April 1st, 2013, 01:36 AM

Originally Posted by requinix
You still break a hash into four to get your numbers. I'm just saying you don't then have to use the hash of each of those parts to get the next hash  just hash the string you got.
Code:
MIKE => 94f4a1c4 1b835820 5fdc712d d5f12dc8
1 2 3 4
94f4a1c41b8358205fdc712dd5f12dc8 => e3e1ff3d 938a5cec e2cfaecb 231f4ab5
5 6 7 8
e3e1ff3d938a5cece2cfaecb231f4ab5 => f7ec1e24 382d9dfe 9b1a6028 d0fba3f6
9 10 11 12
f7ec1e24382d9dfe9b1a6028d0fba3f6 => aaebc56f 98dc3150 1c92c23f 1b27db36
13 14 15 16
Ok, I see it now but do you have any good idea to make digit (0255) from "94f4a1c4" ?
What do you think about changing each char from "94f4a1c4" to ascii, multiple it and modulo it by 256, like..
ascii('9') * ascii('4') * ascii('f') * ascii('4') * ascii('a') * ascii('1') * ascii('c') * ascii('4') % 256
What do you think about that ? Is there better idea ?
Well I am not sure but the problem here may be that it can happen i won't get all numbers from 0255 and there may be some numbers missing and program will hang in loop.
April 1st, 2013, 02:03 AM

The value being returned by your md5 function is represented in hex (ie base 16). To get a number from 0  255, all you have to do is break the hash into 1byte chunks and convert each chunk from base 16 to base 10.
94 f4 a1 etc.
You would chunk it into 4byte chunks if you were trying to get full 32bit integers out of it.
Alternatively, if you can change your md5 hash function to return the raw bits instead of the hex string representation that might save you the trouble of having to convert from base 16.
PHP FAQ
Originally Posted by Spad
Ah USB, the only rectangular connector where you have to make 3 attempts before you get it the right way around
April 1st, 2013, 08:02 AM

Originally Posted by EOreo
The value being returned by your md5 function is represented in hex (ie base 16). To get a number from 0  255, all you have to do is break the hash into 1byte chunks and convert each chunk from base 16 to base 10.
[...]
You would chunk it into 4byte chunks if you were trying to get full 32bit integers out of it.
Alternatively, if you can change your md5 hash function to return the raw bits instead of the hex string representation that might save you the trouble of having to convert from base 16.
Well, but if I convert "94f4a1c4" to:
94 = 148
f4 = 244
a1 = 161
c4 = 196
And how should I act with that decimal numbers ? Multiple them and modulo 256 ? Or use them as my individual decimal to my set of 0255 decimal numbers ?
There is another problem, becouse what if there will be some numbers from 0255 missing and i wont able to get them with next and next md5 of previous md5 ?
April 1st, 2013, 03:10 PM

@rek3x,
I have a feeling, that you didn't communicate well, what you are trying to do.
I'm going to make a guess:
A. To generate a sequence including every integer from 0 to 255 inclusive, with each integer appearing exactly once. [This can be described as permutation of the elements of Z_256.]
B. For the ordering of the sequence to be determined from an MD5 hash in such a way that every distinct MD5 hash will result in a distinct ordering.
Are we getting warmer?
Last edited by mah$us; April 1st, 2013 at 05:21 PM.
April 1st, 2013, 04:23 PM

Originally Posted by mah$us
@rek3x,
I have a feeling, that you didn't communicate well, what you are trying to do.
I'm going to make a guess:
A. To generate a sequence including every integer from 0 to 255 inclusive, with each integer appearing exactly once. [This can be described as permutation of the elements of Z_256.]
B. For the ordering of the sequence to be determined from and MD5 hash in such a way that every distinct MD5 hash will result in a distinct ordering.
Are we getting warmer?
A. (with reproducible order of this permutation when using same key)