#include<stdio.h> #include<evp.h> #include<string.h> #include<windows.h> #include<x509.h> void tSign() { unsigned char sign_value[1024]; //保存签名值的数组 int sign_len; //签名的长度 EVP_MD_CTX mdctx; //摘要算法上下文变量 char mess1[]="Text Message"; //签名的信息 RSA *rsa=NULL; //RSA结构体变量 EVP_PKEY *evpKey=NULL; //EVPKEY 结构体变量 int i; printf("正在产生RSA密钥...."); rsa=RSA_generate_key(1024,RSA_F4,NULL,NULL); //产生一个1024 位的RSA密钥 if (rsa==NULL) { printf("gen rsa err/n"); return; } printf("成功。/n"); evpKey=EVP_PKEY_new();//新建一个EVP_PKEY 变量 if (evpKey==NULL) { printf("EVP_PKEY_new err/n"); RSA_free(rsa); return; } if (EVP_PKEY_set1_RSA(evpKey,rsa) !=1) //保存RSA结构体到EVP_PKEY 结构体 { printf("EVP_PKEY_set1_RSA err/n"); RSA_free(rsa); EVP_PKEY_free(evpKey); return; } EVP_MD_CTX_init(&mdctx); //初始化摘要上下文 if (!EVP_SignInit_ex(&mdctx,EVP_md5(),NULL)) { printf("Init err/n"); EVP_PKEY_free(evpKey); RSA_free(rsa); return; } if (!EVP_SignUpdate(&mdctx,mess1,strlen(mess1))) //计算签名(摘要)Update { printf("EVP_SignUpdate err/n"); EVP_PKEY_free(evpKey); RSA_free(rsa); return; } if(!EVP_SignFinal(&mdctx,sign_value,(unsigned int *)(&sign_len),evpKey))//签名输出 { printf("EVP_SignFinal err /n"); EVP_PKEY_free(evpKey); RSA_free(rsa); return; } printf("消息/"%s/"的签名值是:/n",mess1); for(i=0;i<sign_len;i++) { if (i%6==0) printf("/n%08xH:",i); printf("%02x ",sign_value[i]); } printf("/n"); EVP_MD_CTX_cleanup(&mdctx); printf("/n 正在验证签名....../n"); //以下为验证代码 if (!EVP_VerifyInit_ex(&mdctx,EVP_md5(),NULL)) { printf("EVP_VerifyInit_ex err/n"); EVP_PKEY_free(evpKey); RSA_free(rsa); return; } if (!EVP_VerifyUpdate(&mdctx,mess1,strlen(mess1))) { printf ("EVP_VerifyUpdate err /n"); EVP_PKEY_free(evpKey); RSA_free(rsa); return; } if (!EVP_VerifyFinal(&mdctx,sign_value,sign_len,evpKey)) { printf("EVP_VerifyFinal err /n"); EVP_PKEY_free(evpKey); RSA_free(rsa); return; } else { printf ("验证签名正确../n"); } EVP_PKEY_free(evpKey); RSA_free(rsa); EVP_MD_CTX_cleanup(&mdctx); printf ("--------------------------------------/n"); return; } int main(){ tSign(); return 0; }