mac下的svn syncrosvn keygen算法

杜楚
2023-12-01

syncrosvn 的优点就不说了,全操作系统的svn,默认试用30天,提供keygen算法,仅供学习,请不用用于非法目的。否则后果自负

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.apache.commons.codec.binary.Base64;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Keygen {

    private SimpleDateFormat      sdf        = new SimpleDateFormat(STRING_SET[21], Locale.US);

    private static byte[]         key        = { 48, -126, 1, 76, 2, 1, 0, 48, -126, 1, 44, 6, 7,
            42, -122, 72, -50, 56, 4, 1, 48, -126, 1, 31, 2, -127, -127, 0, -3, 127, 83, -127, 29,
            117, 18, 41, 82, -33, 74, -100, 46, -20, -28, -25, -10, 17, -73, 82, 60, -17, 68, 0,
            -61, 30, 63, -128, -74, 81, 38, 105, 69, 93, 64, 34, 81, -5, 89, 61, -115, 88, -6, -65,
            -59, -11, -70, 48, -10, -53, -101, 85, 108, -41, -127, 59, -128, 29, 52, 111, -14, 102,
            96, -73, 107, -103, 80, -91, -92, -97, -97, -24, 4, 123, 16, 34, -62, 79, -69, -87,
            -41, -2, -73, -58, 27, -8, 59, 87, -25, -58, -88, -90, 21, 15, 4, -5, -125, -10, -45,
            -59, 30, -61, 2, 53, 84, 19, 90, 22, -111, 50, -10, 117, -13, -82, 43, 97, -41, 42,
            -17, -14, 34, 3, 25, -99, -47, 72, 1, -57, 2, 21, 0, -105, 96, 80, -113, 21, 35, 11,
            -52, -78, -110, -71, -126, -94, -21, -124, 11, -16, 88, 28, -11, 2, -127, -127, 0, -9,
            -31, -96, -123, -42, -101, 61, -34, -53, -68, -85, 92, 54, -72, 87, -71, 121, -108,
            -81, -69, -6, 58, -22, -126, -7, 87, 76, 11, 61, 7, -126, 103, 81, 89, 87, -114, -70,
            -44, 89, 79, -26, 113, 7, 16, -127, -128, -76, 73, 22, 113, 35, -24, 76, 40, 22, 19,
            -73, -49, 9, 50, -116, -56, -90, -31, 60, 22, 122, -117, 84, 124, -115, 40, -32, -93,
            -82, 30, 43, -77, -90, 117, -111, 110, -93, 127, 11, -6, 33, 53, 98, -15, -5, 98, 122,
            1, 36, 59, -52, -92, -15, -66, -88, 81, -112, -119, -88, -125, -33, -31, 90, -27, -97,
            6, -110, -117, 102, 94, -128, 123, 85, 37, 100, 1, 76, 59, -2, -49, 73, 42, 4, 23, 2,
            21, 0, -106, -49, 66, -124, -79, -94, -48, -108, 26, -46, -57, -110, -117, 14, -38, 1,
            -77, -127, 0, 14                };

    private static byte[]         key2       = { 48, -127, -15, 48, -127, -88, 6, 7, 42, -122, 72,
            -50, 56, 4, 1, 48, -127, -100, 2, 65, 0, -4, -90, -126, -50, -114, 18, -54, -70, 38,
            -17, -52, -9, 17, 14, 82, 109, -80, 120, -80, 94, -34, -53, -51, 30, -76, -94, 8, -13,
            -82, 22, 23, -82, 1, -13, 91, -111, -92, 126, 109, -10, 52, 19, -59, -31, 46, -48,
            -119, -101, -51, 19, 42, -51, 80, -39, -111, 81, -67, -60, 62, -25, 55, 89, 46, 23, 2,
            21, 0, -106, 46, -35, -52, 54, -100, -70, -114, -69, 38, 14, -26, -74, -95, 38, -39,
            52, 110, 56, -59, 2, 64, 103, -124, 113, -78, 122, -100, -12, 78, -23, 26, 73, -59, 20,
            125, -79, -87, -86, -14, 68, -16, 90, 67, 77, 100, -122, -109, 29, 45, 20, 39, 27, -98,
            53, 3, 11, 113, -3, 115, -38, 23, -112, 105, -77, 46, 41, 53, 99, 14, 28, 32, 98, 53,
            77, 13, -94, 10, 108, 65, 110, 80, -66, 121, 76, -92, 3, 68, 0, 2, 65, 0, -18, -51, 60,
            -47, 119, -65, 87, -108, -13, -86, 29, 120, -70, -38, 7, 27, -54, 55, -100, 79, -47,
            35, 2, 106, -4, 39, -25, -51, -122, 49, -2, 73, -108, -107, -118, -106, 8, 43, -8,
            -114, -76, 5, -122, 35, -20, -56, -51, 110, -62, 38, -74, 26, 11, -17, 47, -68, -17,
            104, 120, -92, 28, 5, 47, 69    };

    private String                regName;

    private String                company;

    private static final String[] STRING_SET = new String[22];

    static {
        STRING_SET[0] = "SHA1withDSA";
        STRING_SET[1] = "Registration name : ";
        STRING_SET[2] = "Company           : ";
        STRING_SET[3] = "License: ";
        STRING_SET[4] = "================================================";
        STRING_SET[5] = "==================================================";
        STRING_SET[6] = "=== Syncro SVN Client v8.x license generator ===";
        STRING_SET[7] = "[Author, Author-Component, XML-Editor, XSLT-Debugger, SVN-Client, Saxon-SA, Diff-Srv, Diff-App, 1]";
        STRING_SET[8] = "Enterprise";
        STRING_SET[9] = "9999";
        STRING_SET[10] = "BADCEFGHIJKLNMOPQRSTUVWXZY0123456789 _-.@";
        STRING_SET[11] = "DSA";
        STRING_SET[12] = "Company=";
        STRING_SET[13] = "Duration=-";
        STRING_SET[14] = "Version=8";
        STRING_SET[15] = "Date=";
        STRING_SET[16] = "Registration_Name=";
        STRING_SET[17] = "Category=Enterprise";
        STRING_SET[18] = "Number_of_Licenses=" + STRING_SET[9];
        STRING_SET[19] = "Component=Author,Author-Component,XML-Editor,XSLT-Debugger,SVN-Client,Saxon-SA,Diff-Srv,Diff-App,1";
        STRING_SET[20] = "SGN=";
        STRING_SET[21] = "MM-dd-yyyy";
    }

    private static PrivateKey getPrivateKey() throws InvalidKeySpecException,
            NoSuchAlgorithmException {

        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(key);
        return KeyFactory.getInstance(STRING_SET[11]).generatePrivate(spec); // pkcs8生成私钥

        //        X509EncodedKeySpec encodeKeySpec = new X509EncodedKeySpec(key2);
        //        KeyFactory keyFactory = KeyFactory.getInstance("DSA");
        //        PublicKey key = keyFactory.generatePublic(encodeKeySpec); // x509生成公钥
    }

    private static String replaceAll(String s) {
        StringBuffer sb = new StringBuffer(s);

        for (int i = 0; i < sb.length(); i++) {
            if (STRING_SET[10].indexOf(Character.toUpperCase(sb.charAt(i))) == -1) {
                sb.setCharAt(i, '_');
            }
        }

        return sb.toString();
    }

    private static String inputContent(BufferedReader in, String value) throws IOException {

        String str = null;

        do {
            System.out.print(value);
            System.out.flush();
            str = in.readLine();
            if (str == null) {
                break;
            }
        } while (str.trim().length() == 0);

        return str;
    }

    public Keygen(String regName, String company) {
        this.regName = regName;
        this.company = company;
    }

    private String assemble() throws Exception {
        StringBuffer sb = new StringBuffer();

        sb.append(replaceAll(this.regName));
        sb.append(replaceAll(this.company));
        sb.append(sdf.format(new Date()));
        sb.append("0");
        sb.append(STRING_SET[9]);
        sb.append(replaceAll(STRING_SET[8]));
        sb.append(replaceAll(STRING_SET[7]));
        sb.append(replaceAll("8"));

        return sb.toString();
    }

    private String encode() throws Exception {
        Signature sign = Signature.getInstance(STRING_SET[0]);
        sign.initSign(getPrivateKey());
        sign.update(assemble().getBytes());
        return Base64.encodeBase64String(sign.sign());
    }

    private String genarate() throws Exception {
        StringBuffer sb = new StringBuffer();

        sb.append(STRING_SET[16] + this.regName).append('\n');
        sb.append(STRING_SET[12] + this.company).append('\n');
        sb.append(STRING_SET[15]).append(sdf.format(new Date())).append('\n');
        sb.append(STRING_SET[13]).append('\n');
        sb.append(STRING_SET[18]).append('\n');
        sb.append(STRING_SET[17]).append('\n');
        sb.append(STRING_SET[19]).append('\n');
        sb.append(STRING_SET[14]).append('\n');
        sb.append(STRING_SET[20] + encode());

        return sb.toString();
    }

    public static void main(String[] args) {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        try {
            System.out.println(STRING_SET[4]);
            System.out.println(STRING_SET[6]);
            System.out.println(STRING_SET[4]);
            System.out.println();
            String regName = inputContent(in, STRING_SET[1]);
            String company = inputContent(in, STRING_SET[2]);
            System.out.println();
            System.out.println(STRING_SET[5]);
            System.out.println(STRING_SET[3]);
            System.out.println(STRING_SET[5]);
            System.out.println();
            System.out.println(new Keygen(regName, company).genarate());
            System.out.println();
            System.out.println(STRING_SET[5]);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (IOException e) {
            }
        }
    }

}

 

 

 

 

 

 类似资料: