编码 加密 明文---看不懂的密文
编码 防止乱码
1. Base64编码
概念:
Base64编码可用于在HTTP环境下传递较长的标识信息。
为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。
编码表的大小为2^6=64,这也是Base64名称的由来。

工作原理:
Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,
形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用’=’,
因此编码后输出的文本末尾可能会出现1或2个’=’。

代码:
 编码  byte[] encode=Base64.encode(需要编码的字节数组,Base64.DEFAULT);
      String strEncode=Base64.encodeToString(需要编码的字节数组,Base64.DEFAULT);

 解码  byte[] decode=Base64.decode(需要解码的字节数组,Base64.DEFAULT);

2.URL编码 URLEncode与URLDecode
作用:对URL进行encode处理,以保证中文、特殊字符的正确传递。

URLEncode:
特别需要注意的是这个方法对符号也做了编码,”\” ,”&”,”=”,,”:”和” “,并把空格” ” 转换成了 + 。
**1.数字和字母不变,中文会变化;
2.空格变为”+”号;
3.其他被编码成”%xx”加上他们的ASCII的十六进制。**
一般情况url地址中可能既含有中文也含有英文 URLEncode主要是对url地址中的中文进行编码
不要将完成的url全部编码 将中文编码即可

URLDecode
  解码和编码的唯一不同是:解码时只对16进制数(中文编码)解码,而反斜杠/,英文,数字是不会有所改变的

 编码: String encode=URLEncoder.encode(需要编码的字符串,编码字符集)
 解码: String decode= URLDecoder.decode(需要解码的字符串,编码字符集)

MD5加密算法
概念: MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致
是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法)

原理: MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改
MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件名做了任何改动,
其MD5值也就是对应的“数字指纹”都会发生变化。
例子:当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。
通过这样的步骤,系统在并不知道用户密码的明文的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。

//获取MD5信息摘要实例
MessageDigest digest=MessageDigest.getInstance("MD5");
byte[] encode=digest.digest(需要加密数据的字节数组);

对称加密 AES算法
介绍:
在对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yao)一起经过特殊加密算法处理后,
使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密时用过的密钥及相同
算法的逆算法对密文进行解密,才能使其恢复成可读明文。
加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。

优缺点:
对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。
不足之处是,交易双方都使用同样钥匙,安全性得不到保证。

private static final String AES_FLAG="AES/ECB/PKCS5Padding";
//1.创建加解密引擎对象
 Cipher cipher=Cipher.getInstance(AES_FLAG);
 //2.生成aes加解密算法对象
 SecretKeySpec secret=new SecretKeySpec(key.getBytes(),"AES");
//3.初始化加解密引擎
cipher.init(mode,secret);
 //4. 生成最终的明文/密文
result=cipher.doFinal(data);

 private String key="0123456789ABCDEF";//秘钥
 //加密
 byte[] encrypt=AESUtils.encrypt(Cipher.ENCRYPT_MODE,key,需要加密的字节数组);
 //解密
 byte[] encrypt=AESUtils.encrypt(Cipher.DECRYPT_MODE,key,需要解密的字节数组);

非对称加密 RSA算法
简介:
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,
如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的
公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

优缺点:
其安全性更好:
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

//模 
 private static final String MODULUS=”” 
 //公钥 
 private static final String PUB_KEY=”” 
 //私钥 
 private static final String PRI_KEY

加密过程:

//1.创建加密引擎对象 
 Cipher cipher=Cipher.getInstance(“RSA”); 
 //2.创建秘钥的工厂 
 KeyFactory factory=KeyFactory.getInstance(“RSA”); 
 //3.生成RSA公钥对象 RSAPublicKeySpec(系数,加密公钥对象) 
 RSAPublicKeySpec keySpec=new RSAPublicKeySpec(new BigInteger(MODULUS), 
 new BigInteger(PUB_KEY)); 
 //4.生成公钥 
 PublicKey publicKey=factory.generatePublic(keySpec); 
 //5.初始化 
 cipher.init(cipher.ENCRYPT_MODE,publicKey); 
 //6.加密 
 return cipher.doFinal(data);

解密过程:

Cipher cipher=Cipher.getInstance(“RSA”); 
 KeyFactory factory=KeyFactory.getInstance(“RSA”); 
 //生成私钥 
 RSAPrivateKeySpec keySpec=new RSAPrivateKeySpec(new BigInteger(MODULUS), 
 new BigInteger(PRI_KEY)); 
 //生成私钥对象 
 PrivateKey privateKey=factory.generatePrivate(keySpec); 
 cipher.init(Cipher.DECRYPT_MODE,privateKey); 
 return cipher.doFinal(data);