This time Google targeted the virtual reality with their foot step into Lively, an 3d chat room. While Second life (Linden Lab ) is the leader in Virtual reality market, but the thin client based approach will help them. But for just chating, does it make sense? May be for those people, who have enough time to chat…
Archive for July, 2008
Google Lively, this time Second Life
Posted by yadab das on July 11, 2008
Posted in Second life | 1 Comment »
One Way Hash functions — OpenSSL
Posted by yadab das on July 2, 2008
- Given M, it is easy to compute h
- Given h, it is hard to compute M such that H(M) = h
- Given M, it is hard to find another messag, M1 , such that H(M) = H(M1)
SHA-*, MD* and RIPEMD-* are the most popular Hash functions. OpenSSL provides both generic APIs to these Hash functions also provides direct APIs. Accessing through generic API (the EVP) is preferred.
Now let us first use the Hash APIs from OpenSSL and generate fingerprint or calculate hash value. The alorithm, that we will use, is MD5. MD5 (MD stands for Message Digest ) is One way hash algorithm from Ron Rivest. There are test vectors in MD5 RFC, which we can use to calculate (or validate) the hash values. The following figure shows the process of calculation MD5 hash using OpenSSL :-
Below is an example to calculate message digest using MD5 algorithm.
Code Snippet :
openSSlExmpleHashMd5.cpp
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
int main(int argc, char *argv[ ]) {
int i,j;
const int totalTestVectors = 7;
/*
The ouput length for the claculated
digest. This will be fixed for a parti-
cular Hash algorithm and will very algo-
rithm to algorithm.
*/
unsigned int outputLength;
/*
The Message Digest Context object, which
will hold the intermediate state.
*/
EVP_MD_CTX messageDigestContext;
/*
The buffer to store message digest after
computing. 64 bytes is enough for any hash
function. For MD5 128/8 would be fine as
MD5 has 128 bit output length.
Someone can directly use the 128/8 as
the size but if you change the Hash
algorithm, for example SHA1,has 160 bit
output, the length need to be changed to
160/8 bytes.
*/
unsigned char messageDigest[EVP_MAX_MD_SIZE];
/*
Hashes will be calculated for the following strings.
These strings are from the MD5 RFC.
*/
const char *strMessages[] =
{ "", // Input String : 1
"a", // Input String : 2
"abc",// Input String : 3
"message digest",// Input String : 4
"abcdefghijklmnopqrstuvwxyz",// Input String : 5
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",// Input String : 6
"12345678901234567890123456789012345678901234567890123456789012345678901234567890"};// Input String : 7
/*
For each Input string the Expected Output are (from RFC,
this is to make sure that, this implementation is not bogus):
1: d41d8cd98f00b204e9800998ecf8427e
2: 0cc175b9c0f1b6a831c399e269772661
3: 900150983cd24fb0d6963f7d28e17f72
4: f96b697d7cb7938d525a2f31aaf161d0
5: f96b697d7cb7938d525a2f31aaf161d0
6: d174ab98d277d9f5a5611c2c9f419d9f
7: 57edf4a22be3c955ac49da2e2107b67a
*/
/*
Initialize the Message Digest Context
Calculate Message Digest
*/
//EVP_DigestInit(&messageDigestContext, EVP_md5());
for (j=0;j<totalTestVectors; j++)
{
EVP_DigestInit(&messageDigestContext, EVP_md5()); // for SHA1 use EVP_sha1()
EVP_DigestUpdate(&messageDigestContext, strMessages[j], strlen(strMessages[j]));
EVP_DigestFinal(&messageDigestContext, messageDigest, &outputLength);
printf("Test Vector : \"%s\" \n, Digest : = \"",strMessages[j]);
for (i = 0; i < outputLength; i++) printf("%02x", messageDigest[i]);
printf("\"\n");
}
return 0;
}
The above code work fine on windows or Linux but you should have
already openssl libs with you or you can download it.
Posted in Hashing - One Way Functions, OpenSSL | Leave a Comment »