RSA签名及验签原理解析及使用
1.原理
1.1 名词解释
公钥
RSA 密钥体系中对外公开的部分,通常用于数据加密、验证数字签名。
私钥
RSA 密钥体系中非公开的部分,通常用于数据解密、数据签名。
数字签名
就是只有信息的发送者才能产生的,别人无法伪造的一段数字串,它同时也是对发送者发送的信息的真实性的一个证明。
1.2 为什么要使用签名
在系统间报文交互为保证上送报文可靠性[防止中间人攻击],通常做法是在报文中加上校验字[数字签名],并约定好相关算法。
1.3 实现
为方便系统间交互,本文直接讲述原理,对于RSA_sign 及 RSA_verify的使用下期进行介绍。
1.3.1 签名
对需要上送的报文[en_data]计算特征值[sign_block],相关算法包括[md5、sha1、sha256、sha512等等]。
使用私钥[pri_key]对sign_block加密获得数字签名[sign]。
将sign与en_data打包发送给对方。
1.3.2 验签
解析收到的报文,拆分为sign 及 en_data。
对en_data计算特征值[sign_block],相关算法包括[md5、sha1、sha256、sha512等等双方协商]。
使用公钥[pub_key]对sign解密,获得sign_block1。
比较sign_block 和 sign_block1,若匹配则验证成功,报文未被篡改。
2.使用
调用方称之为客户端,提供服务方称之为服务端。
2.1 客户端生成秘钥对,客户端将公钥给到服务端。
2.2 服务端生成秘钥对, 服务端将公钥给到服务端客户端。
2.3 客户端对报文不含签名部分计算摘要,并对摘要使用客户端的私钥进行加密得到摘要密文即签名。客户端将不含签名部分和签名组成完整请求报文发给服务端。
2.4 服务端接收到客户端发送的报文后对不含签名部分重新计算摘要,使用客户端的公钥对签名进行解密,并将解密结果与重新计算的摘要进行比对,一致则验签通过,否则失败。
2.5 服务端返回,服务端对返回报文不含签名部分计算摘要,并对摘要使用服务端的私钥进行加密得到摘要密文即签名。服务端将不含签名部分和签名组成完整返回报文回复给客户端。
2.6 客户端接收到服务端的回复报文后对不含签名部分重新计算摘要,使用服务端的公钥对签名进行解密,并将解密结果与重新计算的摘要进行比对,一致则验签通过,否则失败。