⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 example1.c

📁 开源的ssl算法openssl,版本0.9.8H
💻 C
字号:
/* NOCW *//*	Please read the README file for condition of use, before	using this software.		Maurice Gittens  <mgittens@gits.nl>   January 1997*/#include <unistd.h>#include <stdio.h>#include <netinet/in.h>#include <fcntl.h>#include <strings.h>#include <stdlib.h>#include <openssl/rsa.h>#include <openssl/evp.h>#include <openssl/objects.h>#include <openssl/x509.h>#include <openssl/err.h>#include <openssl/pem.h>#include <openssl/ssl.h>#include "loadkeys.h"#define PUBFILE   "cert.pem"#define PRIVFILE  "privkey.pem"#define STDIN     0#define STDOUT    1 void main_encrypt(void);void main_decrypt(void);static const char *usage = "Usage: example1 [-d]\n";int main(int argc, char *argv[]){        ERR_load_crypto_strings();	if ((argc == 1))		{		main_encrypt();	}		else if ((argc == 2) && !strcmp(argv[1],"-d"))	{		main_decrypt();	}	else	{		printf("%s",usage);		exit(1);	}	return 0;		}void main_encrypt(void){	unsigned int ebuflen;        EVP_CIPHER_CTX ectx;        unsigned char iv[EVP_MAX_IV_LENGTH];	unsigned char *ekey[1]; 	int readlen;	int ekeylen, net_ekeylen; 	EVP_PKEY *pubKey[1];	char buf[512];	char ebuf[512];	 	memset(iv, '\0', sizeof(iv));        pubKey[0] = ReadPublicKey(PUBFILE);	if(!pubKey[0])	{           fprintf(stderr,"Error: can't load public key");           exit(1);        }              ekey[0] = malloc(EVP_PKEY_size(pubKey[0]));          if (!ekey[0])	{	   EVP_PKEY_free(pubKey[0]); 	   perror("malloc");	   exit(1);	}	EVP_SealInit(&ectx,                   EVP_des_ede3_cbc(),		   ekey,		   &ekeylen,		   iv,		   pubKey,		   1); 	net_ekeylen = htonl(ekeylen);		write(STDOUT, (char*)&net_ekeylen, sizeof(net_ekeylen));        write(STDOUT, ekey[0], ekeylen);        write(STDOUT, iv, sizeof(iv));	while(1)	{		readlen = read(STDIN, buf, sizeof(buf));		if (readlen <= 0)		{		   if (readlen < 0)			perror("read");		   break;		}		EVP_SealUpdate(&ectx, ebuf, &ebuflen, buf, readlen);		write(STDOUT, ebuf, ebuflen);	}        EVP_SealFinal(&ectx, ebuf, &ebuflen);        	write(STDOUT, ebuf, ebuflen);        EVP_PKEY_free(pubKey[0]);	free(ekey[0]);}void main_decrypt(void){	char buf[520];	char ebuf[512];	unsigned int buflen;        EVP_CIPHER_CTX ectx;        unsigned char iv[EVP_MAX_IV_LENGTH];	unsigned char *encryptKey; 	unsigned int ekeylen; 	EVP_PKEY *privateKey;	memset(iv, '\0', sizeof(iv));	privateKey = ReadPrivateKey(PRIVFILE);	if (!privateKey)	{		fprintf(stderr, "Error: can't load private key");		exit(1);		}     	read(STDIN, &ekeylen, sizeof(ekeylen));	ekeylen = ntohl(ekeylen);	if (ekeylen != EVP_PKEY_size(privateKey))	{        	EVP_PKEY_free(privateKey);		fprintf(stderr, "keylength mismatch");		exit(1);		}	encryptKey = malloc(sizeof(char) * ekeylen);	if (!encryptKey)	{        	EVP_PKEY_free(privateKey);		perror("malloc");		exit(1);	}	read(STDIN, encryptKey, ekeylen);	read(STDIN, iv, sizeof(iv));	EVP_OpenInit(&ectx,		   EVP_des_ede3_cbc(), 		   encryptKey,		   ekeylen,		   iv,		   privateKey); 		while(1)	{		int readlen = read(STDIN, ebuf, sizeof(ebuf));		if (readlen <= 0)		{			if (readlen < 0)				perror("read");			break;		}		EVP_OpenUpdate(&ectx, buf, &buflen, ebuf, readlen);		write(STDOUT, buf, buflen);	}        EVP_OpenFinal(&ectx, buf, &buflen);	write(STDOUT, buf, buflen);        EVP_PKEY_free(privateKey);	free(encryptKey);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -