关于公钥私钥是否可以互相加解密的理解(附苹果开发者证书配置时非对称加密算法的应用)

Posted zzx-hjl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于公钥私钥是否可以互相加解密的理解(附苹果开发者证书配置时非对称加密算法的应用)相关的知识,希望对你有一定的参考价值。

查资料的时候发现很多人有疑惑,公钥和私钥到底哪个是用来加密,哪个是用来解密的,是否可以公钥加密私钥解密,同时也可以私钥加密公钥解密呢?针对这一问题,说下自己的理解。

首先要明确两个问题:(1)既可以公钥加密私钥解密,也可以私钥加密公钥解密;(2)加密解密和签名验证是两个不同的概念。

(一)先来说加密解密:需要同时使用公钥和私钥的加密算法是非对称加密,最常见的便是RSA。
举例说明非对称加密:如果A想要给B秘密的发一条信息,只需要B创建一套公钥(盒子)和私钥(钥匙),盒子可以随意分发,但是钥匙只能B自己所有,当A想要给B发信息时,只需要把信息(纸条)通过B的公钥加密(放入盒子里锁上),再由B用私钥(钥匙)进行解密(打开盒子),即可获取A发送的信息。此时如果C想要截取信息,但是由于没有B的私钥,C即使拿到了信息也无法解密(只有盒子没有钥匙),从而保证了数据的安全性。
那么B是否可以通过私钥加密信息,然后由A使用公钥解密信息呢?从原理上讲,是可以的。 非对称密钥是可以用于双向加解密的。但是我们为什么不这么用呢,很好理解,因为所谓公钥,是公开的,不只A一个人拥有,因此虽然A能够正常读取到信息,但是其他人也可以解密该条信息,从而无法保证信息的安全性。但是签名验证就不同了。

(二)签名验证:用私钥进行签名,用公钥进行验证,从而保证信息来源是私钥拥有者。
举例说明:A想要让B确认某条信息是由自己发出的,先将自己的公钥发送给B,然后用自己的私钥对信息进行签名并发送给B(比如将字符串X用A的私钥加密生成Y,将X和Y以及信息都发送给B),B收到信息后用A的公钥对签名进行验证,用A的公钥解密Y得到Z,如果Z=X,则验证成功,说明信息是由A发布的。

(三)最后借用百度百科的例子来说明加密和签名的结合应用:

假如现在 Alice 向 Bob 传送数字信息,为了保证信息传送的保密性、真实性、完整性和不可否认性,需要对传送的信息进行数字加密和签名,其传送过程为:
1.Alice 准备好要传送的数字信息(明文);
2.Alice 对数字信息进行哈希运算,得到一个信息摘要;
3.Alice 用自己的私钥对信息摘要进行加密得到 Alice 的数字签名,并将其附在数字信息上;
4.Alice 随机产生一个加密密钥,并用此密码对要发送的信息进行加密,形成密文;
5.Alice 用 Bob 的公钥对刚才随机产生的加密密钥进行加密,将加密后的 DES 密钥连同密文一起传送给Bob;
6.Bob 收到 Alice 传送来的密文和加密过的 DES 密钥,先用自己的私钥对加密的 DES 密钥进行解密,得到 Alice随机产生的加密密钥;
7.Bob 然后用随机密钥对收到的密文进行解密,得到明文的数字信息,然后将随机密钥抛弃;
8.Bob 用 Alice 的公钥对 Alice 的数字签名进行解密,得到信息摘要;
9.Bob 用相同的哈希算法对收到的明文再进行一次哈希运算,得到一个新的信息摘要;
10.Bob 将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。

(四)苹果开发者证书配置时非对称加密算法的应用
我们在进行ios开发时,配置证书的过程其实也是使用了非对称加密算法:
我们在配置证书前,需要先在MAC上通过keychain生成CSR(Certificate Signing Requese)文件,该文件包含开发者身份信息和开发者电脑的公钥,而私钥始终保存在MAC中,用于签名本机对外发布的APP
接下来将该CSR文件上传至APPLE DEVELOPER网站,苹果会用苹果的私钥对其进行签名(授权),从而生成证书
我们在进行APP打包时,会使用开发者的私钥对应用进行签名
同时被苹果签名的证书(经过苹果私钥签名、并含有开发者公钥)会包含在描述文件(Provisioning File)中,并在应用被安装时拷贝到IOS设备中
IOS设备中含有苹果的公钥,可以对证书进行验证,证明该应用得到了苹果的授权
接下来IOS设备会通过证书中开发者的公钥对APP的签名进行验证

但是我认为苹果对于APP的签名和验证不止于此,因为我们之前的APP存在着一台电脑打包的IPA在另一台电脑使用同样证书发布过IPA后就不能使用的情况。如果对签名的验证都是在IOS设备本地执行的,即使APPLE DEVELOPER上的证书发生了变化,也不应该影响到APP的使用。因此我认为苹果还会在打开APP时将本地的签名使用网站证书中的公钥进行验证,如果失败则会闪退。

以上是关于关于公钥私钥是否可以互相加解密的理解(附苹果开发者证书配置时非对称加密算法的应用)的主要内容,如果未能解决你的问题,请参考以下文章

php RSA加密传输代码示例(轉)

理解两种加密方式中私钥和公钥的概念

数字签名 数字证书

关于RSA中公钥和私钥的具体使用情况区分

加解密总结(附助手类)

[转]关于JAVA中RSA加签解签,私钥加密公钥解密和公钥加密私钥解密代码详解