最近用到公司用到了加密解密方式。所以去看了下加密解密的内容。网上说des加密是可以暴力破解的。但是我还没去破解过,加密虽然对付不了高手 ,一般的还是可以抵挡的,在然后可以随时更改key,加密数据填充方式等。Des加密是一种对称加密算法。
Des加密的几个点:第一个密钥长度
第二个:加密模式,如CBC,ECB,CFB等方式。
第三个:填充模式:PKCS5Padding、NoPadding等方式。
具体的des我也没有摸清楚,然后写了个简单工具类,也是参考了别人的。
package com.learn.des;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
public class DES {
private static String characterSet = "UTF-8";
private static String keyMode = "DES/CBC/PKCS5Padding";
private static String DES = "DES";
/**
* <p>Name: decrypt</p>
* <p>Title: 解密数据</p>
* <p>Description:解密数据 </p>
* @param message
* @param key
* @throws Exception
* @version 1.0
* @history 修订历史(历次修订内容、修订人、修订时间等)
*/
public static String decrypt(String message, String key) throws Exception {
//将字符串转化为十六进制的byte数组
byte[] byteMsg = stringConvertHexByteArr(message);
Cipher cipher = Cipher.getInstance(keyMode);
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(characterSet));
SecretKeyFactory seckeyFactory = SecretKeyFactory.getInstance(DES);
SecretKey secretKey = seckeyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(key.getBytes(characterSet));
<pre name="code" class="html"><span style="white-space:pre"> </span>//这儿的secretKey和iv里面的字符可以使用不同的key值进行加密解密的。我们这儿都是用的相同的,大家可以去替换使用不同的试试效果。密钥不同安全性越高。密钥长度越长安全性越高。
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);byte[] retByte = cipher.doFinal(byteMsg);String retStr = new String(retByte);return retStr;}/** * * <p>Name: encrypt</p> * <p>Title: 加密数据</p> * <p>Description:加密数据 </p> * <p>模块: </p> * @param message * @param key * @throws Exception * @version 1.0 * @history 修订历史(历次修订内容、修订人、修订时间等) */public static byte[] encrypt(String message, String key) throws Exception {//生成一个实现指定转换的 Cipher对象 ,//"DES/CBC/PKCS5Padding" 算法名称/反馈模式/填充方案Cipher cipher = Cipher.getInstance(keyMode);//创建一个 DESKeySpec 对象,使用 key 中的前 8 个字节作为 DES 密钥的密钥内容DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(characterSet));//生成“DES”密钥算法的 SecretKeyFactory 对象。SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);//根据提供的密钥算法类型,生成 SecretKey 对象。SecretKey secretKey = keyFactory.generateSecret(desKeySpec);//初始化IV制定字符集IvParameterSpec iv = new IvParameterSpec(key.getBytes(characterSet));
<span style="white-space:pre"> </span>//这儿的secretKey和iv里面的字符可以使用不同的key值进行加密解密的。
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
return cipher.doFinal(message.getBytes(characterSet));
}
/**
* 将字符串转化为十六进制的byte数组
* @param str
* @return
* @version 1.0
* @history 修订历史(历次修订内容、修订人、修订时间等)
*/
public static byte[] stringConvertHexByteArr(String str) {
byte digest[] = new byte[str.length() / 2];
for (int i = 0; i < digest.length; i++) {
String byteString = str.substring(2 * i, 2 * i + 2);
int byteValue = Integer.parseInt(byteString, 16);
digest[i] = (byte) byteValue;
}
return digest;
}
/**
* 十六进制byte数组转化为字符串
* @param b
* @version 1.0
* @history 修订历史(历次修订内容、修订人、修订时间等)
*/
public static String hexByteArrToString(byte b[]) {
StringBuffer str = new StringBuffer();
for (int i = 0; i < b.length; i++) {
//以十六进制的无符号整数形式返回一个整数参数的字符串
String hexStr = Integer.toHexString(0xff & b[i]);
if (hexStr.length() < 2){
hexStr = "0" + hexStr;
}
str.append(hexStr);
}
return str.toString();
}
/**
* 获取加密字符串
* @param key 加密KEY 长度为8位的字符串
* @param value 需要加密的字符串
* @return 加密后的字符串
* @throws Exception
* @version 1.0
* @history 修订历史(历次修订内容、修订人、修订时间等)
*/
public static String getEncStr(String key,String value) throws Exception{
//String str = URLEncoder.encode(value, "utf-8").toLowerCase();//小写加密
//制定加密字符串的字符集
String str = URLEncoder.encode(value, characterSet);
<pre name="code" class="html"><span style="white-space:pre"> </span>//也可以直接调用这个<span style="font-family: Arial, Helvetica, sans-serif;">encrypt</span><span style="font-family: Arial, Helvetica, sans-serif;">,但是注意用CBC模式就最好用Base64进行编码一下。</span>
byte[] encryptByteArr = encrypt(str, key);String encStr = hexByteArrToString(encryptByteArr).toUpperCase();return encStr;}/** * 获取解密字符串 * @param key 解密key 长度为8位的字符串 * @param value 加密的字符串 * @return 解密后的字符串 * @throws Exception * @version 1.0 * @history 修订历史(历次修订内容、修订人、修订时间等) */public static String getDecStr(String key,String value) throws Exception{//String str = URLEncoder.encode(value, "utf-8").toLowerCase();//小写解密//制定解密字符串的字符集String str = URLEncoder.encode(value, characterSet);
<span style="white-space:pre"> </span>//也可以直接调用这个decrypt,但是注意用CBC模式就最好用Base64进行编码一下。
String deciphStr = decrypt(str, key);
String encDeciphStr = URLDecoder.decode(deciphStr, characterSet);
return encDeciphStr;
}
public static void main(String[] args) throws Exception {
String encstr = getEncStr("12345678","helloworld");
System.out.println("加密后的 密文是 : " + encstr);
String decstr = getDecStr("12345678","37C275AF9121E156EA8AE0ADF97B53CF");
System.out.println("解密后为 : " + decstr);
}
}
然后这是一个java文件可以直接使用,但是也能在android里面使用的。无图无真相,然后就给大家上个图吧。这是一个工具类,大家可以保存修改然后直接使用。然后3des比des加密性更高。3des我去看了然后再来和大家聊聊。