pkcs5 pkcs7#5和pkcs5 pkcs7#7填充的区别

2014年3月 C++ Builder大版内专家分月排行榜第二2014年1月 C++ Builder大版内专家分月排行榜第二2013年12月 C++ Builder大版内专家分月排行榜第二2013年8月 C++ Builder大版内专家分月排行榜第二2013年7月 C++ Builder大版内专家分月排行榜第二2013年4月 Delphi大版内专家分月排行榜第二
2013年11月 C++ Builder大版内专家分月排行榜第三2013年9月 C++ Builder大版内专家分月排行榜第三2013年6月 C++ Builder大版内专家分月排行榜第三2013年3月 Delphi大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。关于openssl pkcs7 数字信封的问题 - 开源中国社区
当前访客身份:游客 [
当前位置:
以下是我生成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= &&&
&&& 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,* &&&
&&& int derLen = i2d_PKCS7(p7,NULL); &&& der& = (unsigned char*)malloc(derLen); &&& derTmp = &&& //转换为der编码输出 &&& derLen = i2d_PKCS7(p7,&derTmp); &&&
&&& BIO_free(p7bio); &&&
&&& PKCS7_free(p7);&&&&
&&& //解P7数字信封的代码: &&&
&&& //der编码转换为PKCS7结构体 &&& int derP7EnvelopedDataLen = derL &&& 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); &&&
共有5个答案
<span class="a_vote_num" id="a_vote_num_
这么没人回复呀。。。希望高手帮看下哦!
--- 共有 1 条评论 ---
兄弟这个解决没?
(4年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
我的搞定了
& BIO_write(p7bio,instr,strlen(instr)); &&& printf(&instr = %s&,instr);
&&&&BIO_flush(p7bio); //添加这个,作用应该是将文件指针指向开始 &&& //完成数字信封的运算 &&&& &&& PKCS7_dataFinal(p7, p7bio);
<span class="a_vote_num" id="a_vote_num_
嗯嗯,解决啦,非常感谢!
<span class="a_vote_num" id="a_vote_num_
引用来自“潇雪53”的答案 我的搞定了
& BIO_write(p7bio,instr,strlen(instr)); &&& printf(&instr = %s&,instr);
&&&&BIO_flush(p7bio); //添加这个,作用应该是将文件指针指向开始 &&& //完成数字信封的运算 &&&& &&& PKCS7_dataFinal(p7, p7bio); BIO_flush的功能理解错了
该函数用来将BIO内部缓冲区的数据都写出去,有些时候,也用于为了根据EOF查看是否还有数据可以写。调用成功的时候该函数返回1,失败的时候返回0或-1。之所以失败的时候返回0或者-1,是为了标志该操作是否需要稍后以跟BIO_write()相同的方式重试。这时候,应该调用BIO_should_retry()函数,当然,正常的情况下该函数的调用应该是失败的。
看了上面这段话,我表示还是没弄清楚作用是什么
--- 共有 1 条评论 ---
你好 请问你还有没有OpenSSL实现的PKCS#7消息信封 签名的实例代码吗 可不可以发给我一份
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
你好!!!请问一下封装为数字信封是怎么封装的???谢谢!!!
更多开发者职位上
有什么技术问题吗?
类似的话题4541人阅读
都是&#26684;式。
x509,公钥证书,只有公钥。
p7,签名或加密。可以往里面塞x509,同时没有签名或加密内容。
p12,含有私钥,同时可以有公钥,有口令保护。
p7的作用就是电子信封。
X509是基本规范
P7和P12是两个实现规范,P7是数字信封,P12是带有私钥的证书规范。
x509是数字证书的规范,P7和P12是两种封装形式。比如说同样的电影,有的是avi&#26684;式,有的是mpg,大概就这个意思。
P7一般是把证书分成两个文件,一个公钥一个私钥,有PEM和DER两种编码方式。PEM比较多见,就是纯文本的,P7一般是分发公钥用,看到的就是一串可见字符串,扩展名经常是.crt,.cer,.key等。DER是二进制编码。
P12是把证书压成一个文件,.pfx&。主要是考虑分发证书,私钥是要绝对保密的,不能随便以文本方式散播。所以P7&#26684;式不适合分发。.pfx中可以加密码保护,所以相对安全些。
在实践中要中,用户证书都是放在USB&Key中分发,服务器证书经常还是以文件方式分发。服务器证书和用户证书,都是X509证书,就是里面的属性有区别。
X509&是证书规范
PKCS#7&是消息语法&(常用于数字签名与加密)
PKCS#12&个人消息交换与打包语法&(如.PFX&.P12)打包成带公钥与私钥
还有其它常用的是PKCS#10&是证书请求语法。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:808695次
积分:9365
积分:9365
排名:第1420名
原创:79篇
转载:809篇
评论:83条
(3)(5)(42)(46)(105)(81)(67)(37)(4)(1)(12)(12)(24)(28)(69)(32)(34)(20)(1)(7)(10)(13)(36)(1)(2)(12)(21)(6)(8)(16)(1)(11)(4)(3)(6)(4)(2)(2)(2)(3)(4)(3)(2)(1)(5)(4)(1)(6)(6)(4)(2)(6)(5)(7)(1)(7)(15)(5)(1)(16)(5)& 今日用了一个不知名的crasign来给签名,比较奇怪期p7 的扩展名,就补了下课。
& 首先从大局来看:
& &X509 是证书规范
& &PKCS#7 是消息语法
(常用于数字签名与加密)
&&具体来说:
CA中心普遍采用的规范是X.509[13]系列和PKCS系列,其中主要应用到了以下规范:
& 1.X.209(1988)&
ASN.1原来是作为X.409的一部分而开发的,后来才独立地成为一个标准。这两个协议除了在PKI体系中被应用外,还被广泛应用于通信和计算机的其他领域。&
& 2.X.500(1993)&
X.500是一套已经被国际标准化组织(ISO)接受的目录服务系统标准,它定义了一个机构如何在全局范围内共享其名字和与之相关的对象。X.500是层次性的,其中的管理域(机构、分支、部门和工作组)可以提供这些域内的用户和资源信息。在PKI体系中,X.500被用来惟一标识一个实体。&
&3.X.509(1993)&
X.509是由国际电信联盟(ITU-T)制定的数字证书标准。在X.500确保用户名称惟一性的基础上,X.509为X.500用户名称提供了通信实体的鉴别机制,并规定了实体鉴别过程中广泛适用的证书语法和数据接口。&
&4.PKCS系列标准&
PKCS是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。到1999年底,PKCS已经公布了以下标准:&
PKCS#1:定义RSA公开密钥算法加密和签名机制,主要用于组织PKCS#7中所描述的数字签名和数字信封。&
PKCS#3:定义Diffie-Hellman密钥交换协议。&
PKCS#5:描述一种利用从口令派生出来的安全密钥加密字符串的方法。使用MD2或MD5
从口令中派生密钥,并采用DES-CBC模式加密。主要用于加密从一个计算机传送到另一个计算机的私人密钥,不能用于加密消息。&
PKCS#6:描述了公钥证书的标准语法,主要描述X.509证书的扩展格式。&
PKCS#7:定义一种通用的消息语法,包括数字签名和加密等用于增强的加密机制,PKCS#7与PEM兼容,所以不需其他密码操作,就可以将加密的消息转换成PEM消息。&
PKCS#8:描述私有密钥信息格式,该信息包括公开密钥算法的私有密钥以及可选的属性集等。&
PKCS#9:定义一些用于PKCS#6证书扩展、PKCS#7数字签名和PKCS#8私钥加密信息的属性类型。&
PKCS#10:描述证书请求语法。&
PKCS#11:称为Cyptoki,定义了一套独立于技术的程序设计接口,用于智能卡和PCMCIA卡之类的加密设备。&
PKCS#12:描述个人信息交换语法标准。描述了将用户公钥、私钥、证书和其他相关信息打包的语法。&
PKCS#13:椭圆曲线密码体制标准。&
PKCS#14:伪随机数生成标准。&
& & PKCS#15:密码令牌信息格式标准。
&5.OCSP在线证书状态协议&
& & OCSP(Online Certificate
Protocol)[14]是IETF颁布的用于检查数字证书在某一交易时刻是否仍然有效的标准。该标准提供给PKI用户一条方便快捷的数字证书状态查询通道,使PKI体系能够更有效、更安全地在各个领域中被广泛应用。
& &6.LDAP
轻量级目录访问协议&
&LDAP规范(RFC1487)简化了笨重的X.500目录访问协议,并且在功能性、数据表示、编码和传输方面都进行了相应的修改。1997年,LDAP第3版本成为互联网标准。目前,LDAP
v3已经在PKI体系中被广泛应用于证书信息发布、CRL信息发布、CA政策以及与信息发布相关的各个方面。
&看完以后,是否觉得,这一套怎么这么烦,有了新的老的还的复习!
&查看 PKCS #7 文件中的证书的方法:
&应用到: Windows 7, Windows Server 2008
&打开 Windows 资源管理器。
& &找到包含要查看的证书的 PKCS #7
& &在详细信息窗格中,双击 PKCS #7
& &在控制台树中,双击包含 PKCS #7
文件的文件夹,然后单击“证书”。此时 PKCS #7
文件中所包含的证书将显示在详细信息窗格中,若要打开“证书”管理单元,请参阅将“证书”管理单元添加到 MMC。
&如果意犹未尽,看段代码就肯定明白:
&当然如果你恰好也要用这个苦逼程序,可能会疑惑,那签名用的xxx来之哪里,看help:
crasign [-d
digest=md5|sha1|sha224|sha256|sha384|sha512|ripemd160] [-k
chain=/etc/keys.d/private/sok.crk&sig.crk] [-c
cert=/etc/keys.d/certs/sigcert.pem] [-a addcerts] filename ..
///java 代码
通过bouncycastle的CMSSignedData可以实现pkcs#7格式签名数据的验证,利用CMSSignedData生成pkcs#7格式签名数据。由于pkcs#7里面包含了原文和证书信息,所以参数只需要签名值即可。代码如下:
public boolean SignedData_Verify(byte[] SignedData)
&&&&&&&&&&&&&
boolean verifyRet =
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
// 新建PKCS#7签名数据处理对象
&&&&&&&&&&&&&&&&&&&&
CMSSignedData sign = new
CMSSignedData(signedData);
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
// 添加BouncyCastle作为安全提供
Security.addProvider(new&
org.bouncycastle.jce.provider.BouncyCastleProvider());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
// 获得证书信息
&&&&&&&&&&&&&&&&&&&&
CertStore certs = sign.getCertificatesAndCRLs("Collection",
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
// 获得签名者信息
&&&&&&&&&&&&&&&&&&&&
SignerInformationStore signers =
sign.getSignerInfos();
&&&&&&&&&&&&&&&&&&&&
Collection c = signers.getSigners();
&&&&&&&&&&&&&&&&&&&&
Iterator it = c.iterator();
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
// 当有多个签名者信息时需要全部验证
&&&&&&&&&&&&&&&&&&&&
while (it.hasNext()) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&
SignerInformation signer = (SignerInformation)
it.next();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
Collection certCollection =
certs.getCertificates(signer
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.getSID());
&&&&&&&&&&&&&&&&&&&&&&&&&&&
Iterator certIt = certCollection.iterator();
&&&&&&&&&&&&&&&&&&&&&&&&&&&
X509Certificate cert = (X509Certificate)
certIt.next();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
// 验证数字签名
&&&&&&&&&&&&&&&&&&&&&&&&&&&
if (signer.verify(cert.getPublicKey(), "BC")) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
verifyRet =
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
verifyRet =
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
catch (Exception e) {
&&&&&&&&&&&&&&&&&&&&
verifyRet =
&&&&&&&&&&&&&&&&&&&&
e.printStackTrace();
&&&&&&&&&&&&&&&&&&&&
System.out.println("验证数字签名失败");
&&&&&&&&&&&&&
&&&&&&&&&&&&&
return verifyR
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 pkcs7填充 的文章

 

随机推荐