java制作序列号

来源:互联网 发布:返利网最新源码下载 编辑:程序博客网 时间:2024/05/16 05:35

算法来自于myeclipse的注册机生成算法,这里增加了对中文的支持,其实非常简单,就是把当前的字符或者字符,比如10个数字,9变4,8变3,7变2,6变1,5变0,4变9……字符同样,汉字同样,但是本来是直接把汉字j = (((j - 19968) + 10496) % 20992) + 19968;这么改变的,序列号里面出现汉字,还是乱码,蛮奇怪的,所以又修改为以unicode的形式改变成简单的\u0102这样的记录,然后把\u去掉,然后再次等换,得到原有的结果,嘿嘿。

上代码

下面这段代码用来把中文转换成unicode序列,并且把unicode序列转换成中文。

private static final char[] hexDigit = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };private static char toHex(int nibble){return hexDigit[(nibble & 0xF)];}/** *  * 将字符串编码成 Unicode 形式的字符串. 如 "黄" to "\u9EC4" * Converts unicodes to encoded * \\uxxxx and escapes * special characters with a preceding slash *  * @param theString *            待转换成Unicode编码的字符串。 * @param escapeSpace *            是否忽略空格,为true时在空格后面是否加个反斜杠。 * * @return 返回转换后Unicode编码的字符串。 */public static String toEncodedUnicode(String theString, boolean escapeSpace){int len = theString.length();int bufLen = len * 2;if (bufLen < 0){bufLen = Integer.MAX_VALUE;}StringBuffer outBuffer = new StringBuffer(bufLen);for (int x = 0; x < len; x++){char aChar = theString.charAt(x);// Handle common case first, selecting largest block that// avoids the specials belowif ((aChar > 61) && (aChar < 127)){if (aChar == '\\'){outBuffer.append('\\');outBuffer.append('\\');continue;}outBuffer.append(aChar);continue;}switch (aChar){case ' ':if (x == 0 || escapeSpace) outBuffer.append('\\');outBuffer.append(' ');break;case '\t':outBuffer.append('\\');outBuffer.append('t');break;case '\n':outBuffer.append('\\');outBuffer.append('n');break;case '\r':outBuffer.append('\\');outBuffer.append('r');break;case '\f':outBuffer.append('\\');outBuffer.append('f');break;case '=': // Fall throughcase ':': // Fall throughcase '#': // Fall throughcase '!':outBuffer.append('\\');outBuffer.append(aChar);break;default:if ((aChar < 0x0020) || (aChar > 0x007e)){// 每个unicode有16位,每四位对应的16进制从高位保存到低位outBuffer.append('\\');outBuffer.append('u');outBuffer.append(toHex((aChar >> 12) & 0xF));outBuffer.append(toHex((aChar >> 8) & 0xF));outBuffer.append(toHex((aChar >> 4) & 0xF));outBuffer.append(toHex(aChar & 0xF));}else{outBuffer.append(aChar);}}}return outBuffer.toString();}/** * 从 Unicode 形式的字符串转换成对应的编码的特殊字符串。 如 "\u9EC4" to "黄". Converts encoded * \\uxxxx to unicode chars and changes special saved chars to their * original forms *  * @param in *            Unicode编码的字符数组。 * @param off *            转换的起始偏移量。 * @param len *            转换的字符长度。 * @param convtBuf *            转换的缓存字符数组。 * @return 完成转换,返回编码前的特殊字符串。 */public static String fromEncodedUnicode(char[] in, int off, int len){char aChar;char[] out = new char[len]; // 只短不长int outLen = 0;int end = off + len;while (off < end){aChar = in[off++];if (aChar == '\\'){aChar = in[off++];if (aChar == 'u'){// Read the xxxxint value = 0;for (int i = 0; i < 4; i++){aChar = in[off++];switch (aChar){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':value = (value << 4) + aChar - '0';break;case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':value = (value << 4) + 10 + aChar - 'a';break;case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':value = (value << 4) + 10 + aChar - 'A';break;default:throw new IllegalArgumentException("Malformed \\uxxxx encoding.");}}out[outLen++] = (char) value;}else{if (aChar == 't'){aChar = '\t';}else if (aChar == 'r'){aChar = '\r';}else if (aChar == 'n'){aChar = '\n';}else if (aChar == 'f'){aChar = '\f';}out[outLen++] = aChar;}}else{out[outLen++] = (char) aChar;}}return new String(out, 0, outLen);}public static String fromEncodedUnicode(String str, int off, int length){return fromEncodedUnicode(str.toCharArray(),off,length);}public static String fromEncodedUnicode(String str){return fromEncodedUnicode(str.toCharArray(),0,str.length());}

然后下面这段就是把汉字转换成unciode然后得到序列号

并且支持重新得到信息的。

package com.cwtechnology.globe.util.security.serial;import java.util.ArrayList;import java.util.Calendar;import java.util.List;import com.cwtechnology.globe.util.convert.CommonConvert;public class KeyGen{private static final String LL = "反编译这破软件有啥意思呢~~";// 这居然似乎就算是判断结果是否有效的私钥诶。。public String getSerial(String userId, String unicodeMark,String licenseNum, int year){java.util.Calendar cal = java.util.Calendar.getInstance();cal.add(Calendar.YEAR, year);cal.add(Calendar.DAY_OF_YEAR, -1);java.text.NumberFormat nf = new java.text.DecimalFormat("000");licenseNum = nf.format(Integer.valueOf(licenseNum));String verTime = new StringBuilder("-").append(new java.text.SimpleDateFormat("yyyyMMdd").format(cal.getTime())).append("0").toString();String need = new StringBuilder(userId.replace("\\u", unicodeMark)).append("-").append(unicodeMark).append(licenseNum).append(verTime).toString();String dx = new StringBuilder(need).append(KeyGen.LL).append(userId).toString();int suf = this.decode(dx);String code = new StringBuilder(need).append(String.valueOf(suf)).toString();return change(code);}private int decode(String s){int i;char[] ac;int j;int k;i = 0;ac = s.toCharArray();j = 0;k = ac.length;while (j < k){i = (31 * i) + ac[j];j++;}return Math.abs(i);}/** * 其中用到的编码转换规则,请参见KeyGen.txt *  * @param s * @return */public String change(String s){char[] abyte0;char[] ac;int i;int k;int j;abyte0 = s.toCharArray();ac = new char[abyte0.length];i = 0;k = abyte0.length;while (i < k){j = abyte0[i];if ((j >= 48) && (j <= 57)){j = (((j - 48) + 5) % 10) + 48;}else if ((j >= 65) && (j <= 90)){j = (((j - 65) + 13) % 26) + 65;}else if ((j >= 97) && (j <= 122)){j = (((j - 97) + 13) % 26) + 97;}else if ((j >= 19968) && (j <= 40959))// 4E00..9FFF;{j = (((j - 19968) + 10496) % 20992) + 19968;}ac[i] = (char) j;i++;}return String.valueOf(ac);}public List<String> getInfo(String strSerial){List<String> result=new ArrayList<String>();strSerial = change(strSerial);String[] infoStrings = strSerial.split("-");if (infoStrings.length >= 3){String unicodeMark = infoStrings[1].substring(0,infoStrings[1].length() - 3);infoStrings[0] = infoStrings[0].replace(unicodeMark, "\\u");infoStrings[0] = CommonConvert.fromEncodedUnicode(infoStrings[0]);infoStrings[1] = infoStrings[1].substring(unicodeMark.length(), unicodeMark.length()+3);infoStrings[2] = infoStrings[2].substring(0, 8);result.add(infoStrings[0]);result.add(infoStrings[1]);result.add(infoStrings[2]);return result;}else{return null;}}public static void main(String[] args){String userId = null;userId = "江苏超惟科技发展有限公司";KeyGen keyGen = new KeyGen();String res = keyGen.getSerial(CommonConvert.toEncodedUnicode(userId, false), "654321", "999",3);System.out.println("Serial:" + res);System.out.println("Info:" + keyGen.getInfo(res).toString());}}

运行结果:

Serial:1098761P0S10987637PS1098763Q3010987615QS10987624Q6109876173510987608Q61098760P0010987612541098764105109876061P10987608S3-109876444-756167745483274380
Info:[江苏超惟科技发展有限公司, 999, 20161229]

分别包含的意思是:注册给哪个用户,可以用户多少机器,到期时间。

0 0