Java를 사용하여 활성화 코드 및 키를 생성하는 방법.
복호화 및 암호화 설계 아이디어
암호화:
AES 대칭 암호화 및 복호화 사용
7자리: 32자리 시퀀스(4자리) + 키 카테고리(2자리) + 유효기간(1자리)
암호화 후 키 는 11
4자리 : 처음 세 자리는 먼저 난수(0~2500)를 얻은 뒤 11을 곱한 뒤 세 자리 32자리 숫자로 변환하고 마지막 자리는 (기계 버전) 숫자),
마지막 3자리 + 1자리는 4자리를 생성
예상 15자리 키
11자리 + 4자리
그러면 키가 뒤섞여 혼동됨
혼란 전략: 먼저 활성화 코드의 홀수와 짝수 숫자를 각각 얻습니다. , 그리고 홀수와 짝수를 이어붙여 난독화된 활성화 코드
홀수 + 짝수
복호화:
(1) 해독(난독화된 활성화 코드 재구성 및 복원)
(2) 확인 마지막 4개 인증에 성공하면 다음 단계로 진행하세요. 인증에 실패하면 키가 유효하지 않습니다.
(3) 인증에 성공한 경우에만 키의 처음 11자리를 해독할 수 있습니다. 실패하면 키가 유효하지 않습니다.
(4) 암호 해독 성공, 유효한 키임을 나타냅니다. 키 정보를 획득하고 해당 정보를 기반으로 클라이언트에서 해당 작업을 수행합니다. 이는 키가 유효하지 않음을 나타냅니다.
(5 ) 복호화 성공 여부에 관계없이 서버에 요청을 보내고 서버에 통보한 후 진행합니다. 해당 작업 및 기록
그 중 키 카테고리(2자리)를 사용하여 어떤 장치 또는 플랫폼을 나타낼 수 있습니다. 활성화 코드는 활성화하는 데 사용됩니다(예: 01은 특정 플랫폼을 나타내고, 02는 특정 앱을 나타냄). 기간(1자리)은 활성화 코드의 유효 기간을 나타내는 데 사용됩니다(예: 0은 영구, 1은 7일을 의미, 2는 30일 등을 의미합니다.)
참고: 처음 7자리는 11자리로 암호화되어 생성할 수 있는 활성화 코드 수를 나타냅니다. 마지막 4자리는 임의의 숫자 * 11~32이며 난독화 전략은 다음과 같습니다. 활성화코드 암호화는 활성화코드가 유효한지 확인하는 데 사용됩니다
따라서 활성화코드 암호화는 주로 세 가지 위치에 반영됩니다. 11 16 진수로 변환 된 후? AES는 12055296이고 8비트로 설정되고 비밀 암호문은 11비트이며 암호화 알고리즘은 "DES"입니다
- 활성화 코드 생성 테스트
import java.util.Random; /** * Created by tao. * Date: 2021/6/28 16:43 * 描述: */ public class CDKeyUtil { //机器版本号 /** * 激活码生成方法 * * @param category 密钥类别(固定两位数字) * @param deadline 使用期限(固定一位字符) * @return 返回的激活码 */ 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; } /** * 激活码解码方法 * * @param CDKey 激活码 * @return 返回激活码明文 */ 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 "激活码错误"; } } /** * 获得激活码前四位序列方法 * * @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; } /** * 获得激活码后四位规则序列方法 * * @param machineVersion 机器版本号 * @return 返回激活码后四位规则序列 */ public static String getRulesSequence(String machineVersion) { String rulesSequence; //1. 按照规则获取前三位 /*int randomInt = new Random().nextInt(8); String randomStr = randomInt + "" + (randomInt + 1) + (randomInt + 2);*/ //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; } /** * 激活码混淆方法 * 奇数位+偶数位 * * @return 返回激活码混淆后的序列 */ 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; } /** * 激活码解除混淆方法 * * @return 返回激活码解除混淆后的序列 */ 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; } /** * 10进制转32进制的方法 * num 要转换的数 from源数的进制 to要转换成的进制 * * @param num 10进制(字符串) * @return 转换结果的32进制字符串 */ public static String change10To32(String num) { int from = 10; int to = 32; return new java.math.BigInteger(num, from).toString(to); } /** * 32进制转10进制的方法 * num 要转换的数 from源数的进制 to要转换成的进制 * * @param num 10进制(字符串) * @return 转换结果的10进制字符串 */ public static String change32To10(String num) { int f = 32; int t = 10; return new java.math.BigInteger(num, f).toString(t); } /** * 生成[min, max]之间的随机整数 * min 最小整数(固定0) * max 最大整数(固定1000000) * * @return 返回min———max之间的随机数 * @author tao */ 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; } } }
로그인 후 복사실행 결과:
위 내용은 Java를 사용하여 활성화 코드 및 키를 생성하는 방법.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

Java는 초보자와 숙련된 개발자 모두가 배울 수 있는 인기 있는 프로그래밍 언어입니다. 이 튜토리얼은 기본 개념부터 시작하여 고급 주제를 통해 진행됩니다. Java Development Kit를 설치한 후 간단한 "Hello, World!" 프로그램을 작성하여 프로그래밍을 연습할 수 있습니다. 코드를 이해한 후 명령 프롬프트를 사용하여 프로그램을 컴파일하고 실행하면 "Hello, World!"가 콘솔에 출력됩니다. Java를 배우면 프로그래밍 여정이 시작되고, 숙달이 깊어짐에 따라 더 복잡한 애플리케이션을 만들 수 있습니다.
