java类加密_Java常用的加密解密类(对称加密类)

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/**

* 加密解密工具类

*/

public class EncryptUtils {

/**

* 进行MD5加密

*

* @param info 要加密的信息

* @return String 加密后的字符串

*/

public String encryptToMD5(String info) {

byte[] digesta = null;

try {

// 得到一个md5的消息摘要

MessageDigest alga = MessageDigest.getInstance("MD5");

// 添加要进行计算摘要的信息

alga.update(info.getBytes());

// 得到该摘要

digesta = alga.digest();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

// 将摘要转为字符串

String rs = byte2hex(digesta);

return rs;

}

/**

* 进行SHA加密

*

* @param info 要加密的信息

* @return String 加密后的字符串

*/

public String encryptToSHA(String info) {

byte[] digesta = null;

try {

// 得到一个SHA-1的消息摘要

MessageDigest alga = MessageDigest.getInstance("SHA-1");

// 添加要进行计算摘要的信息

alga.update(info.getBytes());

// 得到该摘要

digesta = alga.digest();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

// 将摘要转为字符串

String rs = byte2hex(digesta);

return rs;

}

/**

* 根据一定的算法得到相应的key

* @param src

* @return

*/

public String getKey(String algorithm,String src){

if(algorithm.equals("AES")){

return src.substring(0, 16);

}else if(algorithm.equals("DES")){

return src.substring(0, 8);

}else{

return null;

}

}

/**

* 得到AES加密的key

* @param src

* @return

*/

public String getAESKey(String src){

return this.getKey("AES", src);

}

/**

* 得到DES加密的key

* @param src

* @return

*/

public String getDESKey(String src){

return this.getKey("DES", src);

}

/**

* 创建密匙

*

* @param algorithm 加密算法,可用 AES,DES,DESede,Blowfish

* @return SecretKey 秘密(对称)密钥

*/

public SecretKey createSecretKey(String algorithm) {

// 声明KeyGenerator对象

KeyGenerator keygen;

// 声明 密钥对象

SecretKey deskey = null;

try {

// 返回生成指定算法的秘密密钥的 KeyGenerator 对象

keygen = KeyGenerator.getInstance(algorithm);

// 生成一个密钥

deskey = keygen.generateKey();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

// 返回密匙

return deskey;

}

/**

* 创建一个AES的密钥

* @return

*/

public SecretKey createSecretAESKey() {

return createSecretKey("AES");

}

/**

* 创建一个DES的密钥

* @return

*/

public SecretKey createSecretDESKey() {

return createSecretKey("DES");

}

/**

* 根据相应的加密算法、密钥、源文件进行加密,返回加密后的文件

* @param Algorithm 加密算法:DES,AES

* @param key

* @param info

* @return

*/

public String encrypt(String Algorithm, SecretKey key, String info) {

// 定义要生成的密文

byte[] cipherByte = null;

try {

// 得到加密/解密器

Cipher c1 = Cipher.getInstance(Algorithm);

// 用指定的密钥和模式初始化Cipher对象

// 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)

c1.init(Cipher.ENCRYPT_MODE, key);

// 对要加密的内容进行编码处理,

cipherByte = c1.doFinal(info.getBytes());

} catch (Exception e) {

e.printStackTrace();

}

// 返回密文的十六进制形式

return byte2hex(cipherByte);

}

/**

* 根据相应的解密算法、密钥和需要解密的文本进行解密,返回解密后的文本内容

* @param Algorithm

* @param key

* @param sInfo

* @return

*/

public String decrypt(String Algorithm, SecretKey key, String sInfo) {

byte[] cipherByte = null;

try {

// 得到加密/解密器

Cipher c1 = Cipher.getInstance(Algorithm);

// 用指定的密钥和模式初始化Cipher对象

c1.init(Cipher.DECRYPT_MODE, key);

// 对要解密的内容进行编码处理

cipherByte = c1.doFinal(hex2byte(sInfo));

} catch (Exception e) {

e.printStackTrace();

}

return new String(cipherByte);

}

/**

* 根据相应的解密算法、指定的密钥和需要解密的文本进行解密,返回解密后的文本内容

* @param Algorithm 加密算法:DES,AES

* @param key 这个key可以由用户自己指定 注意AES的长度为16位,DES的长度为8位

* @param sInfo

* @return

*/

public static String decrypt(String Algorithm, String sSrc, String sKey) throws Exception {

try {

// 判断Key是否正确

if (sKey == null) {

throw new Exception("Key为空null");

}

// 判断采用AES加解密方式的Key是否为16位

if (Algorithm.equals("AES") && sKey.length() != 16) {

throw new Exception("Key长度不是16位");

}

// 判断采用DES加解密方式的Key是否为8位

if (Algorithm.equals("DES") && sKey.length() != 8) {

throw new Exception("Key长度不是8位");

}

byte[] raw = sKey.getBytes("ASCII");

SecretKeySpec skeySpec = new SecretKeySpec(raw, Algorithm);

Cipher cipher = Cipher.getInstance(Algorithm);

cipher.init(Cipher.DECRYPT_MODE, skeySpec);

byte[] encrypted1 = hex2byte(sSrc);

try {

byte[] original = cipher.doFinal(encrypted1);

String originalString = new String(original);

return originalString;

} catch (Exception e) {

throw e;

}

} catch (Exception ex) {

throw ex;

}

}

/**

* 根据相应的加密算法、指定的密钥、源文件进行加密,返回加密后的文件

* @param Algorithm 加密算法:DES,AES

* @param key 这个key可以由用户自己指定 注意AES的长度为16位,DES的长度为8位

* @param info

* @return

*/

public static String encrypt(String Algorithm, String sSrc, String sKey) throws Exception {

// 判断Key是否正确

if (sKey == null) {

throw new Exception("Key为空null");

}

// 判断采用AES加解密方式的Key是否为16位

if (Algorithm.equals("AES") && sKey.length() != 16) {

throw new Exception("Key长度不是16位");

}

// 判断采用DES加解密方式的Key是否为8位

if (Algorithm.equals("DES") && sKey.length() != 8) {

throw new Exception("Key长度不是8位");

}

byte[] raw = sKey.getBytes("ASCII");

SecretKeySpec skeySpec = new SecretKeySpec(raw, Algorithm);

Cipher cipher = Cipher.getInstance(Algorithm);

cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

byte[] encrypted = cipher.doFinal(sSrc.getBytes());

return byte2hex(encrypted);

}

/**

* 采用DES随机生成的密钥进行加密

* @param key

* @param info

* @return

*/

public String encryptToDES(SecretKey key, String info) {

return encrypt("DES", key, info);

}

/**

* 采用DES指定密钥的方式进行加密

* @param key

* @param info

* @return

* @throws Exception

*/

public String encryptToDES(String key, String info) throws Exception {

return encrypt("DES", info, key);

}

/**

* 采用DES随机生成密钥的方式进行解密,密钥需要与加密的生成的密钥一样

* @param key

* @param sInfo

* @return

*/

public String decryptByDES(SecretKey key, String sInfo) {

return decrypt("DES", key, sInfo);

}

/**

* 采用DES用户指定密钥的方式进行解密,密钥需要与加密时指定的密钥一样

* @param key

* @param sInfo

* @return

*/

public String decryptByDES(String key, String sInfo) throws Exception {

return decrypt("DES", sInfo, key);

}

/**

* 采用AES随机生成的密钥进行加密

* @param key

* @param info

* @return

*/

public String encryptToAES(SecretKey key, String info) {

return encrypt("AES", key, info);

}

/**

* 采用AES指定密钥的方式进行加密

* @param key

* @param info

* @return

* @throws Exception

*/

public String encryptToAES(String key, String info) throws Exception {

return encrypt("AES", info, key);

}

/**

* 采用AES随机生成密钥的方式进行解密,密钥需要与加密的生成的密钥一样

* @param key

* @param sInfo

* @return

*/

public String decryptByAES(SecretKey key, String sInfo) {

return decrypt("AES", key, sInfo);

}

/**

* 采用AES用户指定密钥的方式进行解密,密钥需要与加密时指定的密钥一样

* @param key

* @param sInfo

* @return

*/

public String decryptByAES(String key, String sInfo) throws Exception {

return decrypt("AES", sInfo, key);

}

/**

* 十六进制字符串转化为2进制

*

* @param hex

* @return

*/

public static byte[] hex2byte(String strhex) {

if (strhex == null) {

return null;

}

int l = strhex.length();

if (l % 2 == 1) {

return null;

}

byte[] b = new byte[l / 2];

for (int i = 0; i != l / 2; i++) {

b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), 16);

}

return b;

}

/**

* 将二进制转化为16进制字符串

*

* @param b 二进制字节数组

* @return String

*/

public static String byte2hex(byte[] b) {

String hs = "";

String stmp = "";

for (int n = 0; n 

stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));

if (stmp.length() == 1) {

hs = hs + "0" + stmp;

} else {

hs = hs + stmp;

}

}

return hs.toUpperCase();

}

/**

* 测试

*

* @param args

*/

public static void main(String[] args) {

EncryptUtils encryptUtils = new EncryptUtils();

String source = "www.putiman.com";

System.out.println("Hello经过MD5:" + encryptUtils.encryptToMD5(source));

System.out.println("Hello经过SHA:" + encryptUtils.encryptToSHA(source));

System.out.println("========随机生成Key进行加解密==============");

// 生成一个DES算法的密匙

SecretKey key = encryptUtils.createSecretDESKey();

String str1 = encryptUtils.encryptToDES(key, source);

System.out.println("DES加密后为:" + str1);

// 使用这个密匙解密

String str2 = encryptUtils.decryptByDES(key, str1);

System.out.println("DES解密后为:" + str2);

// 生成一个AES算法的密匙

SecretKey key1 = encryptUtils.createSecretAESKey();

String stra = encryptUtils.encryptToAES(key1, source);

System.out.println("AES加密后为:" + stra);

// 使用这个密匙解密

String strb = encryptUtils.decryptByAES(key1, stra);

System.out.println("AES解密后为:" + strb);

System.out.println("========指定Key进行加解密==============");

try {

String AESKey = encryptUtils.getAESKey(encryptUtils.encryptToSHA(source));

String DESKey = encryptUtils.getDESKey(encryptUtils.encryptToSHA(source));

System.out.println(AESKey);

System.out.println(DESKey);

String str11 = encryptUtils.encryptToDES(DESKey, source);

System.out.println("DES加密后为:" + str11);

// 使用这个密匙解密

String str12 = encryptUtils.decryptByDES(DESKey, str11);

System.out.println("DES解密后为:" + str12);

// 生成一个AES算法的密匙

String strc = encryptUtils.encryptToAES(AESKey, source);

System.out.println("AES加密后为:" + strc);

// 使用这个密匙解密

String strd = encryptUtils.decryptByAES(AESKey, strc);

System.out.println("AES解密后为:" + strd);

} catch (Exception e) {

e.printStackTrace();

}

}

}

简要介绍<br>JAVA CLASS文件加密工具是一款专门为保护您的JAVA源代码而设计的软件。传统的JAVA代码保护方式通常是扰乱生成的CLASS文件,从而降低反编译生成的源代码的可读性;有的保护工具甚至能生成部分废代码(垃圾代码),使得反编译后的源码在重新编译时出现编译错误,不能直接生成CLASS文件。这种方法具有一定的效果,但是不能彻底保护您的JAVA源代码。 <br><br>JAVA CLASS文件加密工具对CLASS文件进行加密保护,加密密钥高达256位(bit,即:32字节),并采用多重加密的算法,既安全又高效。加密后的CLASS文件不可能被破解;反编译工具对加密后的CLASS文件无能为力,根本就不能处理! <br><br>运行方式<br>运行时,加密后的CLASS文件要能正常加载,需要使用我们提供的动态库hidea.dll。执行java时带上参数<br>-agentlib:<动态库文件所在路径>\hidea<br>注意:不要加文件后缀.dll,直接使用文件的名字部分(classloader)!<br><br>举例说明:例如,本加密工具安装在c:\hideasoft\java_protect,执行加密后的CLASS文件的命令行如下:<br>java -agentlib:c:\hideasoft\java_protect\hidea <您的CLASS及参数><br>应用场合<br>独立的应用程序(Application,自定义main方法),运行java时,带上参数-agentlib:<所在路径>\hidea <br>Tomcat等JAVA Web Server,修改启动脚本,把执行java的命令行加上参数-agentlib:<所在路径>\hidea <br>JBOSS等JAVA Application Server(应用服务器),修改启动脚本,把执行java的命令行加上参数-agentlib:<所在路径>\hidea <br>适用环境操作系统:Windows 98/2000/XP 等Windows系统 <br>JDK:1.5.0及以上版本
软件介绍 本工具是对java class文件进行加密保护防止反编译的工具!本工具全面支持linux/unix/windows操作系统。 继推出v1.0版本后,获得了用户大量的支持与的反馈,我们再次推出本v2.0版,对加密算法进行了更大的改进,安全性大大提升! 众所周知,java编译后的class文件是一种中间字节字文件, 很容易被反编译工具反编译,而传统的java源代码保护方法基本都是采用混淆的方式, 但这样会带来很多麻烦,而且也不能真正保护class文件, 本工具是对class文件进行加密,采用jni的方式解密运行, 加密算法达到256位,加密后的class文件不可能被破解,反编译工具也对加密后的class文件无能为力。 运行方式: 运行时,要能正确的加载加密后的class文件, 必须使用我们提供的动态链接库classloader.dll(windows操作系统)或者libclassloader.so(Linux、Unix操作系统)。 执行java时带上参数-agentlib:\classloader 注意此处不要后缀名.dll(或者.so)。 如: 我把classloader.dll放在C:\目录下; 运行加密后的class文件命令如下: windows下执行javajava -agentlib:C:\classloader Sample Linux、Unix等系列操作系统下执行javajava -agentlib:/home/classloader Sample 或者把libclassloader.so拷贝到如“/home/yzj/jdk1.6.0_23/jre/lib/i386/”这jdk的运行目录下, 然后执行java如:java -agentlib:classloader Sample 当然如果class文件没加密,这样运行也不会出错! 应用场合: 独立的应用程序,运行java时,带上参数-agentlib:\classloader Tomcat、Jboss等Java application server修改启动脚本, 把执行java的命令行后面加上参数-agentlib:\classloader 适应环境: 操作系统:所有操作系统,Windows系统、Linux/Unix,只是运行时, 使用的动态链接库文件不一样而已,其它配置完全一样。 jdk必须1.5以上。 备注:如果下载站下载下来的程序有运行bug,请从上面两个下载地址更新软件。并给我们留言!谢谢... 升级提示:v2.1相比v2.0修改了一个注册bug。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值