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;
	}

}
 
   



你可能感兴趣的:(加密,aes,des,对称加密,Java加密技术)