On 24-08-2010 15:14, Harshvir Sidhu wrote:
Ben,
     theEncryptor::blowfish(unsigned char *data, int data_len, unsigned
char* key, unsigned char *ivec, int enc)
     In this function you are passing key argument as char *, i am not
able to find alice's public key in char* format, we received that in 2
buffers and we put that in RSA struct. Which one should i use to pass in
here. Thanks.
// Harshvir



key here is the random key generated by Bob with the call to
   ok = RAND_bytes(key, 64);

Bob has this key because he just made it.

Alice can get the key if Bob encrypts "key" with Alice's public
key (received earlier) and sends the encrypted key to Alice, who
can decrypt it with her private key.

By the way, I don't know why this code hashes a 64 byte random
key down to a 20 byte (160 bit) symmetric key, rather than just
exchanging a 20 byte symmetric key initially (I can think of
both good and bad reasons for this).

On Wed, Jul 21, 2010 at 10:07 AM, Ben Jones <b...@bhjones.com
<mailto:b...@bhjones.com>> wrote:

    Ok, well assuming you're talking about C++ which is what I'm using,
    then to create an RSA key pair you do:

    // alice would do this
    RSA *rsa = RSA_generate_key(bits, 65537, NULL, NULL);

    // alice can then get the public part of the key and send to bob
    const int max_hex_size = (bits / 4) + 1;
    long size = max_hex_size;
         char keyBufferA[size];
         char keyBufferB[size];
         bzero(keyBufferA,size);
         bzero(keyBufferB,size);
         sprintf(keyBufferA,"%s\r\n",BN_bn2hex(rsa->n));
         sprintf(keyBufferB,"%s\r\n",BN_bn2hex(rsa->e));
         int n = send(sock,keyBufferA,size,0);
         char recBuf[2];
         n = recv(sock,recBuf,2,0);
         n = send(sock,keyBufferB,size,0);
         n = recv(sock,recBuf,2,0);

    // bob can then receive the public key, so on bob's end:
    int max_hex_size = (bits / 4) + 1;
         char keybufA[max_hex_size];
         bzero(keybufA,max_hex_size);
         char keybufB[max_hex_size];
         bzero(keybufB,max_hex_size);
         int n = recv(sock,keybufA,max_hex_size,0);
         n = send(sock,"OK",2,0);
         n = recv(sock,keybufB,max_hex_size,0);
         n = send(sock,"OK",2,0);
         rsa = RSA_new();
         BN_hex2bn(&rsa->n, keybufA);
         BN_hex2bn(&rsa->e, keybufB);

    // bob can then generate symmetric key
    unsigned char* key;
    int n = RAND_bytes(key, bytes); // if n is 0 then system failed in
    having enough entropy to gather a strong key and should be
    //considered insecure

    // bob can then encrypt key with alice's public key, in fact here is
    a snippet of a function
    // note ivec is an intialisation vector. This is often initialized
    to 0 (but doing this is very insecure, but its useful
    // to do this for testing purposes)
    void
    theEncryptor::blowfish(unsigned char *data, int data_len, unsigned
    char* key, unsigned char *ivec, int enc)
    {

         //  hash the key first!
         unsigned char obuf[20];
         bzero(obuf,20);
         SHA1((const unsigned char*)key, 64, obuf);

         BF_KEY bfkey;
         int keySize = 20;//strlen((char*)key);
         BF_set_key(&bfkey, keySize, obuf);

         //unsigned char ivec[16];
         //memset(ivec, 0, 16);

         unsigned char* out=(unsigned char*) malloc(data_len);
         bzero(out,data_len);
         int num = 0;

         // enc is whether to encrypt (true) or decrypt (false)
         BF_cfb64_encrypt(data, out, data_len, &bfkey, ivec, &num, enc);

         memcpy(data, out, data_len);
         free(out);
    }

    // bob is now free to send the ecnrypted key back to alice

    Note: you should also look at the open_ssl api. I found this very
    helpful.

    Cheers,
    Ben.




    On 21 July 2010 15:41, Harshvir Sidhu <hvssi...@gmail.com
    <mailto:hvssi...@gmail.com>> wrote:

        Ben:
            Yes thats what i need to do. If you can provide some
        example, that will be great.
             Thanks.
        // Harshvir

        On Wed, Jul 21, 2010 at 9:17 AM, Ben Jones <b...@bhjones.com
        <mailto:b...@bhjones.com>> wrote:

            Well I implemented something very similar recently but using
            tcp rather than udp. In my case,  alice creates a
            public-private key pair and sends public key to bob. Bob
            then encrypts randomly generated symmetric key (.e.g
            blowish, dsa or aes etc.) with public key and sends the
            result to alice. Alice then decrypts with her private key.
            Both alice and bob have knowledge of symmetric key which can
            then be used for secure communication.

            A clear problem with this is a man-in-the-middle attack.
            There are functions built into the open ssl framework that
            allows you do create such keys manually. If that's what you
            need to do, I can give a more concrete ( albeit probably
            naive) example...

            Cheers,
            Ben.


            On 21 July 2010 15:02, Harshvir Sidhu <hvssi...@gmail.com
            <mailto:hvssi...@gmail.com>> wrote:

                Hi All,
                     I am trying to use encryption over Client/Server
                machines. My requirement is that i have to use winsock
                UDP functions to send and receive data. Is there some
                mechanism to perform key and cipher exchange in this
                case, like normally SSL_Connect will do this, but in my
                case i cannot use that. Is there some suggestion for this?
                // Harshvir












______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to