有的时候需要获取当前时间所在自然周中的起始和截止时间,或者某个时间段内里的每一天的日期 1、先来解决获取自然周中的起止时间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/** * 获取当前时间所在自然周的起止日期 * * @return */ public static Map<String, String> weekBeginningAndEnding() { Map<String, String> map = new HashMap<>(); //获取当前自然周中每天的日期集合 Date date = new Date(); DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); //这里设置一周开始时间是星期一 c.setTime(date); c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); // Monday String beginTime = format.format(c.getTime()); //获取当前自然周的起始时间 map.put("begin", beginTime); c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6); // Sunday String endTime = format.format(c.getTime()); //当前自然周的截止时间 map.put("end", endTime); return map; } |
2、根据时间段来获取当前时间段内的每一天
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/** * 获取开始和结束之间的每一天 * * @param beginTime 开始时间 * @param endTime 结束时间 * @param type 返回列表中的时间格式 * @return 返回日期字符串列表 */ public static List<String> weekDays(Date beginTime, Date endTime,String type) { DateFormat format=new SimpleDateFormat(type); //设置开始时间 Calendar calStart = Calendar.getInstance(); calStart.setTime(beginTime); //设置结束时间 Calendar calEnd = Calendar.getInstance(); calEnd.setTime(endTime); //返回的日期集合 List<String> dateList = new ArrayList<String>(); //每次循环给calStart日期加一天,直到calBegin.getTime()时间等于dEnd dateList.add(format.format(calStart.getTime())); while (endTime.after(calStart.getTime())) { //根据日历的规则,为给定的日历字段添加或减去指定的时间量 calStart.add(Calendar.DAY_OF_MONTH, 1); dateList.add(format.format(calStart.getTime())); } return dateList; } |
如果对你有用,点个赞吧!!! from:https://blog.csdn.net/weixin_44826433/article/details/110677362
View Details第一种方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** * 获取当前日期是星期几<br> * * @param date * @return 当前日期是星期几 */ public String getWeekOfDate(Date date) { String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; Calendar cal = Calendar.getInstance(); cal.setTime(date); int w = cal.get(Calendar.DAY_OF_WEEK) - 1; if (w < 0) w = 0; return weekDays[w]; } |
第二种方法: 使用SimpleDateFormat格式化日期
1 2 3 4 |
Date date = new Date(); SimpleDateFormat dateFm = new SimpleDateFormat("EEEE"); String currSun = dateFm.format(date); System.out.println(currSun); |
注:格式化字符串存在区分大小写 对于创建SimpleDateFormat传入的参数:EEEE代表星期,如“星期四”;MMMM代表中文月份,如“七月”;MM代表月份,如“07”;yyyy代表年份,如“2017”;dd代表天,如“05” from:https://blog.csdn.net/u013456370/article/details/74373410
View DetailsKafka概述:
Kafka由 linked-in 开源 。
kafka-高产出的分布式消息系统(A high-throughput distributed messaging system)。
Kafka是一个高吞吐、分布式、基于发布订阅的消息系统,利用Kafka技术可以在廉价的PC Server上搭建起大规模消息系统。
Kafka的特性:
高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作;
可扩展性:kafka集群支持热扩展;
持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;
容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败);
高并发:支持数千个客户端同时读写;
支持实时在线处理和离线处理:可以使用Storm这种实时流处理系统对消息进行实时进行处理,同时还可以使用Hadoop这种批处理系统进行离线处理;
MongoDB 是一个免费的开源跨平台面向文档的 NoSQL 数据库程序。 1、查看可用的 MongoDB 版本 访问 MongoDB 镜像库地址: https://hub.docker.com/_/mongo?tab=tags&page=1。 可以通过 Sort by 查看其他版本的 MongoDB,默认是最新版本 mongo:latest。 你也可以在下拉列表中找到其他你想要的版本: 此外,我们还可以用 docker search mongo 命令来查看可用版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ docker search mongo NAME DESCRIPTION STARS OFFICIAL AUTOMATED mongo MongoDB document databases ... 1989 [OK] mongo-express Web-based MongoDB admin int... 22 [OK] mvertes/alpine-mongo light MongoDB container 19 [OK] mongooseim/mongooseim-docker MongooseIM server the lates... 9 [OK] torusware/speedus-mongo Always updated official Mon... 9 [OK] jacksoncage/mongo Instant MongoDB sharded cluster 6 [OK] mongoclient/mongoclient Official docker image for M... 4 [OK] jadsonlourenco/mongo-rocks Percona Mongodb with Rocksd... 4 [OK] asteris/apache-php-mongo Apache2.4 + PHP + Mongo + m... 2 [OK] 19hz/mongo-container Mongodb replicaset for coreos 1 [OK] nitra/mongo Mongo3 centos7 1 [OK] ackee/mongo MongoDB with fixed Bluemix p... 1 [OK] kobotoolbox/mongo https://github.com/kobotoolb... 1 [OK] valtlfelipe/mongo Docker Image based on the la... 1 [OK] |
2、取最新版的 MongoDB 镜像 这里我们拉取官方的最新版本的镜像:
1 |
$ docker pull mongo:latest |
3、查看本地镜像 使用以下命令来查看是否已安装了 mongo:
1 |
$ docker images |
在上图中可以看到我们已经安装了最新版本(latest)的 mongo 镜像。 4、运行容器 安装完成后,我们可以使用以下命令来运行 mongo 容器:
1 |
$ docker run -itd --name mongo -p 27017:27017 mongo --auth |
参数说明: -p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。 --auth:需要密码才能访问容器服务。 5、安装成功 最后我们可以通过 docker ps 命令查看容器的运行信息: 接着使用以下命令添加用户和设置密码,并且尝试连接。
1 2 3 4 5 |
$ docker exec -it mongo mongo admin # 创建一个名为 admin,密码为 123456 的用户。 > db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]}); # 尝试使用上面创建的用户信息进行连接。 > db.auth('admin', '123456') |
MongoDB 6.0 及以上版本使用以下命令:
1 |
docker exec -it mongo mongosh admin |
from:https://www.runoob.com/docker/docker-install-mongodb.html
View Details先看效果: xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?xml version="1.0" encoding="utf-8" ?> <auibinsurancecallback> <policyinfo> <transtype>TKTS</transtype> <eticketno>xxx</eticketno> <flightnumber>xxx</flightnumber> <flightdate>2019-10-16</flightdate> <operatetime>2019-10-16 17:20:00</operatetime> <insureno>1910161720056066735</insureno> <agreeno>102160199</agreeno> <policyno/> <policyurl><![CDATA[]]></policyurl> </policyinfo> <returninfo> <serialnumber>2019103015284949545354</serialnumber> <retruncode>0</retruncode> <errormessage><![CDATA[]]></errormessage> </returninfo> <list> <item> <name>john</name> <age>22</age> <log> <record>1</record> <record>2</record> </log> </item> <item> <name>lucy</name> <age>23</age> <log> <record> <id>1</id> <event>event1</event> </record> <record> <id>2</id> <event>event2</event> </record> </log> </item> </list> <list2> <item> <name>lily</name> <age>24</age> </item> </list2> </auibinsurancecallback> |
json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
{ "auibinsurancecallback": { "policyinfo": { "transtype": "TKTS", "eticketno": "xxx", "flightnumber": "xxx", "flightdate": "2019-10-16", "operatetime": "2019-10-16 17:20:00", "insureno": "1910161720056066735", "agreeno": "102160199", "policyno": "", "policyurl": "" }, "returninfo": { "serialnumber": "2019103015284949545354", "retruncode": "0", "errormessage": "" }, "list": { "item": [ { "name": "john", "age": "22", "log": { "record": [ { "record": "1" }, { "record": "2" } ] } }, { "name": "lucy", "age": "23", "log": { "record": [ { "id": "1", "event": "event1" }, { "id": "2", "event": "event2" } ] } } ] }, "list2": { "item": { "name": "lily", "age": "24" } } } } |
依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.4</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 --> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.42</version> </dependency> |
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
package org.longsheng.util; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import java.util.ArrayList; import java.util.List; /** * Xml转JSON工具包 */ @Slf4j public class XmlToJsonUtil { /** * 转换为json字符串 * * @param xmlString xml字符串 * @return json字符串 */ public static String toJsonString(String xmlString) { JSONObject result = toJson(xmlString); if (result == null) { return null; } return result.toString(); } /** * 转换为json对象 * * @param xmlString xml字符串 * @return json对象 */ public static JSONObject toJson(String xmlString) { try { Document doc = DocumentHelper.parseText(xmlString); return toJson(doc); } catch (DocumentException e) { log.error("{}===>{}===>exception: {} | {}", Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName(), e.getMessage(), e.getStackTrace()); } return null; } /** * 转换为json对象 * * @param document xml对象 * @return json对象 */ public static JSONObject toJson(Document document) { if (document == null) { return null; } try { Element root = document.getRootElement(); List<Element> elements = root.elements(); JSONObject jsonObject = new JSONObject(); jsonObject.put(root.getName(), elementToJson(elements)); return jsonObject; } catch (Exception e) { log.error("{}===>{}===>exception: {} | {}", Thread.currentThread().getStackTrace()[1].getClassName(), Thread.currentThread().getStackTrace()[1].getMethodName(), e.getMessage(), e.getStackTrace()); } return null; } /** * 递归读取节点,并简单判定节点状态(值、对象、列表三种状态) * * @param elements * @return */ public static JSONObject elementToJson(List<Element> elements) { if (elements == null || elements.isEmpty()) { return null; } JSONObject result = new JSONObject(); // single object if (elements.size() == 1) { Element element = elements.get(0); List<Element> children = element.elements(); result.put(element.getName(), children.isEmpty() ? element.getText() : elementToJson(children)); return result; } // multi-object if (!elements.get(0).getName().equals(elements.get(1).getName())) { result.clear(); List<Element> children; for (Element element : elements) { children = element.elements(); result.put(element.getName(), children.isEmpty() ? element.getText() : elementToJson(children)); } return result; } // array list List<JSONObject> jsonList = new ArrayList<>(); List<Element> children; for (Element element : elements) { children = element.elements(); result = new JSONObject(); if (children.isEmpty()) { result.put(element.getName(), element.getText()); } else { result = elementToJson(children); } jsonList.add(result); } result = new JSONObject(); result.put(elements.get(0).getName(), jsonList); return result; } /** * 从json对象中获取指定名称的json数组 * * @param jsonObject json对象 * @param nodeName json数组节点名称 * @return json数组 */ public static JSONArray getArray(JSONObject jsonObject, String nodeName) { if (jsonObject == null || nodeName == null || nodeName.isEmpty()) { return null; } Object node = jsonObject.get(nodeName); if (node == null) { return null; } JSONArray result = new JSONArray(); if (node instanceof JSONObject) { result.add(node); return result; } if (node instanceof ArrayList) { result = jsonObject.getJSONArray(nodeName); } return result; } public static void main(String[] args) { String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" + "<auibinsurancecallback>\n" + "\t<policyinfo>\n" + "\t\t<transtype>TKTS</transtype>\n" + "\t\t<eticketno>xxx</eticketno>\n" + "\t\t<flightnumber>xxx</flightnumber>\n" + "\t\t<flightdate>2019-10-16</flightdate>\n" + "\t\t<operatetime>2019-10-16 17:20:00</operatetime>\n" + "\t\t<insureno>1910161720056066735</insureno>\n" + "\t\t<agreeno>102160199</agreeno>\n" + "\t\t<policyno/>\n" + "\t\t<policyurl><![CDATA[]]></policyurl>\n" + "\t</policyinfo>\n" + "\t<returninfo>\n" + "\t\t<serialnumber>2019103015284949545354</serialnumber>\n" + "\t\t<retruncode>0</retruncode>\n" + "\t\t<errormessage><![CDATA[]]></errormessage>\n" + "\t</returninfo>\n" + "\t<list>\n" + "\t\t<item>" + "\t\t\t<name>john</name>" + "\t\t\t<age>22</age>" + "\t\t\t<log>" + "\t\t\t\t<record>1</record>" + "\t\t\t\t<record>2</record>" + "\t\t\t</log>" + "\t\t</item>\n" + "\t\t<item>" + "\t\t\t<name>lucy</name>" + "\t\t\t<age>23</age>" + "\t\t\t<log>" + "\t\t\t\t<record>" + "\t\t\t\t\t<id>1</id>" + "\t\t\t\t\t<event>event1</event>" + "\t\t\t\t</record>" + "\t\t\t\t<record>" + "\t\t\t\t\t<id>2</id>" + "\t\t\t\t\t<event>event2</event>" + "\t\t\t\t</record>" + "\t\t\t</log>" + "\t\t</item>\n" + "\t</list>\n" + "\t<list2>\n" + "\t\t<item>" + "\t\t\t<name>lily</name>" + "\t\t\t<age>24</age>" + "\t\t</item>\n" + "\t</list2>\n" + "</auibinsurancecallback>"; JSONObject json = toJson(xml); System.out.println(xml); System.out.println(); assert json != null; System.out.println(json.toJSONString()); JSONArray array1 = getArray(json.getJSONObject("auibinsurancecallback").getJSONObject("list"), "item"); JSONArray array2 = getArray(json.getJSONObject("auibinsurancecallback").getJSONObject("list2"), "item"); System.out.println(); System.out.println(array1.toJSONString()); System.out.println(array2.toJSONString()); } } |
View Details
1、QPS
QPS Queries Per Second 是每秒查询率 ,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准, 即每秒的响应请求数,也即是最大吞吐能力。
2、TPS
TPS Transactions Per Second 也就是事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,
依赖
1 2 |
// https://mvnrepository.com/artifact/com.alibaba.boot/nacos-config-spring-boot-starter implementation group: 'com.alibaba.boot', name: 'nacos-config-spring-boot-starter', version: '0.2.12' |
配置文件 application.yml
1 2 3 4 5 |
nacos: config: server-addr: 127.0.0.1:8848 username: xxxx password: xxxxxx |
注解 @NacosPropertySource
1 2 3 4 5 6 7 8 9 10 |
@SpringBootApplication @MapperScan("com.w3cnet.xxx.repository") @NacosPropertySource(dataId = "xxx-prod.yml", autoRefreshed = true) public class XxxxApplication { public static void main(String[] args) { SpringApplication.run(XxxxApplication.class, args); } } |
注解 @NacosValue
1 2 |
@NacosValue(value = "${xxx.url}", autoRefreshed = true) private String xxxUrl; |
参考资料:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html
View Details
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
docker run \ --name nacos -d \ -p 8848:8848 \ -p 9848:9848 \ -p 9849:9849 \ --privileged=true \ --restart=always \ -e JVM_XMS=256m \ -e JVM_XMX=256m \ -e MODE=standalone \ -e NACOS_AUTH_ENABLE=true \ -e NACOS_AUTH_TOKEN=n5zev798cgz0rn10andd85yrexre1u3f43gime523mrri7qc1pvwsxwipw1y \ -e NACOS_AUTH_IDENTITY_KEY=nacos \ -e NACOS_AUTH_IDENTITY_VALUE=xm4y03pc4lud5u0zu2tfpilkgqin6lwljlplcry893vtwdsw4a93r7f5nep3 \ -e PREFER_HOST_MODE=hostname \ -e SPRING_DATASOURCE_PLATFORM=mysql \ -e MYSQL_SERVICE_HOST=192.168.1.3 \ -e MYSQL_SERVICE_PORT=3306 \ -e MYSQL_SERVICE_USER=xxxx \ -e MYSQL_SERVICE_PASSWORD=xxxx \ -e MYSQL_SERVICE_DB_NAME=nacos_config \ -v /data/nacos/logs:/etc/nacos/logs \ -v /data/nacos/init.d/custom.properties:/etc/nacos/init.d/custom.properties \ nacos/nacos-server:latest |
View Details
按下Windows + R 键,输入 %UserProfile% 并运行进入用户文件夹
新建文件 .wslconfig ,然后记事本编辑
[wsl2]
memory=4GB
processors=2
swap=0
localhostForwarding=true
1、C#代码 C#采用的RSACryptoServiceProvider类进行的加解密,由于该类默认是不支持私钥加密公钥解密的,需要通过BouncyCastle.Crypto.dll转换一下才可以。 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 |
using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptography; using System.IO; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Security; using System.Xml; using Org.BouncyCastle.Math; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Pkcs; using Org.BouncyCastle.X509; using Org.BouncyCastle.Asn1.X509; namespace RSADemo { /// <summary> /// RSA加解密帮助类 /// 作者:代浩然 /// 时间:2019-1-21 18:37 /// </summary> public class RSAHelper { /// <summary> /// 生成公钥和私钥对 /// </summary> public static void GeneratePublicAndPrivateKeyInfo() { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); using (StreamWriter writer = new StreamWriter("PrivateKey.xml")) //这个文件要保密... { string privateKey = rsa.ToXmlString(true); writer.WriteLine(privateKey); } using (StreamWriter writer = new StreamWriter("PublicKey.xml")) { string publicKey = rsa.ToXmlString(false); writer.WriteLine(publicKey); } } /// <summary> /// 用私钥给数据进行RSA加密 /// </summary> /// <param name="xmlPrivateKey"> 私钥(XML格式字符串)</param> /// <param name="strEncryptString">要加密的数据</param> /// <returns> 加密后的数据 </returns> public static string PrivateKeyEncrypt(string xmlPrivateKey, string strEncryptString) { //加载私钥 RSACryptoServiceProvider privateRsa = new RSACryptoServiceProvider(); privateRsa.FromXmlString(ReadFile(xmlPrivateKey)); //转换密钥 AsymmetricCipherKeyPair keyPair = DotNetUtilities.GetKeyPair(privateRsa); IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding"); //使用RSA/ECB/PKCS1Padding格式 //第一个参数为true表示加密,为false表示解密;第二个参数表示密钥 c.Init(true, keyPair.Private); byte[] dataToEncrypt = Encoding.UTF8.GetBytes(strEncryptString); #region 分段加密 int bufferSize = (privateRsa.KeySize / 8) - 11; byte[] buffer = new byte[bufferSize]; byte[] outBytes = null; //分段加密 using (MemoryStream input = new MemoryStream(dataToEncrypt)) using (MemoryStream ouput = new MemoryStream()) { while (true) { int readLine = input.Read(buffer, 0, bufferSize); if (readLine <= 0) { break; } byte[] temp = new byte[readLine]; Array.Copy(buffer, 0, temp, 0, readLine); byte[] encrypt = c.DoFinal(temp); ouput.Write(encrypt, 0, encrypt.Length); } outBytes = ouput.ToArray(); } #endregion //byte[] outBytes = c.DoFinal(DataToEncrypt);//加密 string strBase64 = Convert.ToBase64String(outBytes); return strBase64; } /// <summary> /// 用公钥给数据进行RSA解密 /// </summary> /// <param name="xmlPublicKey"> 公钥(XML格式字符串) </param> /// <param name="strDecryptString"> 要解密数据 </param> /// <returns> 解密后的数据 </returns> public static string PublicKeyDecrypt(string xmlPublicKey, string strDecryptString) { //加载公钥 RSACryptoServiceProvider publicRsa = new RSACryptoServiceProvider(); publicRsa.FromXmlString(ReadFile(xmlPublicKey)); RSAParameters rp = publicRsa.ExportParameters(false); //转换密钥 AsymmetricKeyParameter pbk = DotNetUtilities.GetRsaPublicKey(rp); IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding"); //第一个参数为true表示加密,为false表示解密;第二个参数表示密钥 c.Init(false, pbk); byte[] outBytes = null; byte[] dataToDecrypt = Convert.FromBase64String(strDecryptString); #region 分段解密 int keySize = publicRsa.KeySize / 8; byte[] buffer = new byte[keySize]; using (MemoryStream input = new MemoryStream(dataToDecrypt)) using (MemoryStream output = new MemoryStream()) { while (true) { int readLine = input.Read(buffer, 0, keySize); if (readLine <= 0) { break; } byte[] temp = new byte[readLine]; Array.Copy(buffer, 0, temp, 0, readLine); byte[] decrypt = c.DoFinal(temp); output.Write(decrypt, 0, decrypt.Length); } outBytes = output.ToArray(); } #endregion //byte[] outBytes = c.DoFinal(DataToDecrypt);//解密 string strDec = Encoding.UTF8.GetString(outBytes); return strDec; } /// <summary> /// 使用公钥加密,分段加密 /// </summary> /// <param name="content"></param> /// <param name="privateKeyPath"></param> /// <returns></returns> public static string EncrytByPublic(string publicKeyPath, string strEncryptString) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(ReadFile(publicKeyPath)); byte[] originalData = Encoding.UTF8.GetBytes(strEncryptString); if (originalData == null || originalData.Length <= 0) { throw new NotSupportedException(); } if (rsa == null) { throw new ArgumentNullException(); } byte[] encryContent = null; #region 分段加密 int bufferSize = (rsa.KeySize / 8) - 11; byte[] buffer = new byte[bufferSize]; //分段加密 using (MemoryStream input = new MemoryStream(originalData)) using (MemoryStream ouput = new MemoryStream()) { while (true) { int readLine = input.Read(buffer, 0, bufferSize); if (readLine <= 0) { break; } byte[] temp = new byte[readLine]; Array.Copy(buffer, 0, temp, 0, readLine); byte[] encrypt = rsa.Encrypt(temp, false); ouput.Write(encrypt, 0, encrypt.Length); } encryContent = ouput.ToArray(); } #endregion return Convert.ToBase64String(encryContent); } /// <summary> /// 通过私钥解密,分段解密 /// </summary> /// <param name="content"></param> /// <param name="privateKeyPath"></param> /// <returns></returns> public static string DecryptByPrivate(string privateKeyPath, string strDecryptString) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(ReadFile(privateKeyPath)); byte[] encryptData = Convert.FromBase64String(strDecryptString); //byte[] dencryContent = rsa.Decrypt(encryptData, false); byte[] dencryContent = null; #region 分段解密 if (encryptData == null || encryptData.Length <= 0) { throw new NotSupportedException(); } int keySize = rsa.KeySize / 8; byte[] buffer = new byte[keySize]; using (MemoryStream input = new MemoryStream(encryptData)) using (MemoryStream output = new MemoryStream()) { while (true) { int readLine = input.Read(buffer, 0, keySize); if (readLine <= 0) { break; } byte[] temp = new byte[readLine]; Array.Copy(buffer, 0, temp, 0, readLine); byte[] decrypt = rsa.Decrypt(temp, false); output.Write(decrypt, 0, decrypt.Length); } dencryContent = output.ToArray(); } #endregion return Encoding.UTF8.GetString(dencryContent); } /// <summary> /// 读取文件 /// </summary> /// <param name="filePath"></param> /// <returns></returns> public static string ReadFile(string filePath) { string content = ""; if (File.Exists(filePath)) { content = File.ReadAllText(filePath); byte[] mybyte = Encoding.UTF8.GetBytes(content); content = Encoding.UTF8.GetString(mybyte); } return content; } /// <summary> /// 将私钥转换成java所用的私钥字符串 /// </summary> /// <param name="privateKeyPath">私钥文件路径</param> /// <returns></returns> public static string RSAPrivateKeyDotNet2Java(string privateKeyPath) { XmlDocument doc = new XmlDocument(); doc.LoadXml(ReadFile(privateKeyPath)); BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText)); BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText)); BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText)); BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText)); BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText)); BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText)); BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText)); BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText)); RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv); PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam); byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded(); return Convert.ToBase64String(serializedPrivateBytes); } /// <summary> /// 将公钥转换成java所用的公钥字符串 /// </summary> /// <param name="publicKeyPath">公钥路径</param> /// <returns></returns> public static string RSAPublicKeyDotNet2Java(string publicKeyPath) { XmlDocument doc = new XmlDocument(); doc.LoadXml(ReadFile(publicKeyPath)); BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText)); BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText)); RsaKeyParameters pub = new RsaKeyParameters(false, m, p); SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub); byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded(); return Convert.ToBase64String(serializedPublicBytes); } } } |
2、java端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
import java.io.*; import java.util.Base64; public class Base64Utils { /** *//** * 文件读取缓冲区大小 */ private static final int CACHE_SIZE = 1024; /** *//** * <p> * BASE64字符串解码为二进制数据 * </p> * * @param base64 * @return * @throws Exception */ public static byte[] decode(String base64) throws Exception { //return Base64.decode(base64.getBytes()); //Base64.getEncoder().encodeToString("在Java 8中,Base64编码已经成为Java类库的标准。".getBytes("utf-8")); return Base64.getDecoder().decode(base64); } /** *//** * <p> * 二进制数据编码为BASE64字符串 * </p> * * @param bytes * @return * @throws Exception */ public static String encode(byte[] bytes) throws Exception { //return new String(Base64.encode(bytes)); return Base64.getEncoder().encodeToString(bytes); } /** *//** * <p> * 将文件编码为BASE64字符串 * </p> * <p> * 大文件慎用,可能会导致内存溢出 * </p> * * @param filePath 文件绝对路径 * @return * @throws Exception */ public static String encodeFile(String filePath) throws Exception { byte[] bytes = fileToByte(filePath); return encode(bytes); } /** *//** * <p> * BASE64字符串转回文件 * </p> * * @param filePath 文件绝对路径 * @param base64 编码字符串 * @throws Exception */ public static void decodeToFile(String filePath, String base64) throws Exception { byte[] bytes = decode(base64); byteArrayToFile(bytes, filePath); } /** *//** * <p> * 文件转换为二进制数组 * </p> * * @param filePath 文件路径 * @return * @throws Exception */ public static byte[] fileToByte(String filePath) throws Exception { byte[] data = new byte[0]; File file = new File(filePath); if (file.exists()) { FileInputStream in = null; ByteArrayOutputStream out = null; try{ in = new FileInputStream(file); out = new ByteArrayOutputStream(2048); byte[] cache = new byte[CACHE_SIZE]; int nRead = 0; while ((nRead = in.read(cache)) != -1) { out.write(cache, 0, nRead); out.flush(); } data = out.toByteArray(); }catch (Exception e){ e.printStackTrace(); }finally { if (in != null){ in.close(); } if (out != null){ out.close(); } } } return data; } /** *//** * <p> * 二进制数据写文件 * </p> * * @param bytes 二进制数据 * @param filePath 文件生成目录 */ public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception { InputStream in = null; OutputStream out = null; try{ in = new ByteArrayInputStream(bytes); File destFile = new File(filePath); if (!destFile.getParentFile().exists()) { destFile.getParentFile().mkdirs(); } destFile.createNewFile(); out = new FileOutputStream(destFile); byte[] cache = new byte[CACHE_SIZE]; int nRead = 0; while ((nRead = in.read(cache)) != -1) { out.write(cache, 0, nRead); out.flush(); } out.close(); in.close(); }catch (Exception e){ e.printStackTrace(); }finally { if (in != null){ in.close(); } if (out != null){ out.close(); } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 |
import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.math.BigInteger; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.*; import java.util.Base64; import java.util.HashMap; import java.util.Map; /** * 非对称加密解密 */ public class RSAEncryptProvider { /** * 加密算法RSA */ public static final String KEY_ALGORITHM = "RSA"; /** * 签名算法 */ public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; /** * 获取公钥的key */ private static final String PUBLIC_KEY = "RSAPublicKey"; /** * 获取私钥的key */ private static final String PRIVATE_KEY = "RSAPrivateKey"; /** * RSA最大加密明文大小 */ private static final int MAX_ENCRYPT_BLOCK = 117; /** * RSA最大解密密文大小 */ private static final int MAX_DECRYPT_BLOCK = 128; /** * <p> * 生成密钥对(公钥和私钥) * </p> * * @return * @throws Exception */ public static Map<String, Object> genKeyPair() throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, Object> keyMap = new HashMap<String, Object>(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; } /** * <p> * 用私钥对信息生成数字签名 * </p> * * @param msg 已加密数据 * @param privateKey 私钥(BASE64编码) * * @return * @throws Exception */ public static String sign(String msg, String privateKey) throws Exception { byte[] data = msg.getBytes(); byte[] keyBytes = Base64.getDecoder().decode(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initSign(privateK); signature.update(data); return Base64.getEncoder().encodeToString(signature.sign()); } /** * <p> * 校验数字签名 * </p> * * @param msg 已加密数据 * @param publicKey 公钥(BASE64编码) * @param sign 数字签名 * * @return * @throws Exception * */ public static boolean verify(String msg, String publicKey, String sign) throws Exception { byte[] data = msg.getBytes(); byte[] keyBytes = Base64.getDecoder().decode(publicKey); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); PublicKey publicK = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initVerify(publicK); signature.update(data); return signature.verify(Base64.getDecoder().decode(sign)); } /** * <P> * 私钥解密,进行分片解密,解密大文本 * </p> * * @param encryptedDataStr 已加密数据 * @param privateKey 私钥(BASE64编码) * @return * @throws Exception */ public static byte[] decryptByPrivateKey(byte[] encryptedDataStr, String privateKey) throws Exception { //byte[] encryptedData = Base64.getDecoder().decode(encryptedDataStr); byte[] encryptedData = encryptedDataStr; byte[] keyBytes = Base64.getDecoder().decode(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateK); int inputLen = encryptedData.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段解密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_DECRYPT_BLOCK) { cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else { cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_DECRYPT_BLOCK; } byte[] decryptedData = out.toByteArray(); out.close(); //return new String(decryptedData); return decryptedData; } /** * <p> * 公钥解密,进行分片解密,解密大文本 * </p> * * @param encryptedDataStr 已加密数据 * @param publicKey 公钥(BASE64编码) * @return * @throws Exception */ public static byte[] decryptByPublicKey(byte[] encryptedDataStr, String publicKey) throws Exception { //byte[] encryptedData = Base64.getDecoder().decode(encryptedDataStr); byte[] encryptedData = encryptedDataStr; byte[] keyBytes = Base64.getDecoder().decode(publicKey); X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key publicK = keyFactory.generatePublic(x509KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, publicK); int inputLen = encryptedData.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段解密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_DECRYPT_BLOCK) { cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else { cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_DECRYPT_BLOCK; } byte[] decryptedData = out.toByteArray(); out.close(); //return new String(decryptedData); return decryptedData; } /** * <p> * 公钥加密,进行分片加密,加密大文本 * </p> * * @param data 源数据 * @param publicKey 公钥(BASE64编码) * @return * @throws Exception */ public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception { byte[] keyBytes = Base64.getDecoder().decode(publicKey); X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key publicK = keyFactory.generatePublic(x509KeySpec); // 对数据加密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicK); int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段加密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData = out.toByteArray(); out.close(); //String encryptedDataStr = Base64.getEncoder().encodeToString(encryptedData); return encryptedData; } /** * <p> * 私钥加密,进行分片加密,加密大文本 * </p> * * @param data 源数据 * @param privateKey 私钥(BASE64编码) * @return * @throws Exception */ public static byte[] encryptByPrivateKey(byte[] data, String privateKey) throws Exception { byte[] keyBytes = Base64.getDecoder().decode(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateK); int inputLen = data.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段加密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData = out.toByteArray(); out.close(); //String encryptedDataStr = Base64.getEncoder().encodeToString(encryptedData); return encryptedData; } /** * <p> * 获取私钥 * </p> * * @param keyMap 密钥对 * @return * @throws Exception */ public static String getPrivateKey(Map<String, Object> keyMap) throws Exception { Key key = (Key) keyMap.get(PRIVATE_KEY); return Base64.getEncoder().encodeToString(key.getEncoded()); } /** * <p> * 获取公钥 * </p> * * @param keyMap 密钥对 * @return * @throws Exception */ public static String getPublicKey(Map<String, Object> keyMap) throws Exception { Key key = (Key) keyMap.get(PUBLIC_KEY); return Base64.getEncoder().encodeToString(key.getEncoded()); } /** * 通过C#的RSACryptoServiceProvider类产生的公钥进行转换成java的公钥 * @param modulus * @param exponent * @return */ public static PublicKey getPublicKey(String modulus, String exponent) { try { byte[] m = Base64Utils.decode(modulus); byte[] e = Base64Utils.decode(exponent); BigInteger b1 = new BigInteger(1,m); BigInteger b2 = new BigInteger(1,e); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2); return (RSAPublicKey) keyFactory.generatePublic(keySpec); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 通过C#的RSACryptoServiceProvider类产生的私钥进行转换成java的私钥 * @param modulus * @param privateExponent * @return */ public PrivateKey getPrivateKey(String modulus,String privateExponent) throws Exception { BigInteger m = new BigInteger(modulus); BigInteger e = new BigInteger(privateExponent); RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m,e); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); return privateKey; } public static void main(String[] args) throws Exception { //通过C#公钥文件转换的java公钥字符串 String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCYyiJ5biYwnsRE2RgqI6rEsmxySuoxRAKBPkxZwBN2+NTb4KNr8JUtaD8Fj+NV1+eEspm8MT519PJRwCxOGxf/qU3CqCnTwxoc3MrN3MwxeQ1FC2wZkEm8y8FZKWd84udULxML+7ao1bCYWeDerd2MBWvKBpEqoG28jY3yY1AGbQIDAQAB"; //通过C#私钥文件转换的java私钥字符串 String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJjKInluJjCexETZGCojqsSybHJK6jFEAoE+TFnAE3b41Nvgo2vwlS1oPwWP41XX54SymbwxPnX08lHALE4bF/+pTcKoKdPDGhzcys3czDF5DUULbBmQSbzLwVkpZ3zi51QvEwv7tqjVsJhZ4N6t3YwFa8oGkSqgbbyNjfJjUAZtAgMBAAECgYAZ5PAQymU4ij/TN0PMKH1Rlregayfjr5YJF2jTMSVbXXKdzSWFLqHpryg3JhquOsgnCinZ5jKixR+oUTxxBFB9pcduLPpiQ+91hhebSGoR/09MgqFFg0Qx5/0dAgl0GpFGXPi3B6AM/8IJ6aGtQd/SIyo7LcRU+824kVufo/Z9IQJBAMYQq4lYpJFAKPvfJEstT5v02mHr01h7pNOBYkloQs2ZShTDfXicInzVmDaQ4CXCrTZC7Ud3pJD4my//1a+FelUCQQDFey8gpeqqAnwDd6CgIhCktjvr3OFGrZdazg8A2oHg/77GRichstx19wMYgx5Tb/Ezx+9wWqog0eRgkfAunSO5AkByLBXVnGVw3T1Cw4RWWY40Zlakb55quQtwaHrRueoYPi63/WCMb+RpdW7CtYyf97KFPtssgUk50DUU3DK/dP/pAkAgz8PXz9l6n+kNBm5YzPAo/eJc4RlJDgSs4LnbcXLM+JExDmzoC3jX3M/V3ctHH71a1ihxaY8E3vrsFLNse015AkBV7cm3Z2DU9mJkYLfLR2oT0T5d6RQpGWs8hJlvVFZC6q904+1uRJq8T3zyUHvEeF3xa1C7ONd4Fm/rNf7e1/5F"; //公钥加密 String data = testPublicEncrypt("abc12345555555555554444444444" + "4444444444444444444444444444444444444" + "44444444444444444444444444444444444444" + "44444444444444444444444444444444444444" + "44444444444444444444444444444444444" + "444444444444444444444444444444444444" + "444444444444444444444444444444444444" + "555555555555555555555555555555555" + "5555555555555555555555555555555",publicKey); System.out.println(data); //私钥解密 data = testPrivateDencrypt(data,privateKey); System.out.println(data); //私钥加密 data = testPrivateEncrypt("abc12345555555555554444444444" + "4444444444444444444444444444444444444" + "44444444444444444444444444444444444444" + "44444444444444444444444444444444444444" + "44444444444444444444444444444444444" + "444444444444444444444444444444444444" + "444444444444444444444444444444444444" + "555555555555555555555555555555555" + "5555555555555555555555555555555",privateKey); System.out.println(data); //公钥解密 data = testPublicDecrypt(data,publicKey); System.out.println(data); } /** * 测试公钥加密 * @param content 要加密的字符串 * @return * @throws Exception */ private static String testPublicEncrypt(String content,String publicKey)throws Exception{ byte[] entryData = RSAEncryptProvider.encryptByPublicKey(content.getBytes("UTF-8"), publicKey); return Base64Utils.encode(entryData); } /** * 测试私钥解密 * @param content * @return * @throws Exception */ private static String testPrivateDencrypt(String content,String privateKey)throws Exception{ byte[] dentryData = RSAEncryptProvider.decryptByPrivateKey(Base64Utils.decode(content),privateKey); return new String(dentryData,"UTF-8"); } /** * 测试通过私钥加密 * @param content * @param privateKey * @return * @throws Exception */ private static String testPrivateEncrypt(String content,String privateKey)throws Exception{ byte[] entryData = RSAEncryptProvider.encryptByPrivateKey(content.getBytes("UTF-8"), privateKey); return Base64Utils.encode(entryData); } /** * 测试通过公钥解密 * @param content * @param publicKey * @return * @throws Exception */ private static String testPublicDecrypt(String content,String publicKey)throws Exception{ byte[] dentryData = RSAEncryptProvider.decryptByPublicKey(Base64Utils.decode(content),publicKey); return new String(dentryData,"UTF-8"); } } |
代码下载地址:https://download.csdn.net/download/lengyue2015/10930794 from:https://blog.csdn.net/lengyue2015/article/details/86582177
View Details