RSA数字签名 及 数字证书 原理
在学习安卓逆向过程中,修改了apk文件后遇到有”签名不一致”不能直接安装的情况,就去B站回顾了一下数字签名原理以及数字证书的不可伪造性,下文便是这次学习的一个小记录📝
免得之后忘了又要重新看一遍视频QAQ
RSA数字签名
RSA算法可以总结为四句话:公钥加密、私钥解密、私钥签名、公钥验签。加密是防止信息泄露,而签名是为了防止信息被篡改。
RSA数字签名场景如下图
生成密钥对:小明利用RSA算法生成公钥和私钥。
生成公钥和私钥过程如下:
- 选择两个大质数 p 和 q,计算 n = p * q,然后计算欧拉函数 φ(n) = (p-1)(q-1)。接下来,选择一个整数 e,使得 e 和 φ(n) 互质。最后,计算出 d,使得 e * d ≡ 1 (mod φ(n))。公钥为 (e, n),私钥为 (d, n)
生成消息摘要:在对文件进行签名前,要先对文件进行hash处理,生成固定长度的消息摘要H
对消息摘要进行签名:使用私钥(d, n)对消息进行签名。H^d mod n≡S,至此完成了对文件的数字签名
发布:将公钥(e, n)、文件、数字签名S,发布到互联网
验证签名:小红使用公钥(e, n)对签名S进行验证运算S^e mod n≡H’,将结果与文件的hash进行对比。若文件没有被篡改,则对比结果一致,签名有效;若文件被篡改,则对比结果不一致,签名无效。
上述流程是在确保公钥、文件、数字签名等信息都是由小明所提供的前提下,即文件是由小明签署的。但往往有不怀好意的人,他可以自己生成密钥对,将修改后带有恶意内容的文件进行签名,并发送到互联网。这时小红获取到坏人所提供的公钥、文件、数字签名用于验证,结果会显示签名是有效的,但真实情况却是小红得到的是一份被篡改过的文件。
那么如何确保该文件是由小明本人签署的呢?
那就需要下文讲到的数字证书技术来解决了
数字证书
上述RSA签名算法中主要的问题是公钥的可信问题,不能证明公钥是属于小明的,利用数字证书就能解决公钥的可信问题。
数字证书获取流程:
- 小明将公钥即部分个人身份信息发送给某个权威公正的证书颁发(Certificate Authority简称CA)机构
- CA机构核实小明身份后,将颁发一个数字证书,该证书包含小明的身份信息和其公钥数据
小明将得到的数字证书和签名放在文件中一并发布到互联网,这样小红就能放心使用证书中的公钥来验证签名了。若坏人将文件(例如apk)内容进行改变,重新签名发给小红,小红利用已有小明的可信公钥(小红之前安装了小明的文件,有小明的证书)验证时便会失败,即签名无效。
数字证书的不可伪造性
到这里我们还会有一个问题,为什么数字证书就能信任了呢,数字证书不会被伪造吗?
答案是不会,数字证书不会被伪造。
为什么?因为数字证书是经过CA机构数字签名的,CA机构自己也有一套公钥私钥,用私钥对小明身份信息及其公钥数据进行数字签名,并放在数字证书中。
用户如何验证CA签署的数字签名呢?用户的电脑或手机系统里都预先默认安装了根证书(杜绝CA机构公钥被伪造的可能),根证书里记录了可以信赖的CA机构信息及其公钥。通过CA机构公钥就可以验证数字证书里的数字签名,从而确保了数字证书的不可伪造性。
这样一来,坏人无法将文件中的证书进行伪造,也就是说坏人的公钥无法得到小红的信任。
小结
数字签名的主要目的是为了验证apk文件的完整性。它通过使用开发者的私钥对apk文件进行签名,然后使用相应的公钥进行验证。这样,系统就可以确保apk文件没有被篡改,并且来自可靠的来源。
数字证书则包含了开发者的公钥和其他元数据,确定来源的可靠性。