0

I'm trying to send an encrypted message over a network using tcp/ip communication but an error occurred at the last step i.e the message is being send and after receiving at private decrypt the error occurred.

Also this code runs completely ok when the key is being used for the first time after generation but after first use the error occurs every time:

0407109F:rsa routines:RSA_padding_check_PKCS1_type_2:pkcs decoding error

I'm sharing the code:

server side-


#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
//openssl headers
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/err.h>
//int padding = RSA_SSLV23_PADDING;
//int padding = RSA_PKCS1_OAEP_PADDING;

int padding = RSA_PKCS1_PADDING;

RSA * createRSA(unsigned char * key,int public)
{
    RSA *rsa= NULL;
    BIO *keybio ;
    keybio = BIO_new_mem_buf(key, -1);
    if (keybio==NULL)
    {
        printf( "Failed to create key BIO");
        return 0;
    }
    if(public)
    {
        rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa,NULL, NULL);
    }
    else
    {
        rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa,NULL, NULL);
    }
    if(rsa == NULL)
    {
        printf( "Failed to create RSA");
    }

    return rsa;
}

int public_encrypt(unsigned char * data,int data_len,unsigned char * key, unsigned char *encrypted)
{
    RSA * rsa = createRSA(key,1);
    int result = RSA_public_encrypt(data_len,data,encrypted,rsa,padding);               //fun for encrypting
    return result;
}



void printLastError(char *msg)
{
    char * err = malloc(130);;
//    ERR_load_crypto_strings();
    ERR_error_string(ERR_get_error(), err);
    printf("%s ERROR: %s\n",msg, err);
    free(err);
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////
int  main()
{
        int eof=0;
        char plainText[2048/8] = "Hello this is AMIT"; //key length : 2048
        char publicKey[4098];
        char privatekey[4098];

        FILE *fd=fopen("public.pem","r");
        while(!feof(fd))
        {
                eof=fread(&publicKey,sizeof(publicKey),1,fd);
//              perror("public key fread");
                if(eof==0)
                {
                        fclose(fd);
                        break;
                }
        }
//printf("public key---%s\n",publicKey);

        unsigned char  encrypted[4098]={};

        int encrypted_length= public_encrypt(plainText,strlen(plainText),publicKey,encrypted);
//      perror("public encryption");
        if(encrypted_length == -1)
        {
                printLastError("Public Encrypt failed ");
                exit(0);
        }
        printf("Encrypted length =%d\n",encrypted_length);
//      printf("Encrypted DATA =%s\n",encrypted);

/*------------------SOCKET---------------------------*/
        struct sockaddr_in server , client;
        char buf[10];
        memset(buf,'\0',sizeof(buf));

        int socket_id = socket(AF_INET, SOCK_STREAM, 0);
        server.sin_family=AF_INET;
        server.sin_port=htons(5000);
        server.sin_addr.s_addr=inet_addr("127.0.0.1");

        bind(socket_id, (struct sockaddr *)&server,sizeof(server));
        perror("bind");
        listen(socket_id,5);

        int addrlen=sizeof(struct sockaddr);
        int client_sock=accept(socket_id,(struct sockaddr *)&client,(socklen_t*)&addrlen);
        perror("accept");
/*      while(9)
        {
                printf("write data for client\n");
                scanf("%s",buf);
                write(client_sock,&buf,strlen(buf));
                perror("write");
        }
*/
        printf("sending encryptd data\n");
        write(client_sock,&encrypted_length,sizeof(encrypted_length));
        perror("write");
        sleep(1);
        write(client_sock,&encrypted,strlen(encrypted));
        perror("write");
/*-----------------END-----------------------------*/
}

client side-

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
//openssl headers
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/err.h>
int padding = RSA_PKCS1_PADDING;
//int padding = RSA_SSLV23_PADDING;
//int padding = RSA_PKCS1_OAEP_PADDING;

RSA * createRSA(unsigned char * key,int public)
{
    RSA *rsa= NULL;
    BIO *keybio ;
    keybio = BIO_new_mem_buf(key, -1);
    if (keybio==NULL)
    {
        printf( "Failed to create key BIO");
        return 0;
    }
    if(public)
    {
        rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa,NULL, NULL);
    }
    else
    {
        rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa,NULL, NULL);
    }
    if(rsa == NULL)
    {
        printf( "Failed to create RSA");
    }

    return rsa;
}


int private_decrypt(unsigned char * enc_data,int data_len,unsigned char * key, unsigned char *decrypted)
{
printf("len = %d\n",data_len);
    RSA * rsa = createRSA(key,0);
    int  result = RSA_private_decrypt(data_len,enc_data,decrypted,rsa,padding);         //fun for decrypting
perror("RSA");
printf("Resut = %d\n",result);
    return result;
}


void printLastError(char *msg)
{
    char * err = malloc(130);;
//    ERR_load_crypto_strings();
    ERR_error_string(ERR_get_error(), err);
    printf("\n%s ERROR: %s\n",msg, err);
    free(err);
}


//////////////////////////////////////////////////////////////////////////////////////////////////////////////
int  main()
{
        int eof=0;
//      char plainText[2048/8] = "Hello this is AMIT"; //key length : 2048
        char publicKey[4098];
        char privateKey[4098];
        unsigned char decrypted[4099]={};
        unsigned char encrypted[4098]={};
        int encrypted_length=0;

        FILE *fd=fopen("private.pem","r");
        while(!feof(fd))
        {
                eof=fread(&privateKey,sizeof(privateKey),1,fd);
                perror("private key fread");
                if(eof==0)
                {
                        fclose(fd);
                        break;
                }
        }

//      printf("private key--->\n%s\n",privateKey);

/*------------------SOCKET---------------------------*/

        struct sockaddr_in server , client;
//      char buf[10];
        memset(encrypted,'\0',sizeof(encrypted));
        int socket_id = socket(AF_INET, SOCK_STREAM, 0);

        client.sin_family=AF_INET;
        client.sin_port=htons(5000);
        client.sin_addr.s_addr=inet_addr("127.0.0.1");


        connect(socket_id,(struct sockaddr *)&client,sizeof(client));
        perror("connect");
        printf("\nWAITING TO RECEIVE DATA LENGTH...\n");
        read(socket_id,&encrypted_length,sizeof(encrypted_length));
        //printf("\nENCRYPTED DATA= %s\n",encrypted);

        printf("WAITING TO RECEIVE DATA...\n");
        read(socket_id,&encrypted,sizeof(encrypted));
perror("read");
        printf("ENCRYPTED LENGTH= %d\n",encrypted_length);
/*----------------------------END-----------------------------*/

        int decrypted_length = private_decrypt(encrypted,encrypted_length,privateKey, decrypted);
        //int decrypted_length = private_decrypt(encrypted,512,privateKey, decrypted);
        printf("\nDecrypted Length =%d\n",decrypted_length);
        if(decrypted_length == -1)
        {
                printLastError("Private Decrypt failed ");
                //exit(0);
        }
        printf("\nDecrypted Text =%s\n",decrypted);
}
halfer
  • 19,824
  • 17
  • 99
  • 186
  • 1
    Please read [Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers?](//meta.stackoverflow.com/q/326569) - the summary is that this is not an ideal way to address volunteers, and is probably counterproductive to obtaining answers. Please refrain from adding this to your questions. – halfer Mar 13 '18 at 12:28
  • Okay. Thank you for the concern, as this was my first question i'll keep in mind from next time. But can you help in solving the problem right now? – Amit Tewari Mar 13 '18 at 13:17

0 Answers0