`
szjiang
  • 浏览: 12377 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

对注册码生成的浅谈.

阅读更多

最近为了手头的一个小项目,需要生成一个注册码.并且要求注册码中包含日期信息.

java 代码
  1. package mypackage;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileInputStream;   
  5. import java.io.FileOutputStream;   
  6. import java.io.InputStream;   
  7. import java.io.OutputStream;   
  8. import java.security.*;   
  9. import java.text.DateFormat;   
  10. import java.text.ParseException;   
  11. import java.util.Date;   
  12. import java.util.Properties;   
  13. import java.util.Random;   
  14.   
  15. import javax.crypto.Cipher;   
  16. import javax.crypto.SecretKey;   
  17. import javax.crypto.SecretKeyFactory;   
  18. import javax.crypto.spec.DESKeySpec;   
  19.   
  20. /**  
  21.  * 字符串工具集合  
  22.  *   
  23.  * @author Liudong  
  24.  */  
  25. public class StringTest {   
  26.   
  27.     private static final String PASSWORD_CRYPT_KEY = ".?'_=1dt";// 密钥   
  28.   
  29.     private final static String DES = "DES";//DES算法名称   
  30.   
  31.     private String realKey;// 真实注册码   
  32.   
  33.     /**  
  34.      *   
  35.      * StringTest的构造器.  
  36.      *   
  37.      * @param arg  
  38.      */  
  39.     public StringTest(boolean arg) {   
  40.         Random r = new Random();   
  41.         if(!arg){   
  42.             realKey = r.nextLong()+":"+String.valueOf(System.currentTimeMillis());   
  43.         } else{   
  44.             DateFormat df = DateFormat.getDateInstance();   
  45.             Date d = null;   
  46.             try {   
  47.                 d = df.parse("1981-06-27 00:00:02");   
  48.             } catch (ParseException e) {   
  49.                 e.printStackTrace();   
  50.             }   
  51.             realKey = r.nextLong()+":"+String.valueOf(d.getTime());   
  52.         }   
  53.   
  54.     }   
  55.   
  56.     /**  
  57.      * 加密  
  58.      *   
  59.      * @param src  
  60.      *            数据源  
  61.      * @param key  
  62.      *            密钥,长度必须是8的倍数  
  63.      * @return 返回加密后的数据  
  64.      * @throws Exception  
  65.      */  
  66.     public static byte[] encrypt(byte[] src, byte[] key) throws Exception {   
  67.         // DES算法要求有一个可信任的随机数源   
  68.         SecureRandom sr = new SecureRandom();   
  69.         // 从原始密匙数据创建DESKeySpec对象   
  70.         DESKeySpec dks = new DESKeySpec(key);   
  71.         // 创建一个密匙工厂,然后用它把DESKeySpec转换成   
  72.         // 一个SecretKey对象   
  73.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);   
  74.         SecretKey securekey = keyFactory.generateSecret(dks);   
  75.         // Cipher对象实际完成加密操作   
  76.         Cipher cipher = Cipher.getInstance(DES);   
  77.         // 用密匙初始化Cipher对象   
  78.         cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);   
  79.         // 现在,获取数据并加密   
  80.         // 正式执行加密操作   
  81.         return cipher.doFinal(src);   
  82.     }   
  83.   
  84.     /**  
  85.      * 解密  
  86.      *   
  87.      * @param src  
  88.      *            数据源  
  89.      * @param key  
  90.      *            密钥,长度必须是8的倍数  
  91.      * @return 返回解密后的原始数据  
  92.      * @throws Exception  
  93.      */  
  94.     public static byte[] decrypt(byte[] src, byte[] key) throws Exception {   
  95.         // DES算法要求有一个可信任的随机数源   
  96.         SecureRandom sr = new SecureRandom();   
  97.         // 从原始密匙数据创建一个DESKeySpec对象   
  98.         DESKeySpec dks = new DESKeySpec(key);   
  99.         // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成   
  100.         // 一个SecretKey对象   
  101.         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);   
  102.         SecretKey securekey = keyFactory.generateSecret(dks);   
  103.         // Cipher对象实际完成解密操作   
  104.         Cipher cipher = Cipher.getInstance(DES);   
  105.         // 用密匙初始化Cipher对象   
  106.         cipher.init(Cipher.DECRYPT_MODE, securekey, sr);   
  107.         // 现在,获取数据并解密   
  108.         // 正式执行解密操作   
  109.         return cipher.doFinal(src);   
  110.     }   
  111.   
  112.     /**  
  113.      *   
  114.      * 二行制转字符串  
  115.      *   
  116.      * @param b  
  117.      *   
  118.      * @return  
  119.      *   
  120.      */  
  121.   
  122.     public static String byte2hex(byte[] b) {   
  123.   
  124.         String hs = "";   
  125.   
  126.         String stmp = "";   
  127.   
  128.         for (int n = 0; n < b.length; n++) {   
  129.   
  130.             stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));   
  131.             if (stmp.length() == 1)   
  132.                 hs = hs + "0" + stmp;   
  133.             else  
  134.                 hs = hs + stmp;   
  135.         }   
  136.   
  137.         return hs.toUpperCase();   
  138.   
  139.     }   
  140.   
  141.     /**  
  142.      *   
  143.      * 功能:字符串二行制  
  144.      *   
  145.      * @param b  
  146.      * @return  
  147.      *   
  148.      */  
  149.     public static byte[] hex2byte(byte[] b) {   
  150.   
  151.         if ((b.length % 2) != 0)   
  152.             throw new IllegalArgumentException("长度不是偶数");   
  153.         byte[] b2 = new byte[b.length / 2];   
  154.         for (int n = 0; n < b.length; n += 2) {   
  155.             String item = new String(b, n, 2);   
  156.             b2[n / 2] = (byte) Integer.parseInt(item, 16);   
  157.         }   
  158.         return b2;   
  159.     }   
  160.   
  161.     /*  
  162.      * (non-Javadoc)  
  163.      *   
  164.      * @see java.lang.Object#toString()  
  165.      */  
  166.     @Override  
  167.     public String toString() {   
  168.   
  169.         byte[] b = null;   
  170.         try {   
  171.             b = encrypt(realKey.getBytes(), PASSWORD_CRYPT_KEY.getBytes());   
  172.         } catch (Exception e) {   
  173.   
  174.             e.printStackTrace();   
  175.         }   
  176.         String encryptKey = byte2hex(b);   
  177.         return encryptKey;   
  178.     }   
  179.   
  180.     public static void main(String[] args) throws Exception {   
  181.            
  182.         /*  
  183.          * 1.生成注册码  
  184.          */  
  185.         String data = new StringTest(false).toString();   
  186.         System.out.println("未注册注册码:"+data);   
  187.         System.out.println("未注册注册码长度:"+data.length());   
  188.         /*  
  189.          * 2.写入属性文件  
  190.          */  
  191.            
  192.         Properties pro = null;   
  193.            
  194.         File file = new File("d:\\key.properties");   
  195.         if(file.exists()){//文件已存在   
  196.             InputStream in = new FileInputStream("d:\\key.properties");   
  197.             pro = new Properties();   
  198.             pro.load(in);   
  199.             pro.setProperty("key.data", data);   
  200.             OutputStream out = new FileOutputStream("d:\\key.properties");   
  201.             pro.store(out, "key");   
  202.         } else{//文件不存在   
  203.             pro = new Properties();   
  204.             pro.setProperty("key.data", data);   
  205.             OutputStream out = new FileOutputStream("d:\\key.properties");   
  206.             pro.store(out, "key");   
  207.         }   
  208.         /*  
  209.          * 3.解密注册码  
  210.          */  
  211.         String decryptKey = new String(decrypt(hex2byte(data.getBytes()), PASSWORD_CRYPT_KEY   
  212.                 .getBytes()));   
  213.         System.out.println("解密后注册码:" + decryptKey);   
  214.         Date d = new Date();   
  215.         d.setTime(Long.valueOf(decryptKey.substring(   
  216.                 decryptKey.lastIndexOf(":") + 1, decryptKey.length())));   
  217.         DateFormat df = DateFormat.getDateInstance();   
  218.         System.out.println("解密后有效信息:"+df.format(d));   
  219.     }   
  220. }   

 

这里采用了DES算法进行加密.

分享到:
评论

相关推荐

    浅谈EXE格式电子书加密授权技术.docx

    用户可以选择要加密的EXE电子书,通过注册授权系统设置自定义的复杂密码,并导出注册机以生成注册码。这种方式的加密方案更加灵活,但同样需要妥善保管注册机,以防止授权信息的泄露。 总的来说,EXE格式电子书的...

    浅谈ASP编程的思路与纠错浅谈ASP编程的思路与纠错

    例如,`()%&gt;`是一个简单的示例,它展示了如何在ASP页面上实时显示系统时间,这同时也揭示了ASP如何与服务器交互并动态生成内容。 在进行ASP编程前,确保服务器环境的正确配置至关重要。对于与数据库的连接,比如...

    浅谈android获取设备唯一标识完美解决方案

    浅谈Android获取设备唯一标识完美解决方案 在Android应用程序中,获取设备唯一标识是非常重要的,例如在用户注册、设备信息采集、数据统计等场景中都需要使用到设备唯一标识。本文将介绍一种获取Android设备唯一...

    浅谈hibernate之映射文件VS映射注解

    浅谈hibernate之映射文件VS映射注解 在Java开发中,注解是一种非常常用的技术,例如@Override标记重写父类方法或实现接口方法,@Test标记单元测试方法。注解可以简单地理解为一种有特殊含义的标记。在开发过程中,...

    侯捷- -深入浅出MFC

    深入浅出MFC(第二版) 目录 第0章 你一定要知道(导读) 这本书适合谁 你需要什么技术基础 你需要什么软硬件环境 让我们使用同一种语言 本书符号习惯 本书例程的取得 范例程序说明 与前版本之差异 如何联络作者 第...

    ASP.NET3.5从入门到精通

    6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第 7 章数据库与 ADO.NET 基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...

    ASP.NET 3.5 开发大全11-15

    6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...

    ASP.NET 3.5 开发大全

    6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...

    ASP.NET 3.5 开发大全1-5

    6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...

    ASPNET35开发大全第一章

    6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...

    ASP.NET 3.5 开发大全word课件

    6.3.1 生成用户控件(CreateUserWizard) 6.3.2 密码更改控件(ChangePassword) 6.4 小结 第三篇 数据操作篇 第7章 数据库与ADO.NET基础 7.1 数据库基础 7.1.1 结构化查询语言 7.1.2 表和视图 7.1.3 存储过程和...

    深入浅出MFC【侯捷】

    C++程序的生与死:兼谈构造函数与解构函数 四种不同的对象生存方式(in stack、in heap、global、local static) 执行期类型信息(RTTI) 动态生成(Dynamic Creation) 异常处理(Exception Handling) Template ...

    深入浅出MFC——MFC初级入门(繁体版)

    以上是对《深入浅出MFC》一书的部分内容的详细解析,旨在帮助读者更好地理解MFC编程的基础知识和实践技巧。通过这些知识点的学习,读者将能够掌握MFC的核心概念,并能够应用到实际的项目开发中。

Global site tag (gtag.js) - Google Analytics