java加密(对称)

java加密(对称)

   常用对称加密:AES,DES,DESede,IDEA。

   "AES/ECB/PKCS5Padding"
 密钥(keyGenerator)密文(cipher)
AES“AES”
DES“DES”"DES/ECB/PKCS5Padding"
DESede"DESede""DESede/ECB/PKCS5Padding"
IDEA"IDEA""IDEA/ECB/PKCS5Padding"

如下面代码,使用不同加密算法,只要替换对应字符串。
 
 以AES为例: 
public class AESUtil {
	public static void main(String[]args){
		byte[] code=encryptAESCode("zmycontent", "zmykey");
		String scode=byteCodeToString(code);
		System.out.println(Arrays.toString(code));
		System.out.println(scode);
		System.out.println(Arrays.toString(stringCodeToBytes(scode)));
		System.out.println(decryptAESCode(code, "zmykey"));
	}
	//AES加密
	public static byte[] encryptAESCode(String source,String password){
		try {
			
			//密钥生成器
			KeyGenerator kgen = KeyGenerator.getInstance("AES");
			//使用指定种子字节设定随机数
			byte[] pswBytes = password.getBytes("utf-8");
			SecureRandom sr = new SecureRandom(pswBytes);
			//初始化密钥生成器
			//指定密钥大小时只能是128, 192 or 256
			//由于美国对软件出口的限制,读到的是受限的policy文件,所以AES这个地方init长度只能是128,想要修改为其他长度,上网去下policy文件。
			kgen.init(128,sr);
			//生成密钥
			SecretKey secretKey = kgen.generateKey();
			//获取密钥字节
			byte[] enCodeFormat = secretKey.getEncoded();
			//根据给定密钥字节数组构造密钥
			SecretKeySpec key = new SecretKeySpec(enCodeFormat,"AES");
			
			//创建密码器
			Cipher cipher= Cipher.getInstance("AES/ECB/PKCS5Padding");
			byte[] contents=source.getBytes("utf-8");
			//初始化
			cipher.init(Cipher.ENCRYPT_MODE, key);
			
			byte[] result = cipher.doFinal(contents);
			
			return result;
					
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		
		
		return null;
	}
	//AES解密
	public static String decryptAESCode(byte[] encryptCode,String password){
		
		try {
			KeyGenerator kgen = KeyGenerator.getInstance("AES");
			kgen.init(128,new SecureRandom(password.getBytes("utf-8")));
			SecretKey skey = kgen.generateKey();
			SecretKeySpec sks = new SecretKeySpec(skey.getEncoded(),"AES");
			
			Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE, sks);
			byte[] result = cipher.doFinal(encryptCode);
			
			return new String(result,"utf-8");
			
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			e.printStackTrace();
		} catch (BadPaddingException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	//将加密byte[]转换成String
	public static String byteCodeToString(byte[] code){
		StringBuilder sb = new StringBuilder();
		
		//将code范围==>char范围==>转换成String
		for(int i=0;i<code.length;i++){
			int temp =(code[i]+256)%256;
			sb.append((char)temp);
		}
		return sb.toString();
	}
	//将加密String转换成byte[]
	public static byte[] stringCodeToBytes(String code){
		byte[] result = new byte[code.length()];
		for(int i=0;i<code.length();i++){
			char c =code.charAt(i);
			if(c>127){
				result[i]=(byte)(c-256);
			}else{
				result[i]=(byte)c;
			}
		}
		
		return result;
	}
}
将AES密钥文件提出,作为key文件存储:
public class AESUtil {
	public static void main(String[]args) throws Exception{
		generateAESkey("zmykey","c:\\myencrypt\\SecretKey.zmy");
		byte[] encryptCode =encryptByObjKey("Objtestcontent", "c:\\myencrypt\\SecretKey.zmy");
		System.out.println(Arrays.toString(encryptCode));
		System.out.println(byteCodeToString(encryptCode));
		System.out.println(decryptByObjKey(encryptCode, "c:\\myencrypt\\SecretKey.zmy"));
	}
	//AES加密,生成key文件
	public static void generateAESkey(String password,String keyfileurl) throws Exception{
		KeyGenerator kgen = KeyGenerator.getInstance("AES");
		kgen.init(128,new SecureRandom(password.getBytes("utf-8")));
		SecretKeySpec sks = new SecretKeySpec(kgen.generateKey().getEncoded(),"AES");
		
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(keyfileurl));
		oos.writeObject(sks);
		oos.close();
	}
	//AES加密,采用的是文件key
	public static byte[] encryptByObjKey(String source,String keyfileurl)throws  Exception{		
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(keyfileurl));
		SecretKeySpec key =(SecretKeySpec) ois.readObject();
		Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
		cipher.init(Cipher.ENCRYPT_MODE, key);
		byte[] result = cipher.doFinal(source.getBytes("utf-8"));
		return result;
	}
	//AES解密
	public static String decryptByObjKey(byte[] encryptCode,String keyfileurl)throws  Exception{		
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(keyfileurl));
		SecretKeySpec key =(SecretKeySpec) ois.readObject();
		Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
		cipher.init(Cipher.DECRYPT_MODE, key);
		byte[] result = cipher.doFinal(encryptCode);
		return new String(result,"utf-8");
	}
       //将加密byte[]转换成String
	public static String byteCodeToString(byte[] code){
		StringBuilder sb = new StringBuilder();
		//将code范围==>char范围==>转换成String
		for(int i=0;i<code.length;i++){
			int temp =(code[i]+256)%256;
			sb.append((char)temp);
		}
		return sb.toString();
	}
	//将加密String转换成byte[]
	public static byte[] stringCodeToBytes(String code){
		byte[] result = new byte[code.length()];
		for(int i=0;i<code.length();i++){
			char c =code.charAt(i);
			if(c>127){
				result[i]=(byte)(c-256);
			}else{
				result[i]=(byte)c;
			}
		}
		return result;
	}

}
 
  



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值