head.h
-------------------------------------------------------------------------------------
#include <openssl/evp.h>
#include<openssl/bio.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<openssl/err.h>
#include<openssl/x509.h>
#include<windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define MSG_LEN (128+1)
#define BUFFSIZE 1024
#define BUFSIZE 128
---------------------------------------------------------------------------------------
#include "head.h"
int len=0;//明文hash计算
void hash(){
FILE *fp;
EVP_MD_CTX mdctx;
char mess[100];
if((fp=fopen("plaintest.bin","r"))==NULL) exit(0);
fscanf(fp,"%s",mess);
fclose(fp);
printf("读取到的文件内容为:%s\n",mess);
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len,i;
printf("\n本系统采用sha1进行文件摘要值计算\n");
OpenSSL_add_all_digests();
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx,EVP_sha1(),NULL);
EVP_DigestUpdate(&mdctx,mess,strlen(mess));
EVP_DigestFinal_ex(&mdctx,md_value,&md_len);
EVP_MD_CTX_cleanup(&mdctx);
printf("\n摘要值为:");
for(i=0;i<md_len;i++)printf("%02x",md_value[i]);
printf("\n");
if((fp=fopen("hash_value.bin","wb"))==NULL)
{
printf("文件摘要写入hash_value.bin失败\n");
exit(0);
}
for(i=0;i<md_len;i++)
fprintf(fp,"%02x",md_value[i]);
fclose(fp);
printf("\n明文摘要值写入文件hash_value.bin成功\n");
}
//计算解密后的文件摘要
void hash_text(){
FILE *fp;
EVP_MD_CTX mdctx;
char mess[100];
if((fp=fopen("DE_AesEncrptyFile.bin","r"))==NULL) exit(0);
fscanf(fp,"%s",mess);
fclose(fp);
printf("读取到的准明文内容为:%s\n",mess);
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len,i;
OpenSSL_add_all_digests();
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx,EVP_sha1(),NULL);
EVP_DigestUpdate(&mdctx,mess,strlen(mess));
EVP_DigestFinal_ex(&mdctx,md_value,&md_len);
EVP_MD_CTX_cleanup(&mdctx);
printf("\n准明文的摘要值为:");
for(i=0;i<md_len;i++)printf("%02x",md_value[i]);
printf("\n");
if((fp=fopen("hash_value_T.bin","wb"))==NULL)
{
printf("准文件摘要写入失败\n");
exit(0);
}
for(i=0;i<md_len;i++)
fprintf(fp,"%02x",md_value[i]);
fclose(fp);
printf("\n准摘要值写入文件hash_value_T.bin成功\n");
}
//AES加密
unsigned char* AES_en(EVP_CIPHER_CTX* evp_cipher_ctx,EVP_CIPHER* evp_cipher,unsigned char* in,unsigned char* ucKey)
{
int n;
unsigned char *buffer;
unsigned char *out;/*保存解密后的信息*/
int tmplen = 0;
int i = 0;
buffer=(unsigned char *)malloc(sizeof(in));
memset(buffer,0,sizeof(in));
// 初始化加密算法
if (!EVP_EncryptInit_ex(evp_cipher_ctx, evp_cipher, NULL, ucKey, NULL))
{
printf("EVP_CipherInit_ex() failed!\n");
exit(EXIT_FAILURE);
}
if(!EVP_EncryptUpdate(evp_cipher_ctx, buffer, &len, in, strlen((char*)in)))
{
printf("EVP_EncryptUpdate failed!\n");
exit(EXIT_FAILURE);
}
if(!EVP_EncryptFinal_ex(evp_cipher_ctx, buffer + len, &tmplen))
if (1 != EVP_CipherFinal_ex(evp_cipher_ctx, buffer, &len))
{
printf("EVP_CipherFinal_ex() failed!\n");
exit(EXIT_FAILURE);
}
len += tmplen;
//printf("AES加密结果为:%0x\n",buffer);// 显示加密结果
return buffer;
}
//AES解密
void AES_De(EVP_CIPHER_CTX* evp_cipher_ctx,EVP_CIPHER* evp_cipher,uns