实例介绍
【实例截图】
【核心代码】
static int base64_decode(char *str,int str_len,char *decode,int decode_buffer_len)
{
int len=0;
BIO *b64,*bmem;
b64=BIO_new(BIO_f_base64());
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); // 不换行
bmem=BIO_new_mem_buf(str,str_len);
bmem=BIO_push(b64,bmem);
len=BIO_read(bmem,decode,str_len);
decode[len]=0;
BIO_free_all(bmem);
return len;
}
static int base64_encode(char *str,int str_len,char *encode,int encode_len)
{
BIO *bmem,*b64;
BUF_MEM *bptr;
b64 = BIO_new(BIO_f_base64());
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); // 不换行
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64,bmem);
BIO_write(b64,str,str_len); //encode
BIO_flush(b64);
BIO_get_mem_ptr(b64,&bptr);
if(bptr->length>encode_len)
{
return -1;
}
encode_len=bptr->length;
memcpy(encode,bptr->data,bptr->length);
BIO_free_all(b64);
return encode_len;
}
/*
功能:rsa 签名
参数:1st -- 要进行签名的数据 2st -- 私钥路径 3st -- 签名后返回的数据 缓冲区要比签名后数据长度要大 4st -- 缓冲区的大小
返回值:成功返回 0 失败返负数
作者:
时间:2016/1/29 9:57
*/
int rsa_sign(const char* src,const char* priKeyFile,char* dest,int dLen)
{
if((src == NULL) || (priKeyFile == NULL) || (dest == NULL))
return -1;
int err;
unsigned int sig_len;
unsigned char sig_buf[4096];
EVP_MD_CTX md_ctx;
EVP_PKEY *pkey;
FILE *fp;
/* SSL_load_error_strings(); */
ERR_load_crypto_strings();
/* Read private key */
fp = fopen(priKeyFile, "r");
if (fp == NULL)
return -2;
pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL);
fclose(fp);
if (pkey == NULL)
{
ERR_print_errors_fp(stderr);
return -3;
}
/* Do the signature */
EVP_SignInit(&md_ctx, EVP_sha1());
EVP_SignUpdate(&md_ctx, src, strlen(src));
sig_len = sizeof(sig_buf);
err = EVP_SignFinal(&md_ctx, sig_buf, &sig_len, pkey);
if (err != 1)
{
ERR_print_errors_fp(stderr);
return -4;
}
EVP_PKEY_free(pkey);
// int i = 0;
// fprintf(stderr, "sig_len = %d\n",sig_len);
// for(i = 0;i < sig_len;i )
// fprintf(stderr, "%02x ",sig_buf[i]);
// fprintf(stderr, "\n");
if(base64_encode((char*)sig_buf,sig_len,dest,dLen) < 0)
return -5;
return 0;
}
/*
功能:rsa 验证签名
参数:1st -- 要验证签名的数据 2st -- 签名值 3st -- 公钥路径
返回值:成功返回 true 失败返false
作者:
时间:2016/2/2 17:02
*/
bool rsa_verify(const char* data,const char* sign,const char* pubKeyFile)
{
if((data == NULL) || (sign == NULL) || (pubKeyFile == NULL))
return false;
int err;
unsigned int sig_len;
unsigned char sig_buf[4096];
EVP_MD_CTX md_ctx;
EVP_PKEY *pkey;
FILE *fp;
sig_len = base64_decode((char*)sign,strlen(sign),(char*)sig_buf,sizeof(sig_buf));
/* SSL_load_error_strings(); */
ERR_load_crypto_strings();
/* Read public key */
fp = fopen(pubKeyFile, "r");
if (fp == NULL)
{
return false;
}
pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
if (pkey == NULL)
{
ERR_print_errors_fp(stderr);
return false;
}
/* Verify the signature */
EVP_VerifyInit(&md_ctx, EVP_sha1());
EVP_VerifyUpdate(&md_ctx, data,strlen(data));
err = EVP_VerifyFinal(&md_ctx, sig_buf, sig_len, pkey);
EVP_PKEY_free(pkey);
fprintf(stderr,"err = %d\n",err);
if (err != 1)
{
ERR_print_errors_fp(stderr);
return false;
}
printf("Signature Verified Ok.\n");
return true;
}
标签: RSA
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论