加解密/签名验签

Posted seeall

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加解密/签名验签相关的知识,希望对你有一定的参考价值。

一、我加密、签名的过程

       1,生成18位随机密钥:rand

067870-544583-448433;

  2,使用对方的公钥证书(cer文件),并使用“RSA”算法,对随机密钥的字节数组加密,得到一个字节数组,将其转化为小写的十六进制字符串:secretKey

07ed7542951980385e32c149039255aabf8009e1e98a9432db19755e45e07361d318b98393d431cad4f656df7bc254548bacc92c53aa9566fd9ca11054eb1683b68af3837be40fb64c9727ee5be144614a73e6ac66af4177682b21f2fc6fd4371c2ca02c273ba6a9843766fd9ae574a864a171d2a9c1d031cd183f96ca60b738887c617217d18de882b10ce6afe7a7ef17413bad4b9fad353b6da2a74b744098f434f9f86ec8dfa637bcb918925f1e1ec2b49681a21819716217741346254765fd360d98bdc4331b5a66deacc8042fd0e58ee429d27f0c78f93a3307e4417a4d0d2c3c080aa93f2214bf435a66bf6c106f3abb82f5ce0e7a1354217ba77337a8;

,并放入到公共请求参数Map-dataMap中

  3,将业务对象转化为Map-payloadMap,再将payloadMap转化为json字符串:payloadJson

{"age":2,"nickName":"旺财"};

  4,使用随机密钥rand的字节数组对业务对象json字符串payloadJson,进行SMS4国密加密(我采取的是每16个明文字节使用随机密钥字节数组加密),得到字节数组,并转化为小写的十六进制字符串:payload

56c0eab96f91e94fbaeeec57be732c5a530734d32a34fcd56c10a555c0d447ab;

  5,把签名的算法 algorithm:SHA256withRSA 也放入公共请求参数Map-dataMap中。把公共请求参数dataMap,和业务请求参数payloadMap融合成一个plainMap

技术图片

  6,将融合后的集合plainMap按照键名的字典顺序升序排序,转化为以下结构的字符串:键=&=&=值;值如果是MapList,也需要排序;并且值需要经过URLEncoder.encode,不管是外层的map还是内层map;plain

age=2&algorithm=SHA256withRSA&nickName=%E6%97%BA%E8%B4%A2&secretKey=07ed7542951980385e32c149039255aabf8009e1e98a9432db19755e45e07361d318b98393d431cad4f656df7bc254548bacc92c53aa9566fd9ca11054eb1683b68af3837be40fb64c9727ee5be144614a73e6ac66af4177682b21f2fc6fd4371c2ca02c273ba6a9843766fd9ae574a864a171d2a9c1d031cd183f96ca60b738887c617217d18de882b10ce6afe7a7ef17413bad4b9fad353b6da2a74b744098f434f9f86ec8dfa637bcb918925f1e1ec2b49681a21819716217741346254765fd360d98bdc4331b5a66deacc8042fd0e58ee429d27f0c78f93a3307e4417a4d0d2c3c080aa93f2214bf435a66bf6c106f3abb82f5ce0e7a1354217ba77337a8;

  7,使用步骤5中确定的签名算法algorithm:SHA256withRSA,并使用我的私钥证(pfx文件)对步骤6中“=&=&=值”格式的字符串plain生成签名signature

 

292f3e72f3adc030d42268310edefe4cee3ac882b9981b0698db924fe1f03f64094e84f7b5c4c2f5091416e695b34c384b7d35bf276e0b43095b9b2973eff1f5ff56222e8db46067bda8a085376f552a6239c6a496c769f7cae8f1ed79907fd53fdb71
3303ed9c5bb9ffa1e4c6cfc689c7fe01f263bf9bfdbee7985c2213fb2e547858a68615205d1fd80d6b28970faf861cb6d341eaa8c0413b02699a742f9adb12cd68e5ca42aac14e604de212ec1163a42ec30b9c35dd015d543fd22047524809bb124cf
0bb72d1be4c45e3f9110e703782bac6d3f0bc83614802624cc4748bcea2796fd0325fb600e14d826e9c2e0114407d94ceedff210b815d90991654;
8,将公共参数dataMap和步骤7的签名signature和步骤4的业务密文payload融合成一个Map,仍然叫dataMap

技术图片

9,将步骤8dataMap仍然按照步骤6的方式拼接成“键=&=&=值”格式的字符串sendStr
algorithm=SHA256withRSA&payload=56c0eab96f91e94fbaeeec57be732c5a530734d32a34fcd56c10a555c0d447ab&secretKey=07ed7542951980385e32c149039255aabf8009e1e98a9432db19755e45e07361d318b98393d431ca
d4f656df7bc254548bacc92c53aa9566fd9ca11054eb1683b68af3837be40fb64c9727ee5be144614a73e6ac66af4177682b21f2fc6fd4371c2ca02c273ba6a9843766fd9ae574a864a171d2a9c1d031cd183f96ca60b738887c617
217d
18de882b10ce6afe7a7ef17413bad4b9fad353b6da2a74b744098f434f9f86ec8dfa637bcb918925f1e1ec2b49681a21819716217741346254765fd360d98bdc4331b5a66deacc8042fd0e58ee429d27f0c78f93a3307e4417a4d
0d2c3c
080aa93f2214bf435a66bf6c106f3abb82f5ce0e7a1354217ba77337a8&signature=292f3e72f3adc030d42268310edefe4cee3ac882b9981b0698db924fe1f03f64094e84f7b5c4c2f5091416e695b34c384b7d35bf276e0b
43095b9b
2973eff1f5ff56222e8db46067bda8a085376f552a6239c6a496c769f7cae8f1ed79907fd53fdb713303ed9c5bb9ffa1e4c6cfc689c7fe01f263bf9bfdbee7985c2213fb2e547858a68615205d1fd80d6b28970faf861cb6d
341eaa8c04
13b02699a742f9adb12cd68e5ca42aac14e604de212ec1163a42ec30b9c35dd015d543fd22047524809bb124cf0bb72d1be4c45e3f9110e703782bac6d3f0bc83614802624cc4748bcea2796fd0325fb600e14d826e9c2e
0114407d94ce
edff210b815d90991654;

 

 

 

二、对方解密、验签的过程

1,将步骤9中的secretKey使用自己的私钥解密得到随机密钥原文

067870-544583-448433;

2,使用随机密钥原文对步骤9中的payload业务SMS4密文解密转化为Map

{"age"=2,"nickName"="旺财"};

3,将步骤9sendStr转换成Map,并去除signaturepayload,融进步骤2的map中,按照相同的规则字典顺序排序拼接成“=&=&=值”格式的字符串;

4,将上述字符串使用自己的公钥证书(cer文件)并algorithm算法,签名,得到一个字节数组。和步骤9的signature的字节数组比较。一致,则验签通过。

6,将融合后的集合按照键名的字典顺序升序排序,转化为一下结构的字符串:键=&=&=值,值如果是MapList,也需要排序;并且值需要经过URLEncoder.encode,不管是最外层的map还是最外层的map

以上是关于加解密/签名验签的主要内容,如果未能解决你的问题,请参考以下文章

加解密/签名验签

JMeter BeanShell 实现接口签名验签及加解密

API接口入门(二):API接口的签名验签和加解密原理

API接口入门(二):API接口的签名验签和加解密原理

浅谈签名验签

Java实现RSA 加密解密签名验签的工具类复制粘贴直接用