公私钥加解密、加签、验签是在与各类银行、第三方机构进行对外通讯中,必然涉及一些知识。PS:我这里提到的密钥概念可以理解为一个String串就行(也有二进制形式的,同理),比如你把.cer文件以文本方式打开其实就是一个String串而已。
首先我们讨论下加密方式的分类:对称加密和非对称加密。
1、 对称加密:也就是加密和解密所使用的密钥是同一个,常用到的有AES、DES、3DES等等,这类加密方式容易理解,不过多赘述。
2、 非对称加密:加密和解密所使用的密钥是一对,也就是两个,若A、B是一对密钥,那么加密使用A则解密只能使用B,加密使用B则解密只能使用A。这也就是公私钥的原型。
接下来我们来说公私钥分别是用来干嘛的,通常我们说公钥用来加密,私钥用来解密,但其实这不是必须的,对于程序而言,你用什么加密,用什么解密并不重要,只要是一对就行。所以也可以用私钥来加密,公钥来解密。那为什么我们不这么用呢?我们先来看看公私钥的定义,公钥,如字面意思,就是公开的、甚至可以发布在网上的密钥,每个人都可以拿到它,称之为公钥;私钥则相反,只有一个人能拥有,并且是保密的。那么问题就解决了,如果你拿着私钥加密,发出去的信息地球人都能解开,那……,但是如果用公钥加密,发出去的信息只有你一个人能解开,那就是有意义的,,没毛病吧。所以结论就是:公钥加密,私钥解密。
加解密问题解决了,但是网络通讯远没有这么简单,报文信息被黑客拦截了怎么办?拦截后黑客替换成他的报文,还能用公钥继续加密发出去,那不就完了,所以我们还需要个方式来验证发送方的身份,也就是我们经常听说的数字签名。
数字签名和加解密不同,是对一段信息做hash算法(MD5,RSA等)运算,生成唯一标识该信息的一个特征串,比如你小时候背课文,背完让家长签名(加签),然后第二天老师检查签名(验签),老师就会认为你完成了作业。老师认为该签名唯一且只能由你家长生成,所以认同你背过课文。(虽然你可以模仿)。
那么我们要做的就是对我们的密文信息再进行一次签名,将签名得到的签名特征串附在原文后,那么对方接收到报文以后,如果能验签通过,那就能确定消息是你发的了。
确定了数字签名的作用了,我们分析下到底是公钥加签呢还是私钥加签呢?如果你用公钥签名,那么地球人都能签出一样的特征串,而只有一个人能验签,那又陷入僵局……,但如果用私钥签名,那么只有你一个人能唯一签出该特征串,地球人都能验签,那就都能确定该信息是你发出的,很权威有不有!所以结论就是:私钥加签,公钥验签。
所以一般来说,如果用到的是非对称加密,那么你和第三方之间就有两对公私钥,各自持有对方的公钥和自己的私钥。网络通讯中我们一般用自己的私钥加签,将报文用第三方提供的公钥将报文中涉及安全隐私的部分加密,然后第三方会用我们提供公钥进行验签,验签通过后再用他们自己的私钥将报文加密部分解密。如果还需要响应返回,那么他们还将重复一遍我们这边的过程,我们这边也需要重复一边他们那边的过程,用他们提供的公钥验签返回回来的报文,并用自己的私钥解密隐私部分。这里又有个问题,既然公钥是公开的,你如何确定这个公钥是你的而不是别人的?这样一想,其实就变成了一个循环,没法证明绝对安全,鸡生蛋蛋生鸡的问题。
其实在密码学中也是这样,你必须建立一个信赖点,不然任何都是无法信赖的。所以在此基础上,出现了一个可信任的第三方认证中心(CA),CA把你的公钥进行认证,并颁发一个数字证书给到你,该证书里面包含了你的公钥,而你给别人的公钥也替换成数字证书,别人拿到数字证书,看了下,确实是CA签发的,那么这里面的公钥就是你的,你是可信的。这里就又把大家所迷惑的一个概念理清楚了,证书就是经过认证的公钥。
总结:
- 既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;
- 同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验签。
更多公钥证书与公钥的区别详情请参见 普通公钥与公钥证书区别(支付宝)。
下面为本人在实际工作中写的一些代码方法,仅供参考:
根据私钥证书路径获取私钥:
根据公钥证书路径获取公钥:
根据私钥产生数据签名(加签):
根据公钥验签:
根据公钥进行加密:
根据私钥进行解密:
原文链接:https://blog.csdn.net/qq_32632367/article/details/82704568