最近为了手头的一个小项目,需要生成一个注册码.并且要求注册码中包含日期信息.
java 代码
- package mypackage;
-
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.security.*;
- import java.text.DateFormat;
- import java.text.ParseException;
- import java.util.Date;
- import java.util.Properties;
- import java.util.Random;
-
- import javax.crypto.Cipher;
- import javax.crypto.SecretKey;
- import javax.crypto.SecretKeyFactory;
- import javax.crypto.spec.DESKeySpec;
-
-
-
-
-
-
- public class StringTest {
-
- private static final String PASSWORD_CRYPT_KEY = ".?'_=1dt";
-
- private final static String DES = "DES";
-
- private String realKey;
-
-
-
-
-
-
-
- public StringTest(boolean arg) {
- Random r = new Random();
- if(!arg){
- realKey = r.nextLong()+":"+String.valueOf(System.currentTimeMillis());
- } else{
- DateFormat df = DateFormat.getDateInstance();
- Date d = null;
- try {
- d = df.parse("1981-06-27 00:00:02");
- } catch (ParseException e) {
- e.printStackTrace();
- }
- realKey = r.nextLong()+":"+String.valueOf(d.getTime());
- }
-
- }
-
-
-
-
-
-
-
-
-
-
-
- public static byte[] encrypt(byte[] src, byte[] key) throws Exception {
-
- SecureRandom sr = new SecureRandom();
-
- DESKeySpec dks = new DESKeySpec(key);
-
-
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
- SecretKey securekey = keyFactory.generateSecret(dks);
-
- Cipher cipher = Cipher.getInstance(DES);
-
- cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
-
-
- return cipher.doFinal(src);
- }
-
-
-
-
-
-
-
-
-
-
-
- public static byte[] decrypt(byte[] src, byte[] key) throws Exception {
-
- SecureRandom sr = new SecureRandom();
-
- DESKeySpec dks = new DESKeySpec(key);
-
-
- SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
- SecretKey securekey = keyFactory.generateSecret(dks);
-
- Cipher cipher = Cipher.getInstance(DES);
-
- cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
-
-
- return cipher.doFinal(src);
- }
-
-
-
-
-
-
-
-
-
-
-
- public static String byte2hex(byte[] b) {
-
- String hs = "";
-
- String stmp = "";
-
- for (int n = 0; n < b.length; n++) {
-
- stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
- if (stmp.length() == 1)
- hs = hs + "0" + stmp;
- else
- hs = hs + stmp;
- }
-
- return hs.toUpperCase();
-
- }
-
-
-
-
-
-
-
-
-
- public static byte[] hex2byte(byte[] b) {
-
- if ((b.length % 2) != 0)
- throw new IllegalArgumentException("长度不是偶数");
- byte[] b2 = new byte[b.length / 2];
- for (int n = 0; n < b.length; n += 2) {
- String item = new String(b, n, 2);
- b2[n / 2] = (byte) Integer.parseInt(item, 16);
- }
- return b2;
- }
-
-
-
-
-
-
- @Override
- public String toString() {
-
- byte[] b = null;
- try {
- b = encrypt(realKey.getBytes(), PASSWORD_CRYPT_KEY.getBytes());
- } catch (Exception e) {
-
- e.printStackTrace();
- }
- String encryptKey = byte2hex(b);
- return encryptKey;
- }
-
- public static void main(String[] args) throws Exception {
-
-
-
-
- String data = new StringTest(false).toString();
- System.out.println("未注册注册码:"+data);
- System.out.println("未注册注册码长度:"+data.length());
-
-
-
-
- Properties pro = null;
-
- File file = new File("d:\\key.properties");
- if(file.exists()){
- InputStream in = new FileInputStream("d:\\key.properties");
- pro = new Properties();
- pro.load(in);
- pro.setProperty("key.data", data);
- OutputStream out = new FileOutputStream("d:\\key.properties");
- pro.store(out, "key");
- } else{
- pro = new Properties();
- pro.setProperty("key.data", data);
- OutputStream out = new FileOutputStream("d:\\key.properties");
- pro.store(out, "key");
- }
-
-
-
- String decryptKey = new String(decrypt(hex2byte(data.getBytes()), PASSWORD_CRYPT_KEY
- .getBytes()));
- System.out.println("解密后注册码:" + decryptKey);
- Date d = new Date();
- d.setTime(Long.valueOf(decryptKey.substring(
- decryptKey.lastIndexOf(":") + 1, decryptKey.length())));
- DateFormat df = DateFormat.getDateInstance();
- System.out.println("解密后有效信息:"+df.format(d));
- }
- }
这里采用了DES算法进行加密.
分享到:
相关推荐
用户可以选择要加密的EXE电子书,通过注册授权系统设置自定义的复杂密码,并导出注册机以生成注册码。这种方式的加密方案更加灵活,但同样需要妥善保管注册机,以防止授权信息的泄露。 总的来说,EXE格式电子书的...
例如,`()%>`是一个简单的示例,它展示了如何在ASP页面上实时显示系统时间,这同时也揭示了ASP如何与服务器交互并动态生成内容。 在进行ASP编程前,确保服务器环境的正确配置至关重要。对于与数据库的连接,比如...
浅谈Android获取设备唯一标识完美解决方案 在Android应用程序中,获取设备唯一标识是非常重要的,例如在用户注册、设备信息采集、数据统计等场景中都需要使用到设备唯一标识。本文将介绍一种获取Android设备唯一...
浅谈hibernate之映射文件VS映射注解 在Java开发中,注解是一种非常常用的技术,例如@Override标记重写父类方法或实现接口方法,@Test标记单元测试方法。注解可以简单地理解为一种有特殊含义的标记。在开发过程中,...
深入浅出MFC(第二版) 目录 第0章 你一定要知道(导读) 这本书适合谁 你需要什么技术基础 你需要什么软硬件环境 让我们使用同一种语言 本书符号习惯 本书例程的取得 范例程序说明 与前版本之差异 如何联络作者 第...
6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第 7 章数据库与 ADO.NET 基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...
6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...
6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...
6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...
6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...
6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...
C++程序的生与死:兼谈构造函数与解构函数 四种不同的对象生存方式(in stack、in heap、global、local static) 执行期类型信息(RTTI) 动态生成(Dynamic Creation) 异常处理(Exception Handling) Template ...
以上是对《深入浅出MFC》一书的部分内容的详细解析,旨在帮助读者更好地理解MFC编程的基础知识和实践技巧。通过这些知识点的学习,读者将能够掌握MFC的核心概念,并能够应用到实际的项目开发中。