DZ_XIAOBAI 2016-12-24 01:46 采纳率: 0%
浏览 3309

如何实现报文的签名和验签

1.1 报文签名验签

报文签名采用标准XML文件格式格式(参照W3C标准)。

1.2 数据签名
从xml报文中,取指定节点数据(带有标签,不带命名空间),直接拼接后形成待签名数据源,然后再进行签名。
数据签名采用标准的PKCS#1格式。
数字签名前要对源数据使用SHA-1数据摘要算法作HASH运算,再用签名私钥作RSA运算,结果即为对数据的“数字签名”。下面记DATA为待签名数据, SHA(…)为HASH函数,RSA(…)为RSA运算函数,SIGN为签名结果。数字签名过程为:_
(1) 用SHA-1摘要算法对需要签名的数据(DATA)进行HASH运算,生成20字节HASH结果:
H = SHA(DATA) H为20字节
(2) 按PKCS#1标准对HASH结果作填充
B = 00 01 00 ff ff … ff 00
30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14
H[00], H[01], …, H13 使用私钥(记作pvk)对填充后的数据块作RSA运算,生成128字节签名结果:
SIGN = RSApvk(B) SIGN为128字节
(4) 将签名结果(128字节)进行Base64转换,生成172字节签名结果串。
(5) 172字节签名结果串即为签名结果。

1.3 数据验签
从xml报文中,取指定节点数据(带有标签,不带命名空间),直接拼接后形成验签数据源,从报文中取签名结果。
接收方根据接收报文中的签名者信息(SignerID、KeyName),查找对应的证书及公钥,然后使用该公钥对签名进行验证。
从接收报文中取签名结果,记为SIGN,签名原数据为DATA,验签公钥为pbk,则验证签名的流程为:
_(1) 将Base64格式的签名结果串转换为128字节二进制数据。
(2) 使用公钥对签名结果作RSA公钥解密运算并去掉填充:
H’ = RSApbk(SIGN)
(3) 对签名原数据作HASH运算:
H = SHA(DATA)
(4) 比较H与H’, 如相等,则验证正确,否则验证错误。
_

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2016-12-24 01:56
    关注

    别硬扛着了,这活还是雇个程序员吧。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器