-
大小: 2KB文件类型: .zip金币: 1下载: 0 次发布日期: 2021-06-10
- 语言: Java
- 标签: MD5withRSA
资源简介
该资源通过C客户端MD5withRSA算法签名,java服务端进行验签。之前一直对接不上,网上资料也不全,算法对接不同,padding方式不一等导致对接失败,故分享。
代码片段和文件信息
#include “RSA.h“
/* 对二进制数据进行base64编码 */
/* input:数组,length:数组长度result:存储编码后的数据,size:数组大小 */
unsigned char *base64(const void *input size_t lengthchar *result size_t size)
{
BIO *bmem *b64;
BUF_MEM *bptr;
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64 bmem);
BIO_write(b64 input length);
BIO_flush(b64);
BIO_get_mem_ptr(b64 &bptr);
if(size < bptr->length-1)
{
printf(“the size is so small\n“);
return NULL;
}
memcpy(result bptr->data bptr->length-1);
result[bptr->length-1] = 0;
BIO_free_all(b64);
return result;
}
/* 对base64数据进行解码 */
/* input:待解码数组,length:数组长度,result:解码后数据暂存区,暂存区大小 */
unsigned char *debase64(char *input size_t length char *result size_t size)
{
BIO * b64 = NULL;
BIO * bmem = NULL;
assert(NULL != input);
if (length > size)
return NULL;
memset(result 0 size);
b64 = BIO_new(BIO_f_base64());
bmem = BIO_new_mem_buf(input length);
BIO_set_flags(b64 BIO_FLAGS_base64_NO_NL);
if (NULL == b64 || NULL == bmem)
{
perror(“BIO_new“);
return NULL;
}
bmem = BIO_push(b64 bmem);
BIO_read(bmem result length);
BIO_free_all(b64);
return result;
}
/* 生成签名函数 */
/* 1:私钥名,2:待签名的数据,3:签名后的数据存储区,4:传入指针 */
unsigned char * GetSign(char* keyFilechar* plainTextunsigned char* cipherTextunsigned int *cipherTextLen)
{
FILE* fp = fopen (keyFile “r“);
if (fp == NULL)
return NULL;
/* Read private key */
EVP_PKEY* pkey = PEM_read_PrivateKey(fp NULL NULL NULL);
fclose (fp);
if (pkey == NULL)
{
ERR_print_errors_fp (stderr);
return NULL;
}
/* Do the signature */
EVP_MD_CTX md_ctx;
EVP_SignInit (&md_ctx EVP_md5());
EVP_SignUpdate (&md_ctx plainText strlen(plainText));
int err = EVP_SignFinal (&md_ctx cipherText cipherTextLen pkey);
if (err != 1) {
ERR_print_errors_fp(stderr);
return NULL;
}
EVP_PKEY_free(pkey);
return cipherText;
}
/* 验证签名函数 */
/* 1:公钥名,2:签名的数据,3:签名的数据大小,4:原数据 */
bool VerifySign(char* certFileunsigned char* cipherTextunsigned int cipherTextLenchar* plainText)
{
FILE* fp = fopen(certFile “r“);
if (fp == NULL)
return false;
EVP_PKEY *pkey=PEM_read_PUBKEY(fpNULLNULLNULL);
if (pkey == NULL)
{
printf(“pkey fail\n“);
ERR_print_errors_fp (stderr);
return false;
}
EVP_MD_CTX md_ctx;
EVP_VerifyInit (&md_ctx EVP_md5());
EVP_VerifyUpdate (&md_ctx plainText strlen((char*)plainText));
int err = EVP_VerifyFinal (&md_ctx cipherText cipherTextLen pkey);
EVP_PKEY_free (pkey);
if (err != 1) {
ERR_print_errors_fp (stderr);
return false;
}
fclose(fp);
return true;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3222 2018-01-12 16:02 RSA.c
文件 727 2018-01-12 16:03 RSA.h
文件 614 2018-01-12 16:11 RSA_test.c
- 上一篇:Android 数独 游戏 源码
- 下一篇:android个人记账系统毕业设计论文
评论
共有 条评论