Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Can you give me a brief description of this C code that\'s why I can understand

ID: 3827234 • Letter: C

Question

Can you give me a brief description of this C code that's why I can understand more?

#include "Encrypt.h"

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include <string.h>

#include <string>

#include <time.h>

#include <openssl/aes.h>

#include <openssl/rand.h>

char* generateEncryptInfor()

{

   int keylength;

   printf("Give a key length [only 128 or 192 or 256!]: ");

   cin >> keylength;

   while (!(keylength == 128 || keylength == 192 || keylength == 256 ))

   {

       cout << "Invalid length, please enter again: " << endl;

       cin >> keylength;

   }

   /* generate a key with a given length */

   unsigned char* aes_key = new unsigned char[keylength / 8];

   memset(aes_key, 0, keylength / 8);

   if (!RAND_bytes(aes_key, keylength / 8))

       exit(-1);

   /* input struct creation */

   size_t inputslength = sizeof(USR_INFOR);

   USR_INFOR user_1;

   //user_1.password = 123456789;

  

   cout << "please input user name(no more than 100 characters):" << endl;

   cin >> user_1.username;

  

   unsigned int temp;

   cout << "please input password( no larger than 16 characters):" << endl;

   cin >> user_1.password;

   cout << "user name: " << user_1.username << endl;

   cout << "User Password : " << user_1.password << endl;

   /* init vector */

   unsigned char iv_enc[AES_BLOCK_SIZE], iv_dec[AES_BLOCK_SIZE];

   RAND_bytes(iv_enc, AES_BLOCK_SIZE);

   memcpy(iv_dec, iv_enc, AES_BLOCK_SIZE);

   // buffers for encryption and decryption

   const size_t encslength = ((inputslength + AES_BLOCK_SIZE) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;

   unsigned char* enc_out = new unsigned char[encslength];

   unsigned char* dec_out = new unsigned char[inputslength];

   memset(enc_out, 0, sizeof(enc_out));

   memset(dec_out, 0, sizeof(dec_out));

   // aes-cbc-128 aes-cbc-192 aes-cbc-256 are all available

   AES_KEY enc_key, dec_key;

   AES_set_encrypt_key(aes_key, keylength, &enc_key);

   AES_cbc_encrypt((unsigned char *)&user_1, enc_out, inputslength, &enc_key, iv_enc, AES_ENCRYPT);

   char* transmit = new char[strlen((char*)aes_key) + strlen((char*)enc_out) + strlen((char*)iv_dec) + 2];

   if (keylength == 128)// put all the encrypted information into one array, ready to send to the server.

   {

       transmit[0] = '6';

       transmit[1] = '9';

       for (int i = 0; i < strlen((char*)aes_key);i++)

       {

           transmit[i + 2] = aes_key[i];

       }

       for (int i = 0; i < strlen((char*)enc_out); i++)

       {

           transmit[i + 2 + strlen((char*)aes_key)] = enc_out[i];

       }

       for (int i = 0; i < strlen((char*)iv_dec); i++)

       {

           transmit[i + 2 + strlen((char*)aes_key) + strlen((char*)enc_out)] = iv_dec[i];

       }

   }

   else if (keylength == 192)

   {

       transmit[0] = '8';

       transmit[1] = '2';

       for (int i = 0; i < strlen((char*)aes_key); i++)

       {

           transmit[i + 2] = aes_key[i];

       }

       for (int i = 0; i < strlen((char*)enc_out); i++)

       {

           transmit[i + 2 + strlen((char*)aes_key)] = enc_out[i];

       }

       for (int i = 0; i < strlen((char*)iv_dec); i++)

       {

           transmit[i + 2 + strlen((char*)aes_key) + strlen((char*)enc_out)] = iv_dec[i];

       }

   }

   else   

   {

       transmit[0] = '7';

       transmit[1] = '5';

       for (int i = 0; i < strlen((char*)aes_key); i++)

       {

           transmit[i + 2] = aes_key[i];

       }

       for (int i = 0; i < strlen((char*)enc_out); i++)

       {

           transmit[i + 2 + strlen((char*)aes_key)] = enc_out[i];

       }

       for (int i = 0; i < strlen((char*)iv_dec); i++)

       {

           transmit[i + 2 + strlen((char*)aes_key) + strlen((char*)enc_out)] = iv_dec[i];

       }

   }

   for (int i = 0; i < strlen((char*)transmit); i++)

   {

       cout << transmit[i];

   }

   cout << endl;

   return transmit;

}

Explanation / Answer


Include header named "Encrypt.h"
#include "Encrypt.h"
#include <stdio.h>

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <time.h>

#include <openssl/aes.h>
#include <openssl/rand.h>

char* generateEncryptInfor()
{
int keylength; // keylength
printf("Give a key length [only 128 or 192 or 256!]: ");// keylength should be 128 or 192 or 256
cin >> keylength; // input keylength
while (!(keylength == 128 || keylength == 192 || keylength == 256 ))// condition check
{
cout << "Invalid length, please enter again: " << endl;// display invalid
cin >> keylength; //again take keylength
}
/* generate a key with a given length */
unsigned char* aes_key = new unsigned char[keylength / 8];// generates aes key with keylength that has been taken input earlier.

memset(aes_key, 0, keylength / 8);// function call

if (!RAND_bytes(aes_key, keylength / 8))// if check
exit(-1);// exits code

/* input struct creation */

size_t inputslength = sizeof(USR_INFOR);// stores size of usr_infor in inputslength
USR_INFOR user_1;

//user_1.password = 123456789;
  
cout << "please input user name(no more than 100 characters):" << endl;
// Enter username
cin >> user_1.username;// store username
  
unsigned int temp;
cout << "please input password( no larger than 16 characters):" << endl;//input password
cin >> user_1.password; // stores password

cout << "user name: " << user_1.username << endl;// display username
cout << "User Password : " << user_1.password << endl;//display password

/* init vector */
unsigned char iv_enc[AES_BLOCK_SIZE], iv_dec[AES_BLOCK_SIZE];
RAND_bytes(iv_enc, AES_BLOCK_SIZE);// function
memcpy(iv_dec, iv_enc, AES_BLOCK_SIZE);// method
// buffers for encryption and decryption

const size_t encslength = ((inputslength + AES_BLOCK_SIZE) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;// calculates encslength

unsigned char* enc_out = new unsigned char[encslength];

unsigned char* dec_out = new unsigned char[inputslength];

memset(enc_out, 0, sizeof(enc_out));
//Method definition

memset(dec_out, 0, sizeof(dec_out));

// aes-cbc-128 aes-cbc-192 aes-cbc-256 are all available
AES_KEY enc_key, dec_key;

AES_set_encrypt_key(aes_key, keylength, &enc_key);// method declaration


AES_cbc_encrypt((unsigned char *)&user_1, enc_out, inputslength, &enc_key, iv_enc, AES_ENCRYPT);

char* transmit = new char[strlen((char*)aes_key) + strlen((char*)enc_out) + strlen((char*)iv_dec) + 2];

if (keylength == 128)// put all the encrypted information into one array, ready to send to the server.
{   
transmit[0] = '6';
transmit[1] = '9';
for (int i = 0; i < strlen((char*)aes_key);i++)
{
transmit[i + 2] = aes_key[i];
}
for (int i = 0; i < strlen((char*)enc_out); i++)
{
transmit[i + 2 + strlen((char*)aes_key)] = enc_out[i];
}
for (int i = 0; i < strlen((char*)iv_dec); i++)
{
transmit[i + 2 + strlen((char*)aes_key) + strlen((char*)enc_out)] = iv_dec[i];
}

}
else if (keylength == 192)// checks for keylength
{
transmit[0] = '8';
transmit[1] = '2';
for (int i = 0; i < strlen((char*)aes_key); i++)
{
transmit[i + 2] = aes_key[i];
}
for (int i = 0; i < strlen((char*)enc_out); i++)
{
transmit[i + 2 + strlen((char*)aes_key)] = enc_out[i];
}
for (int i = 0; i < strlen((char*)iv_dec); i++)
{
transmit[i + 2 + strlen((char*)aes_key) + strlen((char*)enc_out)] = iv_dec[i];
}
}
else // last condition
{
transmit[0] = '7';
transmit[1] = '5';
for (int i = 0; i < strlen((char*)aes_key); i++)
{
transmit[i + 2] = aes_key[i];
}
for (int i = 0; i < strlen((char*)enc_out); i++)
{
transmit[i + 2 + strlen((char*)aes_key)] = enc_out[i];
}
for (int i = 0; i < strlen((char*)iv_dec); i++)
{
transmit[i + 2 + strlen((char*)aes_key) + strlen((char*)enc_out)] = iv_dec[i];
}
}

for (int i = 0; i < strlen((char*)transmit); i++)
{
cout << transmit[i];
}
cout << endl;
return transmit;
}

The loop has 3 conditions based on the keylength .Based on each condition particular code is getting executed.

I have added some comments please refer to the code above.

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote