编码解码,加密解密,摘要
1、 Base64
用法
原理 通过ASCII 表和Base64 的表不断的 比对和切换
1 把得到的byte 按六位 切出来
2 把切出来的结果 传化成十进制
3 然后去Base64 里面去查表
4 得到的结果 从左到右拼接成字符串
2、UrlEncoder 和UrlDecoder
用处:在客户端和服务端 传递中文字符和特殊字符的时候,为了防止乱码的情况 就要使用 UrlEncoder 和UrlDecoder
用法:UrlEncoder.encode(); UrlDecoder.decode()
原理:和Base64 同理,也是不断查表,不断切分
3、Aes 加密解密
用处:用于把文件和字符串加密和解密 他需要设置密码 并且密码的长度 必须是16、24 、32 个字符
用法
解密的过程 和加密的过程是相反的
需要注意到是,我们的结果是经过了Base64处理后的结果,所以在解密之前得通过Base64 解码回来
注意: AES 的密码的长度要求是16 、24 、32 位 ,如果是其他的情况,那么就不能进行加密和解密
4、 Des 加密
解密
5、RSA 加密
1. 在加密或者解密之前必要要有 公钥或者私钥 (这个公钥和私钥不是输入的,而是直接生成的)
2. 在解密的时候 ,一般的情况 ,不会让你自己生成一个私钥或者公钥来进行加密解密,因为我们操作的客户端,
一般情况下,都是服务端直接给我们一个字符串,让我们自己去生成一个 与服务器相对应的私钥或者公钥
2.1 我们要通过字符串生成一个公钥或者私钥
1、 Base64
用法
Base64.encode(content.getBytes(), Base64.DEFAULT)
Base64.decode(content.getBytes(), Base64.DEFAULT)
原理 通过ASCII 表和Base64 的表不断的 比对和切换
1 把得到的byte 按六位 切出来
2 把切出来的结果 传化成十进制
3 然后去Base64 里面去查表
4 得到的结果 从左到右拼接成字符串
2、UrlEncoder 和UrlDecoder
用处:在客户端和服务端 传递中文字符和特殊字符的时候,为了防止乱码的情况 就要使用 UrlEncoder 和UrlDecoder
用法:UrlEncoder.encode(); UrlDecoder.decode()
原理:和Base64 同理,也是不断查表,不断切分
3、Aes 加密解密
用处:用于把文件和字符串加密和解密 他需要设置密码 并且密码的长度 必须是16、24 、32 个字符
用法
//初始化密文
Cipher cipher = Cipher.getInstance("AES");
// 初始化密码
SecretKeySpec key = new SecretKeySpec(password.getBytes(),"AES");
// 确定是加密还是解密
cipher.init(Cipher.ENCRYPT_MODE,key);
// 加密
byte[] encodeBytes = cipher.doFinal(encodeString.getBytes());
//加密出来的结果必须经过Base64处理一下,然后才不会出现乱码的情况 ,才能正常的解密回去
byte[] encode = Base64.encode(encodeBytes, Base64.DEFAULT);
String encodeResult = new String(encode);
mTextViewResult.setText(encodeResult);
解密的过程 和加密的过程是相反的
需要注意到是,我们的结果是经过了Base64处理后的结果,所以在解密之前得通过Base64 解码回来
注意: AES 的密码的长度要求是16 、24 、32 位 ,如果是其他的情况,那么就不能进行加密和解密
4、 Des 加密
//初始化密文
Cipher cipher = Cipher.getInstance("DES");
// 初始化密码 注意 密码的长度必须要求是8位 这个是和AES 的区别
SecretKeySpec key = new SecretKeySpec(password.getBytes(),"DES");
// 设置加密或者是解密的模式
cipher.init(Cipher.ENCRYPT_MODE,key);
//开始加密
byte[] encodeBytes = cipher.doFinal(content.getBytes());
// 为了防止出现加密出来byte数组出现乱码的情况,我们把得到byte数组 通过base64处理
byte[] encode = Base64.encode(encodeBytes, Base64.DEFAULT);
mTextViewResult.setText(new String(encode));
解密
Cipher cipher = Cipher.getInstance("DES");
SecretKeySpec keys = new SecretKeySpec(passwords.getBytes(),"DES");
cipher.init(Cipher.DECRYPT_MODE,keys);
// 因为我们加密的结果通过了Base64编码过,所以,当我们拿到加密后的结果的时候,我们应该把结果通过base64解密回来
// 然后在进行解密
byte[] resultBytes = cipher.doFinal(decodeBytes);
mTextViewResult.setText(new String(resultBytes));
5、RSA 加密
1. 在加密或者解密之前必要要有 公钥或者私钥 (这个公钥和私钥不是输入的,而是直接生成的)
//初始化密文
Cipher cipher = Cipher.getInstance("RSA");
设置加密或者是解密的模式
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
//开始加密
byte[] encodeBytes = cipher.doFinal(content.getBytes());
// 为了防止出现加密出来byte数组出现乱码的情况,我们把得到byte数组 通过base64处理
byte[] encode = Base64.encode(encodeBytes, Base64.DEFAULT);
mTextViewResult.setText(new String(encode));
2. 在解密的时候 ,一般的情况 ,不会让你自己生成一个私钥或者公钥来进行加密解密,因为我们操作的客户端,
一般情况下,都是服务端直接给我们一个字符串,让我们自己去生成一个 与服务器相对应的私钥或者公钥
2.1 我们要通过字符串生成一个公钥或者私钥
// 通过获取的字符串(私钥的字符串)来生成 一个私钥
byte[] keyBytes = Base64.decode(privateKeyStr.getBytes(), Base64.DEFAULT);
// 通过字符数组 来生成 公钥或者私钥
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory factory = KeyFactory.getInstance("RSA");
生成了私钥
PrivateKey privateKey = factory.generatePrivate(spec);
2.2 解密
// 先解码再解码
byte[] decode = Base64.decode(encodeResult.getBytes(), Base64.DEFAULT);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
byte[] doFinal = cipher.doFinal(decode);