利用openssl进行RSA签名

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;
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值