首先,我要介绍RSA验签的流程,稍后再分析为啥要这样做。 场景是存在(A)要传输数据给(B)。为方便起见,我们把数据称为(R)。 此时:A与B各自持有自己的privateKey,以及公之于众的publicKey(由RSA算法生成)。以下我们简称PVK(A)、PVK(B)、PUK(A)、PUK(B)。 A: ①使用某种算法给数据加密,通常会是MD5。我们得到密文M(R)。 ②A对M(R)使用PVK(A)加密,得到RSA(M(R))。 ③把RSA(M(R)) + R 这样的组合使用B公布的PUK(B)加密,得到最终的密文,简称F(R)。 B: ①B使用PVK(B)解密F(R)得到 RSA(M(R)) + R 到这一步,B已经拿到需要的R了,但是,他不知道R是否是A传来的,需要验签。 ②B使用A公布的PUK(A)解密RSA(M(R))得到M(R) ③B使用MD5算法对R加密,得到M(R),比较两个M(R)是否一致,若一致,则验签成功。
那么假如上述方案去掉几步,会不会就不能成功验签了呢? 那我们不妨做一些假设。假如我就是不法分子C,伪造数据与B通信。
场景①:A只用了PUK(B)加密,B用PVK(B)解密。也就是所有操作阉割得只剩1步。 C:因为PUK(B)是公之于众的,所以我把伪造数据C也使用PUK(B)加密即可。
场景②:A使用PUK(B)加密(M(R)+R)的密文,用于MD5校验,是否能阻止C呢? C:显而易见。我对(M(C)+C)使用PUK(B)加密,B解密后,依然无法验证C是否是正确的数据。
场景③:也就是按照上述流程,在M(R)上再套一层PVK(A)加密,会怎么样呢? C:因为C没有PVK(A),只有PVK(C),所以B用PUK(A)无法解密RSA(M(C)),识破了C的阴谋。
最简化版的是: A: ①对R做一些约定好的操作,生成R2。 ②使用MD5加密,得到M(R2)。 ③发送M(R2)+R
B: ①对R做相同的操作,生成R2。 ②使用MD5加密,得到M(R2)。 ③验证M(R2)是否相同,若相同,则验签成功。
但是这样的系统存在一些问题。 假如只有两个系统,那么没问题。但是假如有A、B、C、D、E、F等等,系统很多的话,他们之间的加密规则会变混乱,也许EF通信错转发数据给了A,A也顺利验签通过。所以我们需要给AB、AC、AD、AE、AF、BC …都建立一套新R约定的规则,过于麻烦。因此RSA此时就是这样一个规范且不需要额外记忆的规则。
因此我们在上述步骤中,对M(R2)再使用PVK(AB)加密,得到RSA(M(R2))。(验签始终使用PVK加密,这样不法分子C无法对数据伪造。) 这样,B端就可以使用和A约定好的PUK(AB)解密数据,再使用MD5验签了。
我总结一下RSA: ①假如传输数据不能被第三方看见,则用PUK加密。反过来,用什么都行。 ②验签只能使用PVK加密,这样才能防止伪造数据。 因此RSA很好理解,就是PVK加密用于防止伪造,再用PUK加密用来隐藏数据。