当前位置:   article > 正文

java RSA加密解密实现_base64utils.encode(rsautils.encryptbypublicke

base64utils.encode(rsautils.encryptbypublicke

该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 被我改成 了commons-codec-xxx.jar。当然了你也可以使用jdk1.8的Base64,听说效率更高。这里我就不改了。

注意:
RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。
RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下
异常:

  1. Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes
  2. at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
  3. at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
  4. at javax.crypto.Cipher.doFinal(DashoA13*..)
RSAUtils.java

 

  1. import java.io.ByteArrayOutputStream;
  2. import java.security.Key;
  3. import java.security.KeyFactory;
  4. import java.security.KeyPair;
  5. import java.security.KeyPairGenerator;
  6. import java.security.PrivateKey;
  7. import java.security.PublicKey;
  8. import java.security.Signature;
  9. import java.security.interfaces.RSAPrivateKey;
  10. import java.security.interfaces.RSAPublicKey;
  11. import java.security.spec.PKCS8EncodedKeySpec;
  12. import java.security.spec.X509EncodedKeySpec;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15. import javax.crypto.Cipher;
  16. /** *//**
  17. * <p>
  18. * RSA公钥/私钥/签名工具包
  19. * </p>
  20. * <p>
  21. * 罗纳德·李维斯特(Ron [R]ivest)、阿迪·萨莫尔(Adi [S]hamir)和伦纳德·阿德曼(Leonard [A]dleman)
  22. * </p>
  23. * <p>
  24. * 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/>
  25. * 由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,<br/>
  26. * 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全
  27. * </p>
  28. *
  29. * @author IceWee
  30. * @date 2012-4-26
  31. * @version 1.0
  32. */
  33. public class RSAUtils {
  34. /** *//**
  35. * 加密算法RSA
  36. */
  37. public static final String KEY_ALGORITHM = "RSA";
  38. /** *//**
  39. * 签名算法
  40. */
  41. public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
  42. /** *//**
  43. * 获取公钥的key
  44. */
  45. private static final String PUBLIC_KEY = "RSAPublicKey";
  46. /** *//**
  47. * 获取私钥的key
  48. */
  49. private static final String PRIVATE_KEY = "RSAPrivateKey";
  50. /** *//**
  51. * RSA最大加密明文大小
  52. */
  53. private static final int MAX_ENCRYPT_BLOCK = 117;
  54. /** *//**
  55. * RSA最大解密密文大小
  56. */
  57. private static final int MAX_DECRYPT_BLOCK = 128;
  58. /** *//**
  59. * <p>
  60. * 生成密钥对(公钥和私钥)
  61. * </p>
  62. *
  63. * @return
  64. * @throws Exception
  65. */
  66. public static Map<String, Object> genKeyPair() throws Exception {
  67. KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
  68. keyPairGen.initialize(1024);
  69. KeyPair keyPair = keyPairGen.generateKeyPair();
  70. RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
  71. RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
  72. Map<String, Object> keyMap = new HashMap<String, Object>(2);
  73. keyMap.put(PUBLIC_KEY, publicKey);
  74. keyMap.put(PRIVATE_KEY, privateKey);
  75. return keyMap;
  76. }
  77. /** *//**
  78. * <p>
  79. * 用私钥对信息生成数字签名
  80. * </p>
  81. *
  82. * @param data 已加密数据
  83. * @param privateKey 私钥(BASE64编码)
  84. *
  85. * @return
  86. * @throws Exception
  87. */
  88. public static String sign(byte[] data, String privateKey) throws Exception {
  89. byte[] keyBytes = Base64Utils.decode(privateKey);
  90. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  91. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  92. PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
  93. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  94. signature.initSign(privateK);
  95. signature.update(data);
  96. return Base64Utils.encode(signature.sign());
  97. }
  98. /** *//**
  99. * <p>
  100. * 校验数字签名
  101. * </p>
  102. *
  103. * @param data 已加密数据
  104. * @param publicKey 公钥(BASE64编码)
  105. * @param sign 数字签名
  106. *
  107. * @return
  108. * @throws Exception
  109. *
  110. */
  111. public static boolean verify(byte[] data, String publicKey, String sign)
  112. throws Exception {
  113. byte[] keyBytes = Base64Utils.decode(publicKey);
  114. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
  115. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  116. PublicKey publicK = keyFactory.generatePublic(keySpec);
  117. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  118. signature.initVerify(publicK);
  119. signature.update(data);
  120. return signature.verify(Base64Utils.decode(sign));
  121. }
  122. /** *//**
  123. * <P>
  124. * 私钥解密
  125. * </p>
  126. *
  127. * @param encryptedData 已加密数据
  128. * @param privateKey 私钥(BASE64编码)
  129. * @return
  130. * @throws Exception
  131. */
  132. public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)
  133. throws Exception {
  134. byte[] keyBytes = Base64Utils.decode(privateKey);
  135. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  136. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  137. Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
  138. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  139. cipher.init(Cipher.DECRYPT_MODE, privateK);
  140. int inputLen = encryptedData.length;
  141. ByteArrayOutputStream out = new ByteArrayOutputStream();
  142. int offSet = 0;
  143. byte[] cache;
  144. int i = 0;
  145. // 对数据分段解密
  146. while (inputLen - offSet > 0) {
  147. if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
  148. cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
  149. } else {
  150. cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
  151. }
  152. out.write(cache, 0, cache.length);
  153. i++;
  154. offSet = i * MAX_DECRYPT_BLOCK;
  155. }
  156. byte[] decryptedData = out.toByteArray();
  157. out.close();
  158. return decryptedData;
  159. }
  160. /** *//**
  161. * <p>
  162. * 公钥解密
  163. * </p>
  164. *
  165. * @param encryptedData 已加密数据
  166. * @param publicKey 公钥(BASE64编码)
  167. * @return
  168. * @throws Exception
  169. */
  170. public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)
  171. throws Exception {
  172. byte[] keyBytes = Base64Utils.decode(publicKey);
  173. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  174. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  175. Key publicK = keyFactory.generatePublic(x509KeySpec);
  176. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  177. cipher.init(Cipher.DECRYPT_MODE, publicK);
  178. int inputLen = encryptedData.length;
  179. ByteArrayOutputStream out = new ByteArrayOutputStream();
  180. int offSet = 0;
  181. byte[] cache;
  182. int i = 0;
  183. // 对数据分段解密
  184. while (inputLen - offSet > 0) {
  185. if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
  186. cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
  187. } else {
  188. cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
  189. }
  190. out.write(cache, 0, cache.length);
  191. i++;
  192. offSet = i * MAX_DECRYPT_BLOCK;
  193. }
  194. byte[] decryptedData = out.toByteArray();
  195. out.close();
  196. return decryptedData;
  197. }
  198. /** *//**
  199. * <p>
  200. * 公钥加密
  201. * </p>
  202. *
  203. * @param data 源数据
  204. * @param publicKey 公钥(BASE64编码)
  205. * @return
  206. * @throws Exception
  207. */
  208. public static byte[] encryptByPublicKey(byte[] data, String publicKey)
  209. throws Exception {
  210. byte[] keyBytes = Base64Utils.decode(publicKey);
  211. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  212. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  213. Key publicK = keyFactory.generatePublic(x509KeySpec);
  214. // 对数据加密
  215. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  216. cipher.init(Cipher.ENCRYPT_MODE, publicK);
  217. int inputLen = data.length;
  218. ByteArrayOutputStream out = new ByteArrayOutputStream();
  219. int offSet = 0;
  220. byte[] cache;
  221. int i = 0;
  222. // 对数据分段加密
  223. while (inputLen - offSet > 0) {
  224. if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
  225. cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
  226. } else {
  227. cache = cipher.doFinal(data, offSet, inputLen - offSet);
  228. }
  229. out.write(cache, 0, cache.length);
  230. i++;
  231. offSet = i * MAX_ENCRYPT_BLOCK;
  232. }
  233. byte[] encryptedData = out.toByteArray();
  234. out.close();
  235. return encryptedData;
  236. }
  237. /** *//**
  238. * <p>
  239. * 私钥加密
  240. * </p>
  241. *
  242. * @param data 源数据
  243. * @param privateKey 私钥(BASE64编码)
  244. * @return
  245. * @throws Exception
  246. */
  247. public static byte[] encryptByPrivateKey(byte[] data, String privateKey)
  248. throws Exception {
  249. byte[] keyBytes = Base64Utils.decode(privateKey);
  250. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  251. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  252. Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
  253. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  254. cipher.init(Cipher.ENCRYPT_MODE, privateK);
  255. int inputLen = data.length;
  256. ByteArrayOutputStream out = new ByteArrayOutputStream();
  257. int offSet = 0;
  258. byte[] cache;
  259. int i = 0;
  260. // 对数据分段加密
  261. while (inputLen - offSet > 0) {
  262. if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
  263. cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
  264. } else {
  265. cache = cipher.doFinal(data, offSet, inputLen - offSet);
  266. }
  267. out.write(cache, 0, cache.length);
  268. i++;
  269. offSet = i * MAX_ENCRYPT_BLOCK;
  270. }
  271. byte[] encryptedData = out.toByteArray();
  272. out.close();
  273. return encryptedData;
  274. }
  275. /** *//**
  276. * <p>
  277. * 获取私钥
  278. * </p>
  279. *
  280. * @param keyMap 密钥对
  281. * @return
  282. * @throws Exception
  283. */
  284. public static String getPrivateKey(Map<String, Object> keyMap)
  285. throws Exception {
  286. Key key = (Key) keyMap.get(PRIVATE_KEY);
  287. return Base64Utils.encode(key.getEncoded());
  288. }
  289. /** *//**
  290. * <p>
  291. * 获取公钥
  292. * </p>
  293. *
  294. * @param keyMap 密钥对
  295. * @return
  296. * @throws Exception
  297. */
  298. public static String getPublicKey(Map<String, Object> keyMap)
  299. throws Exception {
  300. Key key = (Key) keyMap.get(PUBLIC_KEY);
  301. return Base64Utils.encode(key.getEncoded());
  302. }
  303. }

 

Base64Utils.java
  1. import java.io.ByteArrayInputStream;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import org.apache.commons.codec.binary.Base64;
  9. /** *//**
  10. * <p>
  11. * BASE64编码解码工具包
  12. * </p>
  13. * <p>
  14. * 依赖javabase64-1.3.1.jar
  15. * </p>
  16. *
  17. * @author IceWee
  18. * @date 2012-5-19
  19. * @version 1.0
  20. */
  21. public class Base64Utils {
  22. static Base64 bas64=null;
  23. static{
  24. bas64 = new Base64();
  25. }
  26. /** *//**
  27. * 文件读取缓冲区大小
  28. */
  29. private static final int CACHE_SIZE = 1024;
  30. /** *//**
  31. * <p>
  32. * BASE64字符串解码为二进制数据
  33. * </p>
  34. *
  35. * @param base64
  36. * @return
  37. * @throws Exception
  38. */
  39. public static byte[] decode(String base64) throws Exception {
  40. return bas64.decode(base64.getBytes());
  41. }
  42. /** *//**
  43. * <p>
  44. * 二进制数据编码为BASE64字符串
  45. * </p>
  46. *
  47. * @param bytes
  48. * @return
  49. * @throws Exception
  50. */
  51. public static String encode(byte[] bytes) throws Exception {
  52. return new String(bas64.encode(bytes));
  53. }
  54. /** *//**
  55. * <p>
  56. * 将文件编码为BASE64字符串
  57. * </p>
  58. * <p>
  59. * 大文件慎用,可能会导致内存溢出
  60. * </p>
  61. *
  62. * @param filePath 文件绝对路径
  63. * @return
  64. * @throws Exception
  65. */
  66. public String encodeFile(String filePath) throws Exception {
  67. byte[] bytes = fileToByte(filePath);
  68. return encode(bytes);
  69. }
  70. /** *//**
  71. * <p>
  72. * BASE64字符串转回文件
  73. * </p>
  74. *
  75. * @param filePath 文件绝对路径
  76. * @param base64 编码字符串
  77. * @throws Exception
  78. */
  79. public void decodeToFile(String filePath, String base64) throws Exception {
  80. byte[] bytes = decode(base64);
  81. byteArrayToFile(bytes, filePath);
  82. }
  83. /** *//**
  84. * <p>
  85. * 文件转换为二进制数组
  86. * </p>
  87. *
  88. * @param filePath 文件路径
  89. * @return
  90. * @throws Exception
  91. */
  92. public static byte[] fileToByte(String filePath) throws Exception {
  93. byte[] data = new byte[0];
  94. File file = new File(filePath);
  95. if (file.exists()) {
  96. FileInputStream in = new FileInputStream(file);
  97. ByteArrayOutputStream out = new ByteArrayOutputStream(2048);
  98. byte[] cache = new byte[CACHE_SIZE];
  99. int nRead = 0;
  100. while ((nRead = in.read(cache)) != -1) {
  101. out.write(cache, 0, nRead);
  102. out.flush();
  103. }
  104. out.close();
  105. in.close();
  106. data = out.toByteArray();
  107. }
  108. return data;
  109. }
  110. /** *//**
  111. * <p>
  112. * 二进制数据写文件
  113. * </p>
  114. *
  115. * @param bytes 二进制数据
  116. * @param filePath 文件生成目录
  117. */
  118. public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {
  119. InputStream in = new ByteArrayInputStream(bytes);
  120. File destFile = new File(filePath);
  121. if (!destFile.getParentFile().exists()) {
  122. destFile.getParentFile().mkdirs();
  123. }
  124. destFile.createNewFile();
  125. OutputStream out = new FileOutputStream(destFile);
  126. byte[] cache = new byte[CACHE_SIZE];
  127. int nRead = 0;
  128. while ((nRead = in.read(cache)) != -1) {
  129. out.write(cache, 0, nRead);
  130. out.flush();
  131. }
  132. out.close();
  133. in.close();
  134. }
  135. }

测试类 

  1. import com.tyyd.opensms.commons.utils.lang.ByteFormat;
  2. import java.util.Map;
  3. public class RSATester {
  4. static String publicKey;
  5. static String privateKey;
  6. static {
  7. try {
  8. Map<String, Object> keyMap = RSAUtils.genKeyPair();
  9. publicKey = RSAUtils.getPublicKey(keyMap);
  10. privateKey = RSAUtils.getPrivateKey(keyMap);
  11. System.err.println("公钥: \t" + publicKey);
  12. System.err.println("私钥: \t" + privateKey);
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. public static void main(String[] args) throws Exception {
  18. test();
  19. testSign();
  20. }
  21. static void test() throws Exception {
  22. System.err.println("公钥加密——私钥解密");
  23. String source = "这是一行没有任何意义的文字,你看完了等于没看,不是吗?是不是感觉还是不够长啊,那咱们就再加点呗,现在肯定是超过了RSA的深度了。";
  24. System.out.println("加密前文字:\t" + source);
  25. byte[] encodedData = RSAUtils.encryptByPublicKey(source.getBytes(), publicKey);
  26. System.out.println("加密后文字:\t" + new String(encodedData));
  27. byte[] decodedData = RSAUtils.decryptByPrivateKey(encodedData, privateKey);
  28. String target = new String(decodedData);
  29. System.out.println("解密后文字: \t" + target);
  30. }
  31. static void testSign() throws Exception {
  32. System.err.println("私钥加密——公钥解密");
  33. String source = "这是一行测试RSA数字签名的无意义文字。当然了,如果也觉得不够长,那就让它长长点,再长点,再长点,这回够长了吧,爽了吧!!";
  34. System.out.println("原文字:\r\n" + source);
  35. byte[] data = source.getBytes();
  36. byte[] encodedData = RSAUtils.encryptByPrivateKey(data, privateKey);
  37. System.out.println("加密后:\r\n" + ByteFormat.bytesToHexString(encodedData));
  38. byte[] decodedData = RSAUtils.decryptByPublicKey(encodedData, publicKey);
  39. String target = new String(decodedData);
  40. System.out.println("解密后: \r\n" + target);
  41. System.err.println("私钥签名——公钥验证签名");
  42. String sign = RSAUtils.sign(encodedData, privateKey);
  43. System.err.println("签名:\t" + sign);
  44. boolean status = RSAUtils.verify(encodedData, publicKey, sign);
  45. System.err.println("验证结果:\r" + status);
  46. }
  47. }

运行结果: 

  1. 公钥: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCA2YZZH4++6UK6s3jkqhL7LJ1Tx5S+4Iex/PggH3GqswmSW4Vwpop87Ivdg7iBKj5k6q4W0W269LLgSLVHiYmGN4p4XhMJHgZ3hDfJNpPRnRQcC9Kqrol70Yp/rNpNESIZAI2pIZzzHiw6nj0/MCNVU0xM3Sal/H7RUjkiTtNpZQIDAQAB
  2. 私钥: MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIDZhlkfj77pQrqzeOSqEvssnVPHlL7gh7H8+CAfcaqzCZJbhXCminzsi92DuIEqPmTqrhbRbbr0suBItUeJiYY3inheEwkeBneEN8k2k9GdFBwL0qquiXvRin+s2k0RIhkAjakhnPMeLDqePT8wI1VTTEzdJqX8ftFSOSJO02llAgMBAAECgYAaeBUgQ9qMtnBt2CaSmtmRXaXoKwzEdW2Kw9PZDXyVO3hQ55ou/Rdf+Fv3InMJnbr5kjg3Gci36kLAzk7nJjro2+IDtKrAQaVlsdim1/cDa9Aer+U1EdVugoniHOmtOQWA8lLF6XS3epx6U4XTNFFQmyH4vwHLiiXgO/ThV4H7gQJBALtlab+9CfTJgIjbP+gyStGhW1/6GzwRLnl/sOcLmCN95ii0dDe/xrpTVQNCOMmjqvIG/EPLkklIGevWNoqpWsUCQQCwBTIWcgugnxN7GSJAchTSVyb42+hcYkawb5NCZfM6OGcZkeVLBODMgc8cTJrZMBHjuOQK2LL9jgbAyCurJz4hAkAeLlAgxFZlKUrdP8qEIA1yw7UOuR5Hx1Cf2tPn8jMXjEBUT/PjwqxD+AXaF4FD4Gs4va1FUfUGfmlGVWLFZE8tAkB0YbsQZC+T8BotVhzzh3qE6OL3wE8OZlxe5Cb1y/raD9j7ax+0TnFkRp/uEiiAWew6KVF+anFOfM2yQae97qCBAkAVXIQ3Kbh8E8biHV/6DJ4MvvLWa5g+bP41Y4i7x9IK5AQytCmvGvO9qSxQZiWGpt+h0e8Oh2/qC+CQispFAQvv
  3. 公钥加密——私钥解密
  4. 加密前文字: 这是一行没有任何意义的文字,你看完了等于没看,不是吗?是不是感觉还是不够长啊,那咱们就再加点呗,现在肯定是超了的。
  5. O�v,�Sm�ƫ��*x�r}�O|v��U�J ��dݗ3�O��O�%�N��L]�Ļ\ F���s$��_jZ�f#���J��
  6. 解密后文字: 这是一行没有任何意义的文字,你看完了等于没看,不是吗?是不是感觉还是不够长啊,那咱们就再加点呗,现在肯定是超了的。
  7. 私钥加密——公钥解密
  8. 原文字:
  9. 这是一行测试RSA数字签名的无意义文字。当然了,如果也觉得不够长,那就让它长长点,再长点,再长点,这回够长了吧,爽了吧!!
  10. 加密后:
  11. 29F056E28E0C3F9BC20FBD8AF34C20E4EAF9AD9047879929FB5D72B9F29336D6D64E1ED2A9AD32442F851EC022746EDB0E36A3159E793EB3E456EDB5E18B52F0AAD4CD6A35B2548BCFC87D24D6DEEBC613508CF9FEB7C211D9AC4CC552BEF785498C19475CC8D086A5B9A12E41BE9280EAFF589B13BD5A4FE0F4DCB5B4F3DC0E69CC5678AEC002490272BEC24706E5C051D139D039B767462F1E7850451E136A045F403665292ED630E7A284E740BBC111572783818A3382E7A8485E9EE13CF0037A65ECD6C60BC52526CD7D190E1350962EB3ABF4A51C8F0DDC88F0B3A8F08DBB047F4C8D998F6A31335B4C6F5B6E2C397D42BAD05A19FA4B18315612514023
  12. 解密后:
  13. 这是一行测试RSA数字签名的无意义文字。当然了,如果也觉得不够长,那就让它长长点,再长点,再长点,这回够长了吧,爽了吧!!
  14. 私钥签名——公钥验证签名
  15. 签名: XT7O9Xj6aXP0jW9C7ocUj7jRpQr1ONAOAl6VYm1igPPunGdDLvCbOzjDFng4fdlJ58pUud/yq5av0bk5HUlWNulBGY6wa1uTjcsJwoARlV8j/0N8JXrKn/sngIG6ewWIFQOTzn7MHL6g3NMeYifAWb2Lc5FLv85cU94nkzqagGY=
  16. true
  17. Process finished with exit code 0

 

 

 抄自:https://blog.csdn.net/centralperk/article/details/8538697

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/202881
推荐阅读
相关标签
  

闽ICP备14008679号