一、我加密、签名的过程
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按照键名的字典顺序升序排序,转化为以下结构的字符串:键=值&键=值&键=值;值如果是Map或List,也需要排序;并且值需要经过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
292f3e72f3adc030d42268310edefe4cee3ac882b9981b0698db924fe1f03f64094e84f7b5c4c2f5091416e695b34c384b7d35bf276e0b43095b9b2973eff1f5ff56222e8db46067bda8a085376f552a6239c6a496c769f7cae8f1ed79907fd53fdb713303ed9c5bb9ffa1e4c6cfc689c7fe01f263bf9bfdbee7985c2213fb2e547858a68615205d1fd80d6b28970faf861cb6d341eaa8c0413b02699a742f9adb12cd68e5ca42aac14e604de212ec1163a42ec30b9c35dd015d543fd22047524809bb124cf0bb72d1be4c45e3f9110e703782bac6d3f0bc83614802624cc4748bcea2796fd0325fb600e14d826e9c2e0114407d94ceedff210b815d90991654;
8,将公共参数dataMap和步骤7的签名signature和步骤4的业务密文payload融合成一个Map,仍然叫dataMap
;
9,将步骤8的dataMap仍然按照步骤6的方式拼接成“键=值&键=值&键=值”格式的字符串sendStralgorithm=SHA256withRSA&payload=56c0eab96f91e94fbaeeec57be732c5a530734d32a34fcd56c10a555c0d447ab&secretKey=07ed7542951980385e32c149039255aabf8009e1e98a9432db19755e45e07361d318b98393d431cad4f656df7bc254548bacc92c53aa9566fd9ca11054eb1683b68af3837be40fb64c9727ee5be144614a73e6ac66af4177682b21f2fc6fd4371c2ca02c273ba6a9843766fd9ae574a864a171d2a9c1d031cd183f96ca60b738887c617217d18de882b10ce6afe7a7ef17413bad4b9fad353b6da2a74b744098f434f9f86ec8dfa637bcb918925f1e1ec2b49681a21819716217741346254765fd360d98bdc4331b5a66deacc8042fd0e58ee429d27f0c78f93a3307e4417a4d0d2c3c080aa93f2214bf435a66bf6c106f3abb82f5ce0e7a1354217ba77337a8&signature=292f3e72f3adc030d42268310edefe4cee3ac882b9981b0698db924fe1f03f64094e84f7b5c4c2f5091416e695b34c384b7d35bf276e0b43095b9b2973eff1f5ff56222e8db46067bda8a085376f552a6239c6a496c769f7cae8f1ed79907fd53fdb713303ed9c5bb9ffa1e4c6cfc689c7fe01f263bf9bfdbee7985c2213fb2e547858a68615205d1fd80d6b28970faf861cb6d341eaa8c0413b02699a742f9adb12cd68e5ca42aac14e604de212ec1163a42ec30b9c35dd015d543fd22047524809bb124cf0bb72d1be4c45e3f9110e703782bac6d3f0bc83614802624cc4748bcea2796fd0325fb600e14d826e9c2e0114407d94ceedff210b815d90991654;
二、对方解密、验签的过程
1,将步骤9中的secretKey使用自己的私钥解密得到随机密钥原文
067870-544583-448433;
2,使用随机密钥原文对步骤9中的payload业务SMS4密文解密转化为Map
{"age"=2,"nickName"="旺财"};
3,将步骤9sendStr转换成Map,并去除signature和payload,融进步骤2的map中,按照相同的规则字典顺序排序拼接成“键=值&键=值&键=值”格式的字符串;
4,将上述字符串使用自己的公钥证书(cer文件)并algorithm算法,签名,得到一个字节数组。和步骤9的signature的字节数组比较。一致,则验签通过。
6,将融合后的集合按照键名的字典顺序升序排序,转化为一下结构的字符串:键=值&键=值&键=值,值如果是Map或List,也需要排序;并且值需要经过URLEncoder.encode,不管是最外层的map还是最外层的map:
原文地址:https://www.cnblogs.com/seeall/p/12063715.html