Hi, >What protocol are you using? What I mean is application layer protocol. But since in your example, you're using your own protocol, why not send both length and data. Example. <4 byte len field><0..2^32-1 data field>
Then in you receiving end, do recv 4 bytes, get length, and recv until received data equals to length. And decrypt. - re On Sun, May 1, 2011 at 4:34 PM, derleader mail <[email protected]> wrote: > >> The encrypted output is not a NULL terminated string so strlen will not >> work. >> >> >> EVP_DecryptUpdate(&ctx, (unsigned char *)plaintextz, &out_len, >> (unsigned char *)ciphertext, strlen(ciphertext)); >> >> Use the length output from the encryption part. >> >> Thank you very much for the reply. The problem is that the encryption and >> decryption must be on separate machines. I need a way to take the size of >> the encrypted message using language function like strlen >> (). Is there other solution? >> > Hi, > > What protocol are you using? > If you cannot send the "length" of the encrypted data, then you cannot > decrypt it properly. > > > I'm going to use stream protocol - TCP/IP. Here is the template source code > of the server without the encryption part > > #include <stdio.h> > #include <sys/ioctl.h> > #include <sys/types.h> > #include <sys/socket.h> > #include <netinet/in.h> > #include <pthread.h> > > void* thread_proc(void *arg); > > int main(int argc, char *argv[]) > { > struct sockaddr_in sAddr; > int listensock; > int result; > int nchildren = 1; > pthread_t thread_id; > int x; > int val; > > if (argc > 1) { > nchildren = atoi(argv[1]); > } > > listensock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); > > val = 1; > result = setsockopt(listensock, SOL_SOCKET, SO_REUSEADDR, &val, > sizeof(val)); > if (result < 0) { > perror("server5"); > return 0; > } > > sAddr.sin_family = AF_INET; > sAddr.sin_port = htons(1972); > sAddr.sin_addr.s_addr = INADDR_ANY; > > result = bind(listensock, (struct sockaddr *) &sAddr, sizeof(sAddr)); > if (result < 0) { > perror("exserver5"); > return 0; > } > > result = listen(listensock, 5); > if (result < 0) { > perror("exserver5"); > return 0; > } > > for (x = 0; x < nchildren; x++) { > result = pthread_create(&thread_id, NULL, thread_proc, (void *) > listensock); > if (result != 0) { > printf("Could not create thread.\n"); > return 0; > } > sched_yield(); > } > > pthread_join (thread_id, NULL); > } > > void* thread_proc(void *arg) > { > int listensock, sock; > char buffer[25]; > int nread; > > listensock = (int) arg; > > while (1) { > sock = accept(listensock, NULL, NULL); > printf("client connected to child thread %i with pid %i.\n", > pthread_self(), getpid()); > nread = recv(sock, buffer, 25, 0); > buffer[nread] = '\0'; > printf("%s\n", buffer); > send(sock, buffer, nread, 0); > close(sock); > printf("client disconnected from child thread %i with pid %i.\n", > pthread_self(), getpid()); > } > } >
