关于openssl pkcs7 数字信封的问题

发布于 2021-11-24 09:17:22 字数 4085 浏览 838 评论 5

以下是我生成PKCS7 数字信封的一个例子,我想进行数字信封的生成和解析。可是无法正确的解析,运用 openssl 0.9.8.d  请哪位专家帮忙看下。,谢谢啦! 

注:EVP_PKEY *priKey 之前与对应公钥证书已经进行过RSA 的加解密,运行正常。

 

char* ssl_PKCS7_get_Enveloped_data (EVP_PKEY *priKey)
{
    //读取公钥证书
   
    char buf[4096];
    unsigned char *p;
    char *DerPathCharp = "/Users/ipc/Desktop/openssl/rsa_encode_decode/CryptoDemo/yaclifecert.der";
   
    FILE* fp=fopen(DerPathCharp,"rb");
   
    if(!fp) return NO;
   
    int len=fread(buf,1,5000,fp);
   
    fclose(fp);
   
   
    p=buf;
   
    X509 *x509_Cert=X509_new();
   
    d2i_X509(&x509_Cert,(const unsigned char **)&p,len);   
   
   
    //调用openssl的代码如下:
   
    PKCS7* p7 = PKCS7_new();
   
   
    //设置类型为NID_pkcs7_enveloped
   
    PKCS7_set_type(p7, NID_pkcs7_enveloped);
   
    //DES算法,用于加密内容“How are you!”
   
    EVP_CIPHER *evp_cipher = EVP_des_cbc();
   
    PKCS7_set_cipher(p7,evp_cipher);
   
   
   
    //设置接收者证书,获取公钥用于加密对称密钥
   
    PKCS7_RECIP_INFO *p7recipinfo = PKCS7_add_recipient(p7,x509_Cert);
   
    BIO *p7bio = PKCS7_dataInit(p7, NULL);
    char *instr = "How Are You!";
    BIO_write(p7bio,instr,strlen(instr));
    printf("instr = %s",instr);
    //完成数字信封的运算
   
    PKCS7_dataFinal(p7, p7bio);
   
    //转换PKCS7结构体为DER编码
    X509* derTmp,*der;
   
    int derLen = i2d_PKCS7(p7,NULL);
    der  = (unsigned char*)malloc(derLen);
    derTmp = der;
    //转换为der编码输出
    derLen = i2d_PKCS7(p7,&derTmp);
   
   
    BIO_free(p7bio);
   
    PKCS7_free(p7);    
   
   
   
    //解P7数字信封的代码:
   
    //der编码转换为PKCS7结构体
    int derP7EnvelopedDataLen = derLen;
    PKCS7* v_p7 = NULL;
   
    PKCS7* v_p7_tmp = d2i_PKCS7(&v_p7,&der,derP7EnvelopedDataLen);
   

   
    //解析出原始数据, evp_key:接收者私钥,x509_cert:接收者证书
    BIO * v_p7bio_tmp = BIO_new(BIO_s_file());
    BIO * v_p7bio = PKCS7_dataDecode(v_p7,priKey,NULL,x509_Cert);
   
    //从BIO中读取原始数据,将得到"How are you!"
    unsigned char src[4096];
    int srcLen = BIO_read(v_p7bio,src,4096);
   
    printf("nsrc = %s",src);
    if (!strcmp(instr,src))
    {
        printf(" n ssl_PKCS7_get_Enveloped_data ok !!n");
    }
   
    BIO_free(v_p7bio);
   
    PKCS7_free(v_p7);
   
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

把回忆走一遍 2021-11-25 04:13:51

你好!!!请问一下封装为数字信封是怎么封装的???谢谢!!!

乞讨 2021-11-25 02:30:03

我的搞定了

  BIO_write(p7bio,instr,strlen(instr));
    printf("instr = %s",instr);

    BIO_flush(p7bio); //添加这个,作用应该是将文件指针指向开始
    //完成数字信封的运算
    
    PKCS7_dataFinal(p7, p7bio);

落墨 2021-11-25 01:05:07

嗯嗯,解决啦,非常感谢!

噩梦成真你也成魔 2021-11-24 22:52:16

兄弟这个解决没?

怎言笑 2021-11-24 18:46:32

这么没人回复呀。。。希望高手帮看下哦!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文