Des加密解密

最近用到公司用到了加密解密方式。所以去看了下加密解密的内容。网上说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我去看了然后再来和大家聊聊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值