如何使用 java 生成许可证密钥

Posted

技术标签:

【中文标题】如何使用 java 生成许可证密钥【英文标题】:How to generate a license key using java 【发布时间】:2012-02-29 21:23:45 【问题描述】:

如何使用 java 程序生成 25 位许可证密钥。如何使用编码和解码格式将给定字符串转换为 25 位许可证密钥。

我使用以下代码。但它会将许可证密钥中的前七位数字作为 AAAAAAA,然后许可证密钥将在前七位数字之后发生变化。我怎样才能获得各种许可证密钥?

        private String charset = "ABCDEFGHJKLMNPQRSTUVWXYZ123456789";

               private char[] charArray;

              // Random generator = new Random();

               private byte[] passwd;

                public String Generate(String password)
                

                        passwd = toByteArray(password);


                      charArray = strToChar(charset);

                        byte[] data = new byte[15];

                         //generator.nextBytes(data);

                        byte[] tohash = new byte[5+ passwd.length];

                      //System.arraycopy(data, 0, tohash, 0, 5);

                      System.arraycopy(passwd, 0, tohash, 5, passwd.length);

                        try 

                              byte[] hash = getHash(tohash);

                              System.arraycopy(hash, 0, data, 5, 10);

                         catch (NoSuchAlgorithmException e) 

                                e.printStackTrace();

                         catch (UnsupportedEncodingException e) 

                                e.printStackTrace();

                        

                        int num=0;//17

                        for (int i = 0; i < tohash.length; i++) num += tohash[i];

                        String serial = Encode(data) + charArray[num & 31];

                        String ret = "";

                        for (int i = 0; i < 5; i++)

                        

                                ret += serial.substring((i*5),(i*5)+5);

                                if (i < 4) ret += "-";

                        

                        return ret;


            

                private String Encode(byte[] data)

                        String ret="" ;

                        for (int i = 0; i < data.length; i += 5)

                                ret += charArray[data[i] >> 3 & 0x1f];

                                ret += charArray[(data[i] << 2 | data[i + 1] >> 6) & 0x1f];

                                ret += charArray[(data[i + 1] >> 1) & 0x1f];

                                ret += charArray[(data[i + 1] << 4 | data[i + 2] >> 4) & 0x1f];

                                ret += charArray[(data[i + 2] << 1 | data[i + 3] >> 7) & 0x1f];

                                ret += charArray[data[i + 3] >> 2 & 0x1f];

                                ret += charArray[(data[i + 3] << 3 | data[i + 4] >> 5) & 0x1f];

                                ret += charArray[data[i + 4] & 0x1f];
                                //
                                System.out.println(ret);

                        

                        return ret;

                

               private byte[] Decode(String serial)

                        char[] x = strToChar(serial);

                        byte[] table = new byte[256];

                        for (int i = 0; i < charArray.length; i++)

                        

                                table[charArray[i]] = (byte)i;

                        

                        byte[] ret = new byte[x.length * 5 / 8];

                        int pos = 0;

                        for (int i = 0; i <= x.length - 8; )

                        

                                byte b1 = table[x[i++]];

                                byte b2 = table[x[i++]];

                                byte b3 = table[x[i++]];

                                byte b4 = table[x[i++]];

                                byte b5 = table[x[i++]];

                                byte b6 = table[x[i++]];

                                byte b7 = table[x[i++]];

                                byte b8 = table[x[i++]];



                                ret[pos++] = (byte)(b1 << 3 | b2 >> 2);

                                ret[pos++] = (byte)(b2 << 6 | b3 << 1 | b4 >> 4);

                                ret[pos++] = (byte)(b4 << 4 | b5 >> 1);

                                ret[pos++] = (byte)(b5 << 7 | b6 << 2 | b7 >> 3);

                                ret[pos++] = (byte)(b7 << 5 | b8);


                        

                        return ret;

                



        public int byteArrayToInt(byte[] b, int offset) 

        int value = 0;
        for (int i = 0; i < 4; i++) 

            int shift = (4 - 1 - i) * 8;

            value += (b[i + offset] & 0x000000FF) << shift;


        

        return value;

    

        private char[] strToChar(String str)

                char[] c = str.toCharArray();

                return c;

        

        public byte[] toByteArray(String p) 

                String stringToConvert = p;

                byte[] theByteArray = stringToConvert.getBytes();

                return theByteArray;

        

       public byte[] getHash(byte[] toHash) throws NoSuchAlgorithmException, UnsupportedEncodingException 

                MessageDigest digest = MessageDigest.getInstance("SHA-256");

                digest.reset();

                return digest.digest(toHash);

        

【问题讨论】:

Random 有问题吗? 输入什么输出什么???至少提供示例 你说的是什么编码/解码格式 现在我编辑了问题。我的问题是前七位数总是在我运行此代码时显示 AAAAAAA toByteArray()、strToChar()、getHash()。添加此函数的代码 【参考方案1】:

试试这个:

try 
    byte[] hash = getHash(tohash);
    System.arraycopy(hash, 0, data, 0, 15);
 catch (NoSuchAlgorithmException e) 
    e.printStackTrace();
 catch (UnsupportedEncodingException e) 
    e.printStackTrace();

当你复制时:

System.arraycopy(hash, 0, data, 5, 10);

前 5 个字节 == 0;

【讨论】:

以上是关于如何使用 java 生成许可证密钥的主要内容,如果未能解决你的问题,请参考以下文章

为java项目生成许可证密钥[重复]

为 Mac 生成特定于机器的密钥

如何使用许可证密钥输入制作 Windows 安装程序包

在 PHP 中加密和解密许可证密钥

Vcenter Server 4.0许可密钥如何重新分配?

使用 OpenSSL 生成短许可证密钥