iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用java生成激活码和密钥的方法
  • 394
分享到

使用java生成激活码和密钥的方法

2024-04-02 19:04:59 394人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录解密与加密设计思路解密与加密工具类激活码生成测试解密与加密设计思路 加密:采用AES对称加密、解密7位数: 32进制序列(4位) + 密钥类别(2位)+ 有效时长(1位)加密后密

解密与加密设计思路

加密:
采用AES对称加密、解密
7位数: 32进制序列(4位) + 密钥类别(2位)+ 有效时长(1位)
加密后密钥为11位
4位数:前三位,先获取一个(0到2500)的随机数,然后再乘11,接着转换为三位的32进制数,然后最后一位是(机器版本号),
最后 3位+1位 生成4位数
预想15位密钥
11位+4位
接着密钥打乱顺序混淆

混淆策略:先分别获取激活码的奇数位和偶数位,然后将奇数位和偶数位拼接获得混淆后的激活码
奇数位+偶数位

解密:
(1) 解除混淆(将混淆后的激活码进行重组复原)
(2) 校验密钥后四位;校验成功继续下一步操作,校验失败密钥无效
(3) 只有校验成功才能对前十一位密钥进行解密;校验失败密钥无效
(4) 解密成功,说明是有效密钥,获取密钥信息,根据信息对客户端进行相应操作;解密失败,说明密钥无效
(5) 无论解密成功与否给服务端发请求,通知服务端,然后进行相应的操作和记录

其中:密钥类别(2位)可以用来表示该激活码用来激活哪些设备或者哪些平台(如01表示某个平台,02表示某个app),时长(1位)用来表示该激活码的有效时长(如0表示永久、1表示7天、2表示30天等)
注意:前7位数加密后为11位,表示该激活码可以生成的个数;后4位数为随机数 * 11转32进制和混淆策略是为了激活码的加密性,用来校验该激活码是否有效

因此,该激活码的加密主要体现在三个地方:

  • 混淆策略
  • 32禁止转18进制后能否被11整除
  • AES对称加密、解密

解密与加密工具类

CDKeyUtil.java

import java.util.Random;


public class CDKeyUtil {

    //机器版本号

    
    public static String createCDkey(String cateGory, String deadline, String MachineVersion) throws Exception {
        String CDKey = "";
        //1. 获取前四位
        String sequence = getSequence();
        //2. 生成前七位
        String plaintext = sequence + category + deadline;
        //3.对明文进行加密
        CDKey = CDKeyEncryptUtils.AESencrypt(plaintext).substring(0, 11);
        //4.获取后四位
        String rulesSequence = CDKeyUtil.getRulesSequence(machineVersion);
        //5.混淆操作
        CDKey = CDKey + rulesSequence;
        CDKey = confusion(CDKey);
        //6.得到激活码
        return CDKey;
    }


    
    public static String deCDkey(String CDKey, String machineVersion) throws Exception {
        //1. 解除混淆
        String deConfusion = deConfusion(CDKey);
        //2. 提取后四位序列(第1位版本号,后三位校验其规则)
        String sequence = deConfusion.substring(deConfusion.length() - 4);
        //3. 获取后三位序列并且转为10进制,和版本号
        String randomInt = sequence.substring(1);
        String version = sequence.substring(0, 1);
        int to10 = Integer.parseInt(change32To10(randomInt));
        //4. 根据既定规则校验激活码是否正确
        if (to10 % 11 == 0 && version.equals(machineVersion)) {
            //1. 如果后四位序列校验正确,则对激活码进行解密操作
            String secreTKEy = deConfusion.substring(0, 11);
            String code = "";
            try {
                code = CDKeyEncryptUtils.AESdecrypt(secretKey);
            } catch (Exception e) {
                e.printStackTrace();
                return "激活码错误";
            }
            return code;
        } else {
            return "激活码错误";
        }

    }


    
    public static String getSequence() {
        String sequence = "";
        //1. 获取随机数
        int randomInt = getRandomInt();
        //2. 转32进制
        String to32 = change10To32(randomInt + "");
        //3. 补全四位
        int len = to32.length();
        if (len < 4) {
            for (int i = 0; i < 4 - len; i++) {
                to32 = "0" + to32;
            }
        }
        sequence = to32;
        return sequence;
    }

    
    public static String getRulesSequence(String machineVersion) {
        String rulesSequence;
        //1. 按照规则获取前三位
        

        //1. 按照规则获取前三位
        int randomInt = new Random().nextInt(2500);
        String randomStr = (randomInt * 11) + "";
        //2. 转32进制
        String to32 = change10To32(randomStr);
        //3. 补全三位
        int len = to32.length();
        if (len < 3) {
            for (int i = 0; i < 3 - len; i++) {
                to32 = "0" + to32;
            }
        }
        //4.拼接第四位
        rulesSequence = machineVersion + to32;
        return rulesSequence;
    }

    
    public static String confusion(String CDKey) {
        String deCDKey = "";
        //1.获取奇数位字串
        String odd = "";
        for (int i = 0; i < CDKey.length(); i = i + 2) {
            odd = odd + CDKey.charAt(i);
        }
        //2.获取偶数位字串
        String even = "";
        for (int i = 1; i < CDKey.length(); i = i + 2) {
            even = even + CDKey.charAt(i);
        }
        //3.拼接
        deCDKey = odd + even;
        return deCDKey;
    }

    
    public static String deConfusion(String deCDKey) {
        String CDKey = "";
        //1. 拆分
        int oddCount = (deCDKey.length() / 2) + (deCDKey.length() % 2);
        String odd = deCDKey.substring(0, oddCount);
        String even = deCDKey.substring(oddCount);
        //2. 复原激活码
        if (odd.length() == even.length()) {
            for (int i = 0; i < odd.length(); i++) {
                CDKey = CDKey + odd.charAt(i) + even.charAt(i);
            }
        } else {
            for (int i = 0; i < even.length(); i++) {
                CDKey = CDKey + odd.charAt(i) + even.charAt(i);
            }
            CDKey = CDKey + odd.charAt(odd.length() - 1);
        }
        return CDKey;
    }

    
    public static String change10To32(String num) {
        int from = 10;
        int to = 32;
        return new java.math.BigInteger(num, from).toString(to);
    }

    
    public static String change32To10(String num) {
        int f = 32;
        int t = 10;
        return new java.math.BigInteger(num, f).toString(t);
    }

    
    public static int getRandomInt() {
        int min = 0;
        int max = 1000000;
        return new Random().nextInt(max) % (max - min + 1) + min;
    }


    
    public static int duetimeEnum(String code) {
        switch (code) {
            case "0":
                return 36500;
            case "1":
                return 7;
            case "2":
                return 30;
            case "3":
                return 90;
            case "4":
                return 180;
            case "5":
                return 365;
            default:
                return 30;
        }
    }
}

其中用到AES加密和解密:CDKeyEncryptUtils.java

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

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


public class CDKeyEncryptUtils {
	    //--------------AES---------------
	    private static final String KEY = "12055296";  // 密匙,必须16位
	    private static final String OFFSET = "12055296"; // 偏移量
	    private static final String ENcoding = "UTF-8"; // 编码
	    private static final String ALGORITHM = "DES"; //算法
	    private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding"; // 默认的加密算法,CBC模式


	    public static String AESencrypt(String data) throws Exception {
	        //指定算法、获取Cipher对象(DES/CBC/PKCS5Padding:算法为,工作模式,填充模式)
	        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
	        //根据自定义的加密密匙和算法模式初始化密钥规范
	        SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM);
	        //CBC模式偏移量IV
	        IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes());
	        //初始化加密模式
	        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
	        //单部分加密结束,重置Cipher
	        byte[] encrypted = cipher.doFinal(data.getBytes(ENCODING));
	        //加密后再使用BASE64做转码
	        return new Base64().encodeToString(encrypted);
	    }

	    
	    public static String AESdecrypt(String data) throws Exception {
	        //指定算法、获取Cipher对象(DES/CBC/PKCS5Padding:算法为,工作模式,填充模式)
	        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
	        //根据自定义的加密密匙和算法模式初始化密钥规范
	        SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM);
	        //CBC模式偏移量IV
	        IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes());
	        //初始化解密模式
	        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
	        //先用base64解码
	        byte[] buffer = new Base64().decode(data);
	        //单部分加密结束,重置Cipher
	        byte[] encrypted = cipher.doFinal(buffer);
	        return new String(encrypted, ENCODING);
	    }
}

其中AES的key为12055296,设置为8位,则机密后的密文则为11位,加密算法为 “DES”

激活码生成测试

 public static void main(String[] args) throws Exception {
        for (int i = 0; i < 10; i++) {
            String CDKey = CDKeyUtil.createCDkey("01", "0", "1");
            System.out.println("激活码:" + CDKey);
            String deCDkey = CDKeyUtil.deCDkey(CDKey, "1");
            System.out.println("激活码解密:" + deCDkey);
        }

    }

执行结果:

在这里插入图片描述

 到此这篇关于使用java生成激活码和密钥的方法的文章就介绍到这了,更多相关java生成激活码和密钥内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用java生成激活码和密钥的方法

本文链接: https://www.lsjlt.com/news/148738.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用java生成激活码和密钥的方法
    目录解密与加密设计思路解密与加密工具类激活码生成测试解密与加密设计思路 加密:采用AES对称加密、解密7位数: 32进制序列(4位) + 密钥类别(2位)+ 有效时长(1位)加密后密...
    99+
    2024-04-02
  • 怎么使用java生成激活码和密钥
    这篇文章主要介绍“怎么使用java生成激活码和密钥”,在日常操作中,相信很多人在怎么使用java生成激活码和密钥问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用java生成激活码和密钥”的疑惑有所帮助!...
    99+
    2023-06-30
  • 2021免费可用的win7专业版激活密钥和使用方法
    一般来说,激活win7专业版的方法主要有两种:使用密钥或者激活工具进行激活。有网友不知道在哪里可以获取到密钥激活?今天小编就给大家分享下2021免费可用的win7专业版激活密钥和使用方法。一、win7专业版激活码密钥:FJGCP-4DFJD...
    99+
    2023-07-15
  • 分享生成PyCharm密钥的方法
    概要:PyCharm是一款强大的Python集成开发环境,许多开发者使用它来进行Python项目的开发和调试。在使用PyCharm时,我们常常会遇到需要生成密钥的情况,以便于进行某些操...
    99+
    2024-02-25
    pycharm 密钥生成
  • java二维码生成的方法
    本文实例为大家分享了java二维码的实现代码,供大家参考,具体内容如下这次用到的jar包是zxing,没有用到core的jar包先导入zxing.jar包生成二维码package cn.huse.erweima;import java.io...
    99+
    2023-05-31
    java 二维码 ava
  • 免激活合法使用Vista1年的终极方法
    Vista免费!合法!不用激活!至少使用一年!   多么激动人心的字眼!Vista之家(www.vista123.com)团队第一时间拿到了国外的牛人大作,简单之极,只需更改注册表和执行两个命令行程序!   步骤1: 运...
    99+
    2023-05-24
    免激活 合法 使用 Vista 终极 方法
  • 阿里云服务器密钥生成一种安全可靠的加密方法
    阿里云服务器密钥生成是一种常用的安全措施,它通过使用随机生成的密钥对服务器进行加密,以保护服务器和其中存储的数据安全。在本文中,我们将深入探讨阿里云服务器密钥生成的过程,以及它的重要性。 阿里云服务器密钥生成是一种非常重要的安全措施,它确保...
    99+
    2023-11-15
    密钥 阿里 可靠
  • 3种生成高强度密码的方法
    在生活中,我们需要用到大量的密码,这些密码最好不要统一,否则万一泄漏的话,所有账号都暴露在风险之下。而在工作中,我们同样也需要用到大量密码,比如批量添加用户,批量设置服务器密码等。 ...
    99+
    2024-04-02
  • 【RSA加密/解密】PKCS1_OAEP和PKCS1_v1_5两种填充方案【python RSA密钥对生成、密码加密、密文解密、pycharm安装Crypto】
    一、PKCS1_OAEP和PKCS1_v1_5是公钥加密标准中的两种填充方案。 PKCS1_OAEP(Optimal Asymmetric Encryption Padding)是一种更安全的填充方案...
    99+
    2023-10-26
    算法 开发语言 python pycharm
  • php生成用户密码的两种方式
    目录一、md5密码 二、hash密码PS:php生成随机密码的几种方法方法一:方法二:方法三:方法四:在用户系统中,生成用户的密码是很重要的,而简单的密码必然给一些不法用户...
    99+
    2024-04-02
  • MybatisPlus代码生成器的使用方法详解
    搭建测试的数据库和表数据的SQL SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- -------------------...
    99+
    2024-04-02
  • PHP使用QR Code生成二维码的方法
    本篇内容主要讲解“PHP使用QR Code生成二维码的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP使用QR Code生成二维码的方法”吧!使用PHP QR Code生成二维码HP Q...
    99+
    2023-06-20
  • python生成遍历暴力破解密码的方法
    python生成遍历暴力破解密码(这里已遍历暴力破解rar为例,只提供生成密码以及遍历密码) 这个也就是提供一个思路,需求是这样的,我XX的闺蜜有个rar的压缩包,不知道他是从哪里挣...
    99+
    2024-04-02
  • 如何使用Java生成和解析二维码?
    二维码是一种能够编码大量信息的矩阵条形码,它可以被扫描并解析成文本、URL、联系方式等信息。Java作为一门广泛应用于软件开发的编程语言,也提供了生成和解析二维码的功能。本篇文章将介绍如何使用Java生成和解析二维码。 生成二维码 1. 添...
    99+
    2023-08-15
    文件 数据类型 二维码
  • Linux下用makepasswd和passwordmaker生成密码的过程
    本篇内容主要讲解“Linux下用makepasswd和passwordmaker生成密码的过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux下用makepasswd和passwordm...
    99+
    2023-06-12
  • python使用生成器的方法
    这篇文章主要介绍了python使用生成器的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python使用生成器的方法文章都会有所收获,下面我们一起来看看吧。尽可能使用生成器单机处理较大数据量时,生成器往往很...
    99+
    2023-06-27
  • 使用python3来生成安全的随机密码
    最近1年自学了python,发现python的应用场景挺多,自己百度了加自己稍微修改,写了段可以随时生成指定长度的安全随机密码#C:\Python36#coding=utf-8import stringfrom random import ...
    99+
    2023-01-31
    密码
  • java后台验证码生成的实现方法
    效果图如下: 1.适用需求 后台生成验证码,用于登陆验证。 2. 功能实现所需控件/文件: 无(普通标签) 3.功能点实现思路 1)前台思路: (1)前台一个<input&g...
    99+
    2024-04-02
  • java代码自动生成的方法是什么
    在Java中,有各种工具和框架可以用于生成代码。其中最常见的是使用代码生成工具,如MyBatis Generator和Apache ...
    99+
    2024-02-29
    java
  • 用Linux命令行生成随机密码的方法有哪些
    这篇文章主要介绍“用Linux命令行生成随机密码的方法有哪些”,在日常操作中,相信很多人在用Linux命令行生成随机密码的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”用Linux命令行生成随机密码...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作