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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抗量子数字证书的生成过程与传统数字证书的生成过程类似,但需要使用抗量子密码学算法。以下是一个使用 OpenSSL 生成抗量子数字证书的示例代码: ``` #include <stdio.h> #include <openssl/bio.h> #include <openssl/x509.h> #include <openssl/x509v3.h> #include <openssl/rsa.h> #include <openssl/obj_mac.h> #include <openssl/evp.h> #include <openssl/pem.h> #define KEY_LENGTH 2048 int main() { X509 *x509 = NULL; EVP_PKEY *pkey = NULL; RSA *rsa = NULL; // 初始化 OpenSSLOpenSSL_add_all_algorithms(); ERR_load_BIO_strings(); ERR_load_crypto_strings(); // 生成 RSA 密钥对 rsa = RSA_generate_key(KEY_LENGTH, RSA_F4, NULL, NULL); pkey = EVP_PKEY_new(); EVP_PKEY_assign_RSA(pkey, rsa); // 创建证书结构体 x509 = X509_new(); // 设置证书版本号 X509_set_version(x509, 2); // 设置证书序列号 ASN1_INTEGER_set(X509_get_serialNumber(x509), 1); // 设置证书有效期 X509_gmtime_adj(X509_get_notBefore(x509), 0); X509_gmtime_adj(X509_get_notAfter(x509), 315360000L); // 10 年 // 设置证书主题和颁发者 X509_NAME *name = X509_get_subject_name(x509); X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, "CN", -1, -1, 0); X509_NAME_add_entry_by_txt(name, "O", MBSTRING_ASC, "Organization", -1, -1, 0); X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, "example.com", -1, -1, 0); X509_set_issuer_name(x509, name); // 设置密钥和签名算法 X509_set_pubkey(x509, pkey); X509_ALGOR_set_md(X509_get0_tbs_sigalg(x509), EVP_sha3_256()); X509_ALGOR_set0(X509_get0_tbs_sigalg(x509), OBJ_nid2obj(NID_hss_lms_hashsig), V_ASN1_NULL, NULL); // 签名证书 X509_sign(x509, pkey, EVP_sha3_256()); // 输出证书 BIO *bio = BIO_new_fp(stdout, BIO_NOCLOSE); PEM_write_bio_X509(bio, x509); // 释放资源 X509_free(x509); EVP_PKEY_free(pkey); BIO_free(bio); return 0; } ``` 在上述代码中,我们使用了 `RSA_generate_key` 函数生成一个 2048 位的 RSA 密钥对,使用 `EVP_PKEY_assign_RSA` 函数将 RSA 密钥对赋值给 `EVP_PKEY` 结构体。接着创建了一个 X509 结构体,并设置了证书的版本号、序列号、有效期、主题、颁发者、密钥和签名算法。最后使用 `X509_sign` 函数签名证书,并使用 `PEM_write_bio_X509` 函数将证书输出到标准输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值