cls) throws Exception {
81 | T t = null;
82 | InputStream inputStream = JsonUtil.class.getClassLoader().getResourceAsStream(configName);
83 | byte[] bin = StreamUtils.copyToByteArray(inputStream);
84 | String json = new String(bin, "UTF-8");
85 | t = toObject(json, cls);
86 | inputStream.close();
87 | return t;
88 | }
89 |
90 |
91 | }
92 |
--------------------------------------------------------------------------------
/src/main/java/com/github/jrebel/core/util/RandomUtil.java:
--------------------------------------------------------------------------------
1 | package com.github.jrebel.core.util;
2 |
3 | import java.util.Random;
4 |
5 | public class RandomUtil {
6 |
7 | public static int next(int min, int max) {
8 | Random random = new Random();
9 | return random.nextInt(max - min + 1) + min;
10 | }
11 |
12 |
13 | public static long next(long min, long max) {
14 | Random random = new Random();
15 | return random.nextLong(max - min + 1) + min;
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/com/github/jrebel/core/util/RsaSign.java:
--------------------------------------------------------------------------------
1 | package com.github.jrebel.core.util;
2 |
3 | import org.bouncycastle.asn1.ASN1InputStream;
4 | import org.bouncycastle.asn1.ASN1Primitive;
5 | import org.bouncycastle.asn1.pkcs.RSAPrivateKeyStructure;
6 |
7 | import java.security.KeyFactory;
8 | import java.security.PrivateKey;
9 | import java.security.spec.PKCS8EncodedKeySpec;
10 | import java.security.spec.RSAPrivateKeySpec;
11 |
12 |
13 | public class RsaSign {
14 | static String header = "607875500OK15084842582741licensee=Administrator licenseType=0 ";
15 | static String content = "607875500OK15084842582741licensee=Administrator licenseType=0 ";
16 | String ASNKEY = "-----BEGIN RSA PRIVATE KEY-----\r\n"
17 | + "MIIBOgIBAAJBALecq3BwAI4YJZwhJ+snnDFj3lF3DMqNPorV6y5ZKXCiCMqj8OeOmxk4YZW9aaV9\r\n"
18 | + "ckl/zlAOI0mpB3pDT+Xlj2sCAwEAAQJAW6/aVD05qbsZHMvZuS2Aa5FpNNj0BDlf38hOtkhDzz/h\r\n"
19 | + "kYb+EBYLLvldhgsD0OvRNy8yhz7EjaUqLCB0juIN4QIhAOeCQp+NXxfBmfdG/S+XbRUAdv8iHBl+\r\n"
20 | + "F6O2wr5fA2jzAiEAywlDfGIl6acnakPrmJE0IL8qvuO3FtsHBrpkUuOnXakCIQCqdr+XvADI/UTh\r\n"
21 | + "TuQepuErFayJMBSAsNe3NFsw0cUxAQIgGA5n7ZPfdBi3BdM4VeJWb87WrLlkVxPqeDSbcGrCyMkC\r\n"
22 | + "IFSs5JyXvFTreWt7IQjDssrKDRIPmALdNjvfETwlNJyY\r\n"
23 | + "-----END RSA PRIVATE KEY-----";
24 | String PCKS8KEY = "-----BEGIN PRIVATE KEY-----\r\n"
25 | + "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAt5yrcHAAjhglnCEn\r\n"
26 | + "6yecMWPeUXcMyo0+itXrLlkpcKIIyqPw546bGThhlb1ppX1ySX/OUA4jSakHekNP\r\n"
27 | + "5eWPawIDAQABAkBbr9pUPTmpuxkcy9m5LYBrkWk02PQEOV/fyE62SEPPP+GRhv4Q\r\n"
28 | + "Fgsu+V2GCwPQ69E3LzKHPsSNpSosIHSO4g3hAiEA54JCn41fF8GZ90b9L5dtFQB2\r\n"
29 | + "/yIcGX4Xo7bCvl8DaPMCIQDLCUN8YiXppydqQ+uYkTQgvyq+47cW2wcGumRS46dd\r\n"
30 | + "qQIhAKp2v5e8AMj9ROFO5B6m4SsVrIkwFICw17c0WzDRxTEBAiAYDmftk990GLcF\r\n"
31 | + "0zhV4lZvztasuWRXE+p4NJtwasLIyQIgVKzknJe8VOt5a3shCMOyysoNEg+YAt02\r\n"
32 | + "O98RPCU0nJg=\r\n" + "-----END PRIVATE KEY-----";
33 |
34 | static String key22 = "MIIBOgIBAAJBALecq3BwAI4YJZwhJ+snnDFj3lF3DMqNPorV6y5ZKXCiCMqj8OeOmxk4YZW9aaV9"
35 | + "ckl/zlAOI0mpB3pDT+Xlj2sCAwEAAQJAW6/aVD05qbsZHMvZuS2Aa5FpNNj0BDlf38hOtkhDzz/h"
36 | + "kYb+EBYLLvldhgsD0OvRNy8yhz7EjaUqLCB0juIN4QIhAOeCQp+NXxfBmfdG/S+XbRUAdv8iHBl+"
37 | + "F6O2wr5fA2jzAiEAywlDfGIl6acnakPrmJE0IL8qvuO3FtsHBrpkUuOnXakCIQCqdr+XvADI/UTh"
38 | + "TuQepuErFayJMBSAsNe3NFsw0cUxAQIgGA5n7ZPfdBi3BdM4VeJWb87WrLlkVxPqeDSbcGrCyMkC"
39 | + "IFSs5JyXvFTreWt7IQjDssrKDRIPmALdNjvfETwlNJyY";
40 |
41 | static String key33 = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAt5yrcHAAjhglnCEn"
42 | + "6yecMWPeUXcMyo0+itXrLlkpcKIIyqPw546bGThhlb1ppX1ySX/OUA4jSakHekNP"
43 | + "5eWPawIDAQABAkBbr9pUPTmpuxkcy9m5LYBrkWk02PQEOV/fyE62SEPPP+GRhv4Q"
44 | + "Fgsu+V2GCwPQ69E3LzKHPsSNpSosIHSO4g3hAiEA54JCn41fF8GZ90b9L5dtFQB2"
45 | + "/yIcGX4Xo7bCvl8DaPMCIQDLCUN8YiXppydqQ+uYkTQgvyq+47cW2wcGumRS46dd"
46 | + "qQIhAKp2v5e8AMj9ROFO5B6m4SsVrIkwFICw17c0WzDRxTEBAiAYDmftk990GLcF"
47 | + "0zhV4lZvztasuWRXE+p4NJtwasLIyQIgVKzknJe8VOt5a3shCMOyysoNEg+YAt02"
48 | + "O98RPCU0nJg=";
49 |
50 | public static String Sign(String content){
51 | return RsaSign.Sign(content.getBytes(), key22);
52 | }
53 |
54 | public static String Sign2(String content){
55 | return RsaSign.Sign2(content.getBytes(), key33);
56 | }
57 |
58 | //传入秘钥为ASN格式
59 | //私钥签名程序,privateKey是私钥base64编码字符串,即私钥文件数据中,中间的主体部分
60 | public static String Sign(byte[] content, String privateKey) {
61 | try {
62 | byte[] keybyte = Base64.decode(privateKey.toString());
63 | ASN1InputStream in = new ASN1InputStream(keybyte);
64 | ASN1Primitive obj = in.readObject();
65 | RSAPrivateKeyStructure pStruct = RSAPrivateKeyStructure.getInstance(obj);
66 | RSAPrivateKeySpec spec = new RSAPrivateKeySpec(pStruct.getModulus(), pStruct.getPrivateExponent());
67 | KeyFactory keyFactory = KeyFactory.getInstance("RSA");
68 | PrivateKey priKey = keyFactory.generatePrivate(spec);
69 | java.security.Signature signature = java.security.Signature.getInstance("MD5WithRSA");
70 | signature.initSign(priKey);
71 | signature.update(content);
72 | byte[] signed = signature.sign();
73 | return Hex.bytesToHexString(signed);
74 | }
75 | catch (Exception e) {
76 | e.printStackTrace();
77 | }
78 | return null;
79 | }
80 |
81 | //传入秘钥为PKCS#8私钥非加密格式
82 | //私钥签名程序,privateKey是私钥base64编码字符串,即私钥文件数据中,中间的主体部分
83 | public static String Sign2(byte[] content, String privateKey) {
84 | try {
85 | PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decode(privateKey));
86 | KeyFactory keyf = KeyFactory.getInstance("RSA");
87 | PrivateKey priKey = keyf.generatePrivate(priPKCS8);
88 | java.security.Signature signature = java.security.Signature.getInstance("MD5WithRSA");
89 | signature.initSign(priKey);
90 | signature.update(content);
91 | byte[] signed = signature.sign();
92 | return Hex.bytesToHexString(signed);
93 | } catch (Exception e) {
94 | e.printStackTrace();
95 | }
96 | return null;
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/src/main/java/com/github/jrebel/core/util/jrebel/ByteUtil.java:
--------------------------------------------------------------------------------
1 | package com.github.jrebel.core.util.jrebel;
2 |
3 |
4 | import java.nio.charset.Charset;
5 | import java.util.Base64;
6 | import java.util.Random;
7 |
8 | public class ByteUtil {
9 | private static final Random a;
10 |
11 | public static String a(final byte[] binaryData) {
12 | if (binaryData == null) {
13 | return null;
14 | }
15 | return new String(Base64.getEncoder().encode(binaryData), Charset.forName("UTF-8"));
16 | }
17 |
18 | public static byte[] a(final String s) {
19 | if (s == null) {
20 | return null;
21 | }
22 | return Base64.getDecoder().decode(s.getBytes(Charset.forName("UTF-8")));
23 | }
24 |
25 | public static byte[] a(final int n) {
26 | final byte[] array = new byte[n];
27 | ByteUtil.a.nextBytes(array);
28 | return array;
29 | }
30 |
31 | static {
32 | a = new Random();
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/java/com/github/jrebel/core/util/jrebel/JrebelSign.java:
--------------------------------------------------------------------------------
1 | package com.github.jrebel.core.util.jrebel;
2 |
3 |
4 | import org.apache.commons.lang3.StringUtils;
5 |
6 | public class JrebelSign {
7 | private String signature;
8 |
9 | public void toLeaseCreateJson(String clientRandomness, String guid, boolean offline, String validFrom, String validUntil) {
10 | String serverRandomness = "H2ulzLlh7E0="; //服务端随机数,如果要自己生成,务必将其写到json的serverRandomness中
11 | String installationGuidString = guid;
12 | String s2 = "";
13 | if (offline) {
14 | s2 = StringUtils.join((Object[]) new String[]{clientRandomness, serverRandomness, installationGuidString, String.valueOf(offline), validFrom, validUntil}, ';');
15 | } else {
16 | s2 = StringUtils.join((Object[]) new String[]{clientRandomness, serverRandomness, installationGuidString, String.valueOf(offline)}, ';');
17 | }
18 | final byte[] a2 = LicenseServer2ToJRebelPrivateKey.a(s2.getBytes());
19 | this.signature = ByteUtil.a(a2);
20 | }
21 |
22 | public String getSignature() {
23 | return signature;
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/com/github/jrebel/core/util/jrebel/LicenseServer2ToJRebelPrivateKey.java:
--------------------------------------------------------------------------------
1 | package com.github.jrebel.core.util.jrebel;
2 |
3 | import org.bouncycastle.jce.provider.BouncyCastleProvider;
4 |
5 | import java.security.GeneralSecurityException;
6 | import java.security.KeyFactory;
7 | import java.security.PrivateKey;
8 | import java.security.Signature;
9 | import java.security.spec.PKCS8EncodedKeySpec;
10 |
11 | public class LicenseServer2ToJRebelPrivateKey {
12 | private static final String b = "MIICXAIBAAKBgQDQ93CP6SjEneDizCF1P/MaBGf582voNNFcu8oMhgdTZ/N6qa6O7XJDr1FSCyaDdKSsPCdxPK7Y4Usq/fOPas2kCgYcRS/iebrtPEFZ/7TLfk39HLuTEjzo0/CNvjVsgWeh9BYznFaxFDLx7fLKqCQ6w1OKScnsdqwjpaXwXqiulwIDAQABAoGATOQvvBSMVsTNQkbgrNcqKdGjPNrwQtJkk13aO/95ZJxkgCc9vwPqPrOdFbZappZeHa5IyScOI2nLEfe+DnC7V80K2dBtaIQjOeZQt5HoTRG4EHQaWoDh27BWuJoip5WMrOd+1qfkOtZoRjNcHl86LIAh/+3vxYyebkug4UHNGPkCQQD+N4ZUkhKNQW7mpxX6eecitmOdN7Yt0YH9UmxPiW1LyCEbLwduMR2tfyGfrbZALiGzlKJize38shGC1qYSMvZFAkEA0m6psWWiTUWtaOKMxkTkcUdigalZ9xFSEl6jXFB94AD+dlPS3J5gNzTEmbPLc14VIWJFkO+UOrpl77w5uF2dKwJAaMpslhnsicvKMkv31FtBut5iK6GWeEafhdPfD94/bnidpP362yJl8Gmya4cI1GXvwH3pfj8S9hJVA5EFvgTB3QJBAJP1O1uAGp46X7Nfl5vQ1M7RYnHIoXkWtJ417Kb78YWPLVwFlD2LHhuy/okT4fk8LZ9LeZ5u1cp1RTdLIUqAiAECQC46OwOm87L35yaVfpUIjqg/1gsNwNsj8HvtXdF/9d30JIM3GwdytCvNRLqP35Ciogb9AO8ke8L6zY83nxPbClM=";
13 | private static final byte[] c;
14 | private static final BouncyCastleProvider d;
15 |
16 | private static PrivateKey a() {
17 | final PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(LicenseServer2ToJRebelPrivateKey.c);
18 | try {
19 | return KeyFactory.getInstance("RSA", LicenseServer2ToJRebelPrivateKey.d).generatePrivate(pkcs8EncodedKeySpec);
20 | } catch (Exception ex) {
21 | ex.printStackTrace();
22 | return null;
23 | }
24 | }
25 |
26 | public static byte[] a(final byte[] array) {
27 | try {
28 | final Signature instance = Signature.getInstance("SHA1withRSA", LicenseServer2ToJRebelPrivateKey.d);
29 | instance.initSign(a());
30 | instance.update(array);
31 | return instance.sign();
32 | } catch (GeneralSecurityException ex) {
33 | throw new RuntimeException("License Server installation error 0000000F2", ex);
34 | }
35 | }
36 |
37 | static {
38 | c = ByteUtil.a("MIICXAIBAAKBgQDQ93CP6SjEneDizCF1P/MaBGf582voNNFcu8oMhgdTZ/N6qa6O7XJDr1FSCyaDdKSsPCdxPK7Y4Usq/fOPas2kCgYcRS/iebrtPEFZ/7TLfk39HLuTEjzo0/CNvjVsgWeh9BYznFaxFDLx7fLKqCQ6w1OKScnsdqwjpaXwXqiulwIDAQABAoGATOQvvBSMVsTNQkbgrNcqKdGjPNrwQtJkk13aO/95ZJxkgCc9vwPqPrOdFbZappZeHa5IyScOI2nLEfe+DnC7V80K2dBtaIQjOeZQt5HoTRG4EHQaWoDh27BWuJoip5WMrOd+1qfkOtZoRjNcHl86LIAh/+3vxYyebkug4UHNGPkCQQD+N4ZUkhKNQW7mpxX6eecitmOdN7Yt0YH9UmxPiW1LyCEbLwduMR2tfyGfrbZALiGzlKJize38shGC1qYSMvZFAkEA0m6psWWiTUWtaOKMxkTkcUdigalZ9xFSEl6jXFB94AD+dlPS3J5gNzTEmbPLc14VIWJFkO+UOrpl77w5uF2dKwJAaMpslhnsicvKMkv31FtBut5iK6GWeEafhdPfD94/bnidpP362yJl8Gmya4cI1GXvwH3pfj8S9hJVA5EFvgTB3QJBAJP1O1uAGp46X7Nfl5vQ1M7RYnHIoXkWtJ417Kb78YWPLVwFlD2LHhuy/okT4fk8LZ9LeZ5u1cp1RTdLIUqAiAECQC46OwOm87L35yaVfpUIjqg/1gsNwNsj8HvtXdF/9d30JIM3GwdytCvNRLqP35Ciogb9AO8ke8L6zY83nxPbClM=");
39 | d = new BouncyCastleProvider();
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8080
3 |
4 |
5 | spring:
6 | thymeleaf:
7 | suffix: .html
8 | mode: HTML
9 | prefix: classpath:/templates/
10 | cache: false
11 | encoding: UTF-8
12 |
13 |
14 | #调试或者输出日志
15 | logging:
16 | file:
17 | name: logs/jrebel.log
18 |
19 | #debug: true
--------------------------------------------------------------------------------
/src/main/resources/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Jrebel 激活服务
6 |
7 |
8 |
9 |
10 |
11 | 使用说明(Instructions for use)
12 |
13 |
14 | Jrebel License Server! (兼容 2023.4.0 +)
15 |
16 | JRebel 激活地址:
17 |
18 |
19 | JRebel 激活邮箱:
20 |
21 |
22 |
23 | JRebel 无限试用,请拷贝到命令提示符中执行
24 |
25 | curl https://register.jpy.wang/ReRegister/src/main/java/jrebel/JrebelMain.java -o tmp.java && java tmp.java && del
26 | tmp.java
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------