使用AES+自己算法设计加密解密算法
发布日期:2021-06-29 03:45:00 浏览次数:2 分类:技术文章

本文共 8048 字,大约阅读时间需要 26 分钟。

因为需要,需要将字符串进行加密,所以就自己设计了一套加密算法

代码如下:

package com.htinf.enandDEcrypt;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.Key;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;/** * 加密解密处理 *      加密的密钥可以自行配置(也可以配置在systemConfig.properties文件中) *      为了防止过多的进行操作,或者被看到,本系统直接将加密密钥设置成"htinf"; * 加密算法:AES+自己设计算法 * @author zcg * @time 2016-11-24 16:23:55 *  * 常见的加密算法: AES *                  DES *                  RC4 *                  Rabbit *                  TripleDes * */public class EnorDecryptTools {
private Key key; private static String generateKey="htinf"; private String encryptAlgorithm="AES"; private static EnorDecryptTools tools; private EnorDecryptTools(){} public static EnorDecryptTools getInstance(){ if(tools==null){ tools=new EnorDecryptTools(); } tools.getKey(generateKey); return tools; } private void getKey(String strKey){ try { //防止加密过后在window和linux系统下产生不一样的效果 KeyGenerator _generator = KeyGenerator.getInstance(encryptAlgorithm); SecureRandom random=null; random = SecureRandom.getInstance("SHA1PRNG","SUN"); random.setSeed(strKey.getBytes()); _generator.init(random); this.key = _generator.generateKey(); _generator = null; } catch (Exception e) { e.printStackTrace(); } } /** * * 加密String明文输入,String密文输出 * * @param strMing * String明文 * @return String密文 * */ public String getEncString(String strMing){ byte[] byteMi = null; byte[] byteMing = null; String strMi = ""; BASE64Encoder base64en = new BASE64Encoder(); try { byteMing = strMing.getBytes("UTF8"); byteMi = this.getEncCode(byteMing); strMi = base64en.encode(byteMi); //DES加密算法之後,進行二級加密 strMi=deepencrypt(strMi); } catch (Exception e) { e.printStackTrace(); } finally { base64en = null; byteMing = null; byteMi = null; } return strMi; } /** * 解密 以String密文输入,String明文输出 * * @param strMi * String密文 * @return String明文 */ public String getDesString(String strMi){ BASE64Decoder base64De = new BASE64Decoder(); byte[] byteMing = null; byte[] byteMi = null; String strMing = ""; try { //DES算法解密之前,進行一級解密 strMi=deepdecrypt(strMi); byteMi = base64De.decodeBuffer(strMi); byteMing = this.getDesCode(byteMi); strMing = new String(byteMing, "UTF8"); } catch (Exception e) { e.printStackTrace(); } finally { base64De = null; byteMing = null; byteMi = null; } return strMing; } /** * 为getEncString方法提供服务 * * 加密以byte[]明文输入,byte[]密文输出 * * @param byteS * byte[]明文 * @return byte[]密文 */ private byte[] getEncCode(byte[] byteS) { byte[] byteFina = null; Cipher cipher; try { cipher = Cipher.getInstance(encryptAlgorithm); cipher.init(Cipher.ENCRYPT_MODE, key); byteFina = cipher.doFinal(byteS); } catch (Exception e) { e.printStackTrace(); } finally { cipher = null; } return byteFina; } /** * 为getDesString方法提供服务 * * 解密以byte[]密文输入,以byte[]明文输出 * * @param byteD * byte[]密文 * @return byte[]明文 */ private byte[] getDesCode(byte[] byteD) { Cipher cipher; byte[] byteFina = null; try { cipher = Cipher.getInstance(encryptAlgorithm); cipher.init(Cipher.DECRYPT_MODE, key); byteFina = cipher.doFinal(byteD); } catch (Exception e) { e.printStackTrace(); } finally { cipher = null; } return byteFina; } /** * 加密文件,明文经过DES加密之后,获取密文中的第一个字符,如果大于70.进行倒入, * 小于70,如果字符长度大于6,进行前三个和后三个字符的替换,如果是小于6 * 不进行操作 * 并在后面追加四位的随机数 * @param entryptStr DES加密后的字符 * String * @return String 深度加密后的字符 * */ private String deepencrypt(String entryptStr){ String newStr=""; String finalStr=""; int len=entryptStr.length(); char firstIndex=entryptStr.charAt(0); int charToInt=(int)firstIndex; // 使用倒叙的方式 if(charToInt>=70){ char[] charArray=entryptStr.toCharArray(); for(int i=charArray.length-1;i>=0;i--){ newStr+=charArray[i]; } } else{ if(len>=6){ String firstStr=entryptStr.substring(0, 3); String lastStr=entryptStr.substring(len-3, len); String indexStr=entryptStr.substring(3,len-3); newStr =lastStr+indexStr+firstStr; } //不进行替换,直接这样 else{ newStr=entryptStr; } } int a = (int)(Math.random()*(9999-1000+1))+1000; finalStr=newStr+a; return finalStr; } /** * 解密文件:收到密文之後,首先進行後綴四位數字清除,然后解析字符串,如果长度是小于6 * 不进行任何操作,如果是大于6,检测最后一个字符,如果是大于70,进行倒叙, * 如果是小于70,将字符的后三个和前三个进行替换, * @param decryptStr DES+自定義算法密文 * String * @return String 一級解密之後的密文 * */ private String deepdecrypt(String decryptStr){ int len=decryptStr.length(); String interStr=decryptStr.substring(0,len-4); int interlen=interStr.length(); String newStr=""; //如果他的长度小于6,不进行操作,将后面的数字替换掉就好 if(interlen<6){ newStr=interStr; } else{ char lastIndex=interStr.charAt(interlen-1); int charToInt=(int)lastIndex; if(charToInt>=70){ //说明是替换的 char[] charArray=interStr.toCharArray(); for(int i=charArray.length-1;i>=0;i--){ newStr+=charArray[i]; } } else{ String firstStr=interStr.substring(0,3); String lastStr=interStr.substring(interlen-3,interlen); String indexStr=interStr.substring(3,interlen-3); newStr=lastStr+indexStr+firstStr; } } return newStr; } public static void main(String[] args) throws IOException {// EnorDecryptTools enEncrypt=new EnorDecryptTools();// enEncrypt.getKey(EnorDecryptTools.generateKey); // 生成密匙 (同一个key)// //对密码进行加密操作// //设置加密的密码// String passward="123";// byte[] bt=enEncrypt.getEncCode(passward.getBytes("UTF-8"));// //加密之后文件进行操作// String openPassward=new String(bt,"UTF-8");// System.out.println("加密之后的文件"+new String(bt));// // //解密之后文件// String closePassward=enEncrypt.getDesString(openPassward);// System.out.println("解密之后的文件"+closePassward); String encryStr="123"; EnorDecryptTools enEncrypt=new EnorDecryptTools(); // 实例化一个对象(对外提供使用单例设计模式) enEncrypt.getKey(generateKey); String strEnc = enEncrypt.getEncString(encryStr);// 加密字符串,返回String的密文 System.out.println("加密之後的文件"+strEnc); String strDes = enEncrypt.getDesString("==Q4zAFjsKVaZGoOY2osWo4Z9632");// 把String 类型的密文解密 System.out.println("解密之後的文件"+strDes); //将这个文件打包成jar包的同时对其进行混淆,达到加密的效果原因 //加密的程序是在原有的基础上进行加密的操作// String test="'sdfasz'''.,.;.,;";// char a=test.charAt(0);// // System.out.println((int)a); }}

然后在导成jar包,使用混淆器进行混淆,这个时候就可以对外使用

转载地址:https://blog.csdn.net/zcswl7961/article/details/53909096 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mysql日志设置命令
下一篇:使用ODBC实现sql server 数据迁移到mysql

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月14日 18时08分25秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Atitit sumdoc t0 final index D:\BaiduNetdiskDownload\sumdoc t0 final\sumdoc t0 wps cld bek D:\Baid 2019-04-29
Atitit sumdoc t0 final index D:\BaiduNetdiskDownload\sumdoc t0 final\sumdoc t0 wps cld bek D:\Baid 2019-04-29
Atitit sumdoc t0 final index 2019-04-29
atitit 编程语言选型知识点体系.docx 编程语言选型时,你需要考虑的几个方面 目录 1. 1.2. 类型系统 5 1 2. 1.5. 语言规范 25 1 3. 1.6. 编程范式 52 2019-04-29
Atitit 编程语言语言规范总结 目录 1. 语言规范 3 2. Types 3 2.1.1. Primitive types 3 2.1.2. Compound types 4 3. State 2019-04-29
Atitit QL查询语言总结 目录 1. QL = Query Language, 是查询语言的简称 1 2. 具体实现 1 2.1. Apcl 流程控制语言 1 2.2. 脚本流程控制 2 2. 2019-04-29
Atitit 开发效率大法 v0 t025.docx Atitit 提升开发效率几大策略 目录 1. 提升效率三原则 3 1.1. 更少的代码量简化 3 1.2. 优化配置减少等待 3 1.3. 2019-04-29
Atitit mybatis的扩展使用sql udf,js java等语言 目录 1.1. 默认,mybatis使用xml,sql等语言来书写业务流程 1 2. 使用ognl调用java函数 1 3 2019-04-29
Atitit if else 选择决策流程ast对比 sql java 表达式类型 binaryExpression hase left and rit expr 目录 1.1. Sql 1 2019-04-29
Atitit 数据库存储引擎 目录 1.1. BLACKHOLE 黑洞引擎 1 1.2. Myisam innodb 1 1.3. Archive 档案类 1 1.4. Fed 连接引擎 2 1. 2019-04-29
Atitit sql注入的防范 目录 1.1. 检查数据类型 1 2. 有限操作DML 1 2.1. 限制执行函数黑名单机制 2 2.2. 限制执行系统sp 2 2.3. 限制数据查询语句类型,只能 2019-04-29
Atitit 自然语言与人工语言的语法构建ast的异同点 目录 1. 语言节点gaishu。。 2 1.1. 节点、函数数量大约200个 2 1.2. 关键词节点 是 有 的 3 1.3. 标识符 2019-04-29
Atitit 效率提升法细则 v3 t028.docx Atitit 提升效率细则 目录 1. 目标 2 1.1. 配置化增加扩展性 尽可能消除编译 方便增加 调整业务逻辑 2 1.2. 统一接口 2019-04-29
Atitit 工程师程序员技术级别对应表与主要特征 P1--p6 说明 类别 职称 对应技术标志 P5 高级工程师 工程师类 一般四五年 P6 资深开发 工程师类 78年经历 P7 P7 2019-04-29
paip.activex控件在WEB中使用流程与工具 2019-04-29
paip.软件及网站项目开发效率低下的思索与改进 2019-04-29
Atitit 可移植性之道attilax著 2019-04-29
paip.截屏功能流程说明 2019-04-29
Atiitt uke兼wag集团2017年度成果报告总结 attilax著 1. 组织机构进一步完善 8大首席部门 1 2. 事业部进一步完善,以及一百多个事业部了 1 3. 企业文化进一步完善 1 2019-04-29
Atititi ui之道 attilax著 v3 s11.docx 1. 概览 2 1.1. 软件设计可分为两个部分:编码设计与UI设计 2 2. 用户界面设计的三大原则是:置界面于用户的控制之下; 2019-04-29