您的位置:首页 > 其它

PKCS#--加密,签名和证书概念简要介绍

2018-02-08 14:27 253 查看
 午休时,想起自己以前做的一个配置文件签名的例子.这里简单回顾一下几个基本概念!
(1)非对称密钥指的是一对密钥:私钥和公钥.
 私钥和公钥并无特别的区分,只是对外公布的密钥称为公钥,自己保留的称为私钥.这对密钥中,其中任何一个用来加密,可以使用另一个进行唯一解密.且相互之前无法推到得出.
 (2)加密分为两种情况:对称加密和非对称加密.两者用在不同的情况下.一般情况下,对称密钥适用于大量内容的加密.非对称密钥用于少量内容的加解密(主要考虑效率的问题,典型的应用为SSL).
 (3)数字签名指的是对信息摘要进行加密.一般分为两个步骤:摘要和加密.
 <1>首先对明文利用摘要算法抽出一段固定字节的摘要.关于摘要算法的几种性质,这里不做讨论.读者记住不可逆就可以了.

 <2>对上述摘要用自己的私钥加密.这个过程就称为签名.相当于打上了你的信息.别人也无法冒充你,同时你也无法抵赖哦.
 (4)证书指的是封装公钥,同时该公钥已经过公证了,有权威第三方证实过了.表明该公钥指的信任,所以无法假冒的.
情景假设:
 A给B发送信息.
<1>首先假设A,B都各自拥有了"对方"的公钥(这里的公钥之所以加了引号,表明公钥不一定真的是对方的,至少使用者是坚信这就是对方的)
<2>还有一个角色是第三方

 因为内容需要保密,故A用B的公钥加密,并发送给B.理论上讲B收到信息后,用自己的私钥解密就可以了.但是存在以下几个疑点:
第一:B如何确定这个是A发送过来的呢.
第二:A如何确定自己用于加密的对方的公钥就是B的呢.
第三:B如何确定自己持有的公钥就一定是A的呢.

 对于第一个问题:就要用到签名了.即发给B的信息上加上自己的签名.
A只需要使用sha256算法(一种摘要算法)对明文处理,抽出一段摘要.并用自己的私钥对这段摘要加密.
再把明文和签名一起用B的公钥加密.最后将这个加密信件发给B.(注意,这里的明文和签名可能经过特殊的封装.常见的标准是PKCS系列,如:PKCS7.这里一并封装了使用了何种摘要算法)
B收到信息后,使用自己的私钥解密,拿出两个东西:明文和签名.B用向指明的摘要算法对明文再做一次摘要处理得摘要1.然后用A的公钥解密签名,拿出摘要2..此时,B手里有两份摘要.B比较z这两份摘要.若一致.,则表明这个确实是A发送过来的.
以上都是在假定A和B手里的公钥都是对方的才正确!!
 对于第二和第三个疑点的处理为证书:通常A和B的公钥都通过了第三方(CA中心)公证过了.CA用自己的私钥签名过了.当然CA不可能处理全球这么多的公证需求.所以存在证书链一说.这里不讨论了.

 笔者参加工作的第一个任务就是对公司产品的配置文件签名.实现GUI上的下载和上传.
思路就是:
 首先使用openssl生成一对密钥.要求按照spec生成.然后自签名一个PKCS12格式证书.pkcs12证书封装了公钥和私钥.不过这里的私钥还需要手动设置一段密码,加密.不用担心这里的私钥的安全性.这里主要考虑到私钥需要存放在产品中,已方便用户上传配置文件时进行解签名.
 设计的一对签名/解签API是基于openssl库完成.openssl本身存在一对API实现pkcs7格式的签名.所以,只要相应的处理一下即可.
   GUI上面的处理比较简单了,用json实现backup和restore两步就可以了.这里不讨论了.具体的code不方便贴出来.有需要的给我留言.
谢谢~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: