Openssl之PEM系列

1.PEM编码文件结构介绍 
PEM全称是Privacy Enhanced Mail,该标准定义了加密一个准备要发送邮件的标准,主要用来将各种对象保存成PEM格式,并将PEM格式的各种对象读取到相应的结构中。它的基本流程是这样的: 1. 信息转换为ASCII码或其它编码方式; 2. 使用对称算法加密转换了的邮件信息; 
3. 使用BASE64对加密后的邮件信息进行编码; 
4. 使用一些头定义对信息进行封装,这些头信息格式如下(不一定都需要,可选的): 
Proc-Type,4:ENCRYPTED   
 DEK-Info: cipher-name, ivec其中,第一个头信息标注了该文件是否进行了加密,该头信息可能的值包括ENCRYPTED(信息已经加密和签名)、MIC-ONLY(信息经过数字签名但没有加密)、MIC-CLEAR(信息经过数字签名但是没有加密、也没有进行编码,可使用非PEM格式阅读)以及CLEAR(信息没有签名和加密并且没有进行编码,该项好象是openssl自身的扩展,但是并没有真正实现);;第二个头信息标注了加密的算法以及使用的ivec参量,ivec其实在这儿提供的应该是一个随机产生的数据序列,与块加密算法中要使用到的初始化变量(IV)不一样。 
5. 在这些信息的前面加上如下形式头标注信息: 
-----BEGIN PRIVACY-ENHANCED MESSAGE----- 在这些信息的后面加上如下形式尾标注信息: -----END PRIVACY-ENHANCED MESSAGE----- 
上面是openssl的PEM文件的基本结构,需要注意的是,Openssl并没有实现PEM的全部标准,它只是对openssl中需要使用的一些选项做了实现,详细的PEM格式,请参考RFC1421-1424。 
下面是一个PEM编码的经过加密的DSA私钥的例子: -----BEGIN DSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,F80EEEBEEA7386C4  
GZ9zgFcHOlnhPoiSbVi/yXc9mGoj44A6IveD4UlpSEUt6Xbse3Fr0KHIUyQ3oGnSmClKoAp/eOTb5Frhto85SzdsxYtac+X1v5XwdzAMy2KowHVk1N8A5jmE2OlkNPNtof132MNlo2cyIRYaa35PPYBGNCmUm7YcYS8O90YtkrQZZTf4+2C4kllhMcdkQwkrFWSWC8YOQ7w0LHb4cX1FejHHom9Nd/0PN3vn3UyySvfOqoR7nbXkrpHXmPIr0hxXRcF0aXcV/CzZ1/nfXWQf4o3+oD0T22SDoVcZY60IzI0oIc3pNCbDV3uKNmgekrFdqOUJ+QW8oWp7oefRx62iBfIeC8DZunohMXaWAQCU0sLQOR4yEdeUCnzCSywe0bG1diD0KYaEe+Yub1BQH4aLsBgDjardgpJRTQLq0DUvw0/QGO1irKTJzegEDNVBKrVnV4AHOKT1CUKqvGNRP1UnccUDTF6miOAtaj/qpzra7sSk7dkGBvIEeFoAg84kfh9hhVvF1YyzC9bwZepruoqoUwke/WdNIR5ymOVZ/4Liw0JdIOcq+atbdRX08niqIRkfdsZrUj4leo3zdefYUQ7w4N2Ns37yDFq7 
-----END DSA PRIVATE KEY----- 

有时候PEM编码的东西并没有经过加密,只是简单进行了BASE64编码,下面是一个没有加密的证书请求的例子


-----BEGIN CERTIFICATE REQUEST----- 
MIICVTCCAhMCAQAwUzELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEMMAoGA1UEAxMDUENBMIIBtTCCASkGBSsOAwIMMIIBHgKBgQCnP26Fv0FqKX3wn0cZMJCaCR3aajMexT2GlrMV4FMuj+BZgnOQPnUxmUd6UvuF5NmmezibaIqEm4fGHrV+hktTW1nPcWUZiG7OZq5riDb77Cjcwtelu+UsOSZL2ppwGJU3lRBWI/YV7boEXt45T/23Qx+1pGVvzYAR5HCVW1DNSQIVAPcHMe36bAYD1YWKHKycZedQZmVvAoGATd9MA6aRivUZb1BGJZnlaG8w42nh5bNdmLsohkj83pkEP1+IDJxzJA0gXbkqmj8YlifkYofBe3RiU/xhJ6h6kQmdtvFNnFQPWAbuSXQHzlV+I84W9srcWmEBfslxtU323DQph2j2XiCTs9v15AlsQReVkusBtXOlan7YMu0OArgDgYUAAoGBAKbtuR5AdW+ICjCFe2ixjUiJJzM2IKwe6NZEMXg39+HQ1UTPTmfLZLps+rZfolHDXuRKMXbGFdSF0nXYzotPCzi7GauwEJTZyr27ZZjA1C6apGSQ9GzuwNvZ4rCXystVEagAS8OQ4H3D4dWS17Zg31ICb5o4E5r0z09o/Uz46u0VoAAwCQYFKw4DAhsFAAMxADAuAhUArRubTxsbIXy3AhtjQ943AbNBnSICFQCu+g1iW3jwF+gOcbroD4S/ZcvB3w== 
-----END CERTIFICATE REQUEST----- 



可以看到,该文件没有了前面两个头信息。大家如果经常使用openssl的应用程序,就对这些文件格式很熟悉了。 
2.PEM类型和实现结构介绍 
openssl中定义的PEM相关结构体如下(openssl\pem.h),这些结构体是所有PEM系列函数的基础。 下面定义的是PEM一个高层应用结构,该结构通过PEM_SealInit进行初始化,最后使用PEM_SealFinal进行释放,该结构定义了PEM中要使用的编码算法、信息摘要算法以及加密算法。 
typedef struct PEM_Encode_Seal_st { 
EVP_ENCODE_CTX encode; EVP_MD_CTX md; 
EVP_CIPHER_CTX cipher; } PEM_ENCODE_SEAL_CTX; 
下面定义了PEM_CTX中的一个子结构,用来保存用户的信息 typedef struct pem_recip_st { 
char *name; 
X509_NAME *dn; int cipher; int key_enc; } PEM_USER; 
下面是PEM主结构体PEM_CTX结构的定义,我们将在注释里面对必要的参数进行说明。 typedef struct pem_ctx_st { 
int type;//结构类型 struct { 
int version;//版本号 int mode;//编码方式 
} proc_type;//Proc_Type字段信息,包括版本号和编码方式 char *domain; 


未完待整理。。。http://wenku.baidu.com/link?url=bQ6a-dI3jRhmj2WYDkvNkgiSKc4K1Wj5pn63V5V1aPOVdBiXWLfqOkoTaJJNshWWoGjdIRx1GTNGBpZ5f64_gVIwQ7b2TfUwYNCcl14HfPK

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值