X.509,RSA,PKCS 普及
X.509
X.509是一种非常通用的证书格式。所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用。
在一份证书中,必须证明公钥及其所有者的姓名是一致的。对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。X.509标准定义了证书中应该包含哪些信息,并描述了这些信息是如何编码的(即数据格式)
详细特征
所有的X.509证书包含以下数据:
1、X.509版本号:指出该证书使用了哪种版本的X.509标准,版本号会影响证书中的一些特定信息。目前的版本是3。
2、证书持有人的公钥:包括证书持有人的公钥、算法(指明密钥属于哪种密码系统)的标识符和其他相关的密钥参数。
3、证书的序列号:由CA给予每一个证书分配的唯一的数字型编号,当证书被取消时,实际上是将此证书序列号放入由CA签发的CRL(Certificate Revocation List证书作废表,或证书黑名单表)中。这也是序列号唯一的原因。
5、证书的有效期:证书起始日期和时间以及终止日期和时间;指明证书在这两个时间内有效。
6、认证机构:证书发布者,是签发该证书的实体唯一的CA的X.500名字。使用该证书意味着信任签发证书的实体。(注意:在某些情况下,比如根或顶级CA证书,发布者自己签发证书)
7、发布者的数字签名:这是使用发布者私钥生成的签名,以确保这个证书在发放之后没有被撰改过。
8、签名算法标识符:用来指定CA签署证书时所使用的签名算法。算法标识符用来指定CA签发证书时所使用的公开密钥算法和HASH算法。
证书结构
扩展文件
RSA算法
RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
会话密钥
当我们在进行通信的时候,常常需要在C/S两端分配一个会话密钥,然后利用对称密码算法对通信的数据加密,当然了,也可以使用非对称加密算法,但是非对称加密会使加密速度降低了一个数量级,因此并不适用。那么如何安全的在不安全的信道中分发会话密钥呢?
有两种方式,一种使用共享密钥机制,这样的协议很多,比如D-H密钥分配协议、kerberos认证协议等等。但是使用共享密钥进行会话密钥的分发很麻烦,而且还有各种漏洞。作为工程人员,我们当然不希望进行复杂的多次协商才能完成认证的工作。
那么使用公开密钥机制就可以完成这个工作了。
1、首先A获取B的公钥Eb,然后A随机选择一个随机数Ra,然后将Eb(A,Ra)发送给B。
2、B获取到数据之后,利用自己的私钥解密出结果为A,Ra,然后B获取A的公钥Ea,然后B选择一个会话密钥Ks和一个随机数Rb并将数据Ea(Ra,Ks,Rb)发送给A。
3、A在收到数据之后,使用自己私钥后发现有Ra,这个数据是刚刚发给B的,Ra除了B不可能有任何知道,因为只有B才能解密。所以A确定他对面肯定是B,但是这时候B并不确定对面是不是A,还是H,因为H可以宣称自己是A,所以最好的验证方法是B确定A肯定能够解密发送给A的数据。
4、于是A 在上面收到数据之后,解密之后发现有Rb,和Ks,此时将数据Ks(Rb)发送给B。当然了,此时,B肯定知道它对面通信的是A了,于是这样就完成了相互认证,并分发共享密钥的操作。
那么为什么最后一步不是Eb(Rb),而要Ks(Rb)呢?我个人认为主要有两点:1、Eb是公开的,前者的随机性相当于只有Rb来保证,而后者Ks和Rb只有A才会知道,所以随机性更大;2、还是一样,对称密码算法速度会更快