java-DES和3DES和AES的简单使用

一、DES

package md;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Hex;

public class DesUtil {
	 public static byte[] secretkey()
	 {
		 SecretKey secretKey=null;
		 try {
			 //密钥生成器
			KeyGenerator keyGenerator=KeyGenerator.getInstance("DES");
			//设置密钥的位数
		   keyGenerator.init(56);
		   //生成密钥
		    secretKey=keyGenerator.generateKey();
		  
		} catch (NoSuchAlgorithmException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		 
		 //返回字节数组
		return secretKey.getEncoded();
		 
		 
	 }
	 public static byte[]  Encrypt_data(byte[] key,byte[] data)
	 { 
		 byte[] cipherByte=null;
		 SecretKey secretKey=new SecretKeySpec(key, "DES");
		 //使用Cipher进行加密
		 try {
			 //也可以设置为Cipher cipher=Cipher.getInstance("DES/ECB/PKCS5Padding");
			 
			Cipher cipher=Cipher.getInstance("DES");
			try {
				//设置加密和解密的模式
				cipher.init(Cipher.ENCRYPT_MODE,secretKey);
			} catch (InvalidKeyException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			try {
				cipherByte=cipher.doFinal(data);
			} catch (IllegalBlockSizeException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			} catch (BadPaddingException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
			
		} catch (NoSuchAlgorithmException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
		 return cipherByte;
	 }
	 public static byte[] DesCrypt(byte[] key,byte[] data)
	 {SecretKey secretKey=new SecretKeySpec(key, "DES");
	   //同样的也是通过Cipher进行加密和解密
	   Cipher cipher=null;
	   byte[] final_Data=null;
	try {
		cipher = Cipher.getInstance("DES");
	} catch (NoSuchAlgorithmException e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
	} catch (NoSuchPaddingException e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
	}
	   try {
		cipher.init(cipher.DECRYPT_MODE,secretKey);
		try {
			final_Data=	cipher.doFinal(data);
		} catch (IllegalBlockSizeException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (BadPaddingException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	} catch (InvalidKeyException e) {
		// TODO 自动生成的 catch 块
		e.printStackTrace();
	}
	   
	   
		 
		 
		 return final_Data;
		 
		 
	 }
	 public static String encodeTOhex(byte[] c,boolean lowerCase)
		{
			  return Hex.encodeHexString(c, lowerCase);
		}
			 

}

调用以及实现结果:

package md;

public class Des {
	  public static void main(String[] args) {
		String cString="yangdidi";
		
		byte[] secretkey=DesUtil.secretkey();
		//生成初始化密钥
		String key_data=DesUtil.encodeTOhex(secretkey, true);
		System.out.println("产生的密钥为----"+key_data);
		 byte[] string=DesUtil.Encrypt_data(secretkey, cString.getBytes());
		 System.out.println("进行加密后的内容是-----"+DesUtil.encodeTOhex(string, true));
		 //进行解密
		 byte[] string2=DesUtil.DesCrypt(secretkey, string);
		 System.out.println("进行解密后的内容结果是----"+new String(string2));
		 
		
	}

}
产生的密钥为----cb58ab2a70a8028f
进行加密后的内容是-----9f5d723eb3665ca08a77262a66ea41ca
进行解密后的内容结果是----yangdidi

二、3DES

package md;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Hex;
public class Desede{
	public static byte[] initkey() throws Exception
	{
		KeyGenerator keyGenerator=KeyGenerator.getInstance("DESede");
		keyGenerator.init(168);
		SecretKey secrekey=keyGenerator.generateKey();
		return secrekey.getEncoded();
	}
	public static byte[] EncryptData(byte[] data,byte[] key) throws Exception
	{
		SecretKey secretKey= new  SecretKeySpec(key,"DESede");
		//产生密钥
		Cipher cipher=Cipher.getInstance("DESede");
		cipher.init(Cipher.ENCRYPT_MODE, secretKey);
		byte[] encryptData=cipher.doFinal(data);
		return encryptData;
		
	}
	public static byte[] Decrypt(byte[] data,byte[] key)throws Exception
	{
		SecretKey secretKey= new SecretKeySpec(key, "DESede");
		Cipher cipher=Cipher.getInstance("DESede");
		cipher.init(Cipher.DECRYPT_MODE, secretKey);
		byte[] content=cipher.doFinal(data);
		return content;
	}
	public static String byteToHex(byte[] data)
	{
		return  Hex.encodeHexString(data, true);
	}
	public static void main(String args[]) throws Exception
	{
		String cString="yangdidi";
		byte[] key=Desede.initkey();
		//初始化key
		System.out.println("产生的密钥为"+Desede.byteToHex(key));
		byte[] encryptData=Desede.EncryptData(cString.getBytes(),key);
		System.out.println("加密的后内容为"+Desede.byteToHex(encryptData));
		byte[]  DecryptData=Desede.Decrypt(encryptData, key);
		System.out.println("解密的后内容为"+new String(DecryptData));
	}

}

实现结果;

产生的密钥为f41340076d57ab54b9da54ec7f16293820e9d931cb9be9fd
加密的后内容为96328664860faf5087a4ae01823834f0
解密的后内容为yangdidi

三、AES(直接修改keyGenerator、Cipher)中的参数为AES

四、过程总结

 1、创建SecretKey对象

  keyGenerator keygenerator=KeyGenerator.getInstance("相关的算法名称");

 keygenerator.init(生成密钥的位数);

  Secretkey secrekey=keygenerator.generator();

  secrekeygetEncoded();

2、通过Cipher来对数据进行加密和解密

  因为密钥一般都是通过字节数组来进行存储,那么一般都是通过传入byte[] 来创建出Secretkey

  SecreKey secrekey =new SecretKeySpec(key,"相关的算法名称");

 Cipher cipher=Cipher.getInstance("相关的算法名称”);

  cipher.init(加密模式为Cipher.Encrypt_MODE,secretkey);

//如果为解密为  cipher.init(解密模式为Cipher.Decrypt_MODE,secretkey);

  byte[] encryptData=cipher.doFinal(data);

3、如果需要设置相关的模式

  Cipher cipher=Cipher.getInstance("相关的算法名称/EBC/PKCS5Padding”);

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值