PKCS7 签名

Openssl之Pkcs7之3 Signed-Data内容类型的编码解码

PKCS7_SIGNED.sign在openssl中的定义如下:

typedef struct pkcs7_signed_st

{

ASN1_INTEGER *version; /* version 1 */

STACK_OF(X509_ALGOR) *md_algs; /* md used */

STACK_OF(X509) *cert; /* [ 0 ] */

STACK_OF(X509_CRL) *crl; /* [ 1 ] */

STACK_OF(PKCS7_SIGNER_INFO) *signer_info;

struct pkcs7_st *contents;

} PKCS7_SIGNED;

signed内容类型由任意类型的内容和数字签名组成。任何类型的内容能够同时被任意数量的签名者签名。

签名数据的产生过程有如下几步

1. 对于每一个签名者,他用消息摘要算法计算出摘要值 。

2. 对于每一个签名者,消息摘要和相关的信息用自己的私钥加密。

3. 对于每一个签名者,把加密的消息摘要和其他的签名者特定信息放入signer_info值中。每个 签名者的证书、crl等也在这一步被收集进来。

4. 把所有签名者的信息摘要算法、他们的signer_info值和内容一起放进sign值中。

调用openssl的代码如下:

PKCS7* p7 = PKCS7_new();

PKCS7_set_type(p7, NID_pkcs7_signed);//设置类型为NID_pkcs7_signed

PKCS7_content_new(p7, NID_pkcs7_data);

PKCS7_set_detached(p7, 0);

//添加签名者信息,

//x509:签名证书,pkey:签名者私钥。EVP_sha1()签名者摘要算法。

PKCS7_SIGNER_INFO* info = PKCS7_add_signature(p7, x509, pkey, EVP_sha1());

//添加签名者证书

PKCS7_add_certificate(p7, x509);

//添加签名者的CA证书链

for (int i=0; i<sk_X509_num(ca); i++)

{

     PKCS7_add_certificate(p7, sk_X509_value(ca, i));

}

BIO* p7bio = PKCS7_dataInit(p7, NULL);

BIO_write(p7bio, "How are you!", strlen("How are you!"));//加入原始数据,

PKCS7_dataFinal(p7, p7bio); //处理数据。

//转换为der编码输出

i2d_PKCS7(p7,&dertmp);

PKCS7_free(p7);

BIO_free(p7bio);

解析P7签名的代码:

//der编码转换为PKCS7结构体

PKCS7 * p7 =d2i_PKCS7(NULL,dertmp,derLen)

//解析出原始数据

BIO *p7bio= PKCS7_dataDecode(p7,NULL,NULL,NULL);

//从BIO中读取原始数据,将得到"How are you!"

srcLen = BIO_read(p7bio,src,1024);

//获得签名者信息stack

STACK_OF(PKCS7_SIGNER_INFO) *sk = PKCS7_get_signer_info(p7);

//获得签名者个数(本例只有1个)

int signCount = sk_PKCS7_SIGNER_INFO_num(sk );

for(int i=0;i

{

//获得签名者信息

PKCS7_SIGNER_INFO *signInfo = sk_PKCS7_SIGNER_INFO_value(sk,i);

//获得签名者证书

X509 *cert= PKCS7_cert_from_signer_info(p7,signInfo);

//验证签名

if(PKCS7_signatureVerify(p7bio,p7,signInfo,cert) != 1)

{

printf("signatureVerify Err\n");

}

}

转载于:https://www.cnblogs.com/Dennis-mi/articles/3239121.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将 PKCS#1 签名转换为 PKCS#7 签名可以按照以下步骤进行操作: 1. 首先,确保你已经正确引入了Bouncy Castle库。你可以在项目中添加BC库的JAR文件或者使用构建工具(如Maven)来添加依赖。 2. 导入所需的类: ```java import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; import org.bouncycastle.cms.CMSProcessableByteArray; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.cms.CMSSignedDataGenerator; import org.bouncycastle.cms.CMSTypedData; import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.PrivateKey; import java.security.Security; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; ``` 3. 添加BC作为安全提供者: ```java Security.addProvider(new BouncyCastleProvider()); ``` 4. 准备待签名的数据和私钥、证书: ```java byte[] dataToSign = <待签名的数据>; PrivateKey privateKey = <私钥>; X509Certificate certificate = <证书>; ``` 5. 创建 CMSSignedDataGenerator 对象并配置签名器: ```java CMSSignedDataGenerator generator = new CMSSignedDataGenerator(); JcaSignerInfoGeneratorBuilder signerInfoGeneratorBuilder = new JcaSignerInfoGeneratorBuilder( new BcDigestCalculatorProvider()) .setDirectSignature(true); generator.addSignerInfoGenerator( signerInfoGeneratorBuilder.build( new JcaContentSignerBuilder("SHA256withRSA") .setProvider("BC") .build(privateKey), certificate)); ``` 6. 使用 CMSSignedDataGenerator 对象进行签名: ```java CMSTypedData cmsData = new CMSProcessableByteArray(dataToSign); CMSSignedData signedData = generator.generate(cmsData, true); byte[] pkcs7Signature = signedData.getEncoded(); ``` 通过以上步骤,你可以将 PKCS#1 格式的签名转换为 PKCS#7 格式的签名。在代码示例中,我们使用 Bouncy Castle 提供的 CMSSignedDataGenerator 类来进行签名转换。首先,我们配置签名器的构建器,然后使用私钥和证书进行签名。最后,我们将签名结果编码为字节数组形式的 PKCS#7 签名。 请注意,以上代码仅为示例,具体实现可能会根据你的需求而有所不同。同时,确保你有正确的私钥和证书,并了解 PKCS#1 和 PKCS#7 的区别。 希望这可以帮到你!如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值