NSString *RSA_EVP_Sign(NSString *data)
{
unsigned char *Str=(unsigned char *)[data UTF8String];//utf8编码转换成c的字符串
EVP_PKEY *prikey;
NSString *private = formatPrivate(PRIVATE_KEY);//格式化自己的私钥
NSData *pri= [private dataUsingEncoding: NSUTF8StringEncoding];//utf8编码将私钥转换成二进制
BIO *bio = BIO_new_mem_buf((void *)[pri bytes], (int)[pri length]);//将私钥读取到内存中
prikey = PEM_read_bio_PrivateKey(bio, NULL,NULL, NULL);//读内存中的私钥
BIO_free(bio);
int strLen= (int)strlen((const char *)Str);
EVP_MD_CTX mdctx;
EVP_MD_CTX_init(&mdctx); //初始化mdctx结构体
if(!EVP_SignInit_ex(&mdctx, EVP_sha256(), NULL)) //初始化数据加密,把加密得到的数据放入mdctx
{
printf("error\n");
EVP_PKEY_free(prikey);
}
if(!EVP_SignUpdate(&mdctx, Str, strLen)) //开始加密
{
printf("error\n");
EVP_PKEY_free(prikey);
}
unsigned int signLen=EVP_PKEY_size(prikey);
unsigned char* signBuf=(unsigned char *)calloc(signLen+1, sizeof(unsigned char)); //申请signLen+1段内存
if(!EVP_SignFinal(&mdctx, signBuf, &signLen, prikey)) //数据拷贝到signBuf中
{
printf("error\n");
EVP_PKEY_free(prikey);
}
EVP_MD_CTX_cleanup(&mdctx); //清空防止内存泄漏
NSMutableString *result = [NSMutableString stringWithCapacity:128];
for(int i = 0; i < 128; i++)
[result appendFormat:@"%02x", signBuf[i]]; //将signBuf中的数据加入到result中去
return result;
}
利用openssl进行RSA签名
最新推荐文章于 2024-03-06 17:28:18 发布