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.
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.