目录介绍
1.加密和解密
1.1 问答环节
1.2 加解密概况
2.对称加密和非对称加密
2.1 什么是对称加密
2.2 什么是非对称加密
2.3 常见对称加密有什么
2.4 常见非对称加密有什么
2.5 非对称加密用途
3.关于单向加密
3.1 MD加密
3.2 什么叫做加盐
4.加密和解密代码展示
4.1 DES加密和解密
4.2 AES解密和解密
5.RSA非对称加解密
5.1 公钥加密,私钥解密
5.2 私钥加密,公钥解密
5.3 完整工具类代码
5.4 注意RSA加密填充方式
5.5 RSA加密内容长度限制问题
5.6 加解密效率测试
5.7 分段加密解密工具类代码
好消息
博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!转载请注明出处,谢谢!
1.加密和解密
1.1 问答环节
1.1.1 常见的加密和解密有哪些?
1.1.2 MD5加密是属于什么类型?是否可逆,以及有哪些应用场景?
1.1.3 实际开发中有哪些加解密的应用场景?
1.2 加解密概况
1)在对称加密算法中,双方使用的密钥相同,要求解密方事先必须知道加密密钥。这类加密算法技术较为成熟,加密效率高。
2)在非对称加密算法中,收发双方使用不同的密钥,发方使用公开密钥对消息进行加密,收发使用私有密钥机型解密,保密性更高,但效率更低。
3)单向加密算法在加密过程中不需要使用密钥,输入明文后由算法直接加密成密文,密文无法解密,只有重新输入密文,并经过同样的加密算法处理,得到形同的密文并被系统重新识别后,才能真正的解密,这种算法非常复杂,通常只在数据量有限的情形下使用,如广泛应用在计算机系统中的口令加密等。
2.对称加密和非对称加密
2.1 什么是对称加密
密钥可以自己指定,只有一把密钥,如果密钥暴露,文件就会被暴露
特点是加密速度很快,但是缺点是安全性较低,因为只要密钥暴漏,数据就可以被解密了。
一句话概括:加密和解密都是用相同密钥
2.2 什么是非对称加密
有两把钥匙(密钥对),公钥和私钥,公钥的话给别人,私钥自己保存
把密钥通常是通过程序生成,不能自己指定
特点是加密速度慢些,但是安全系数很高
加密和解密的规则是:公钥加密只能私钥解密,私钥加密只能公钥解密
应用场景举例:在集成支付宝支付sdk时,需要生成私钥和公钥,公钥需要设置到支付宝网站的管理后台,在程序中调用支付接口的时候,使用我们自己的私钥进行加密,这样支付宝由于有公钥可以解密,其他人即时劫持了数据,但是没有公钥,也无法解密。
2.3 常见对称加密有什么
DES算法(Data Encryption Standard)
AES算法(Advanced Encryption Standard)
2.4 常见非对称加密有什么
RSA
2.5 非对称加密用途
身份认证
一条加密信息若能用A 的公钥能解开,则该信息一定是用A 的私钥加密的,该能确定该用户是A。
陌生人通信
A 和B 两个人互不认识,A把自己的公钥发给B,B也把自己的公钥发给A,则双方可以通过对方的公钥加密信息通信。C 虽然也能得到A、B 的公钥,但是他解不开密文。
支付宝支付加密
具体可以参考支付宝sdk的官方demo
3.关于单向加密
MD5
关于MD5加密的工具类代码如下所示
4.加密和解密代码展示
4.1 DES加密和解密【对称加密】
加密过程
需要加密的内容,也就是明文;然后需要密钥。最后通过工具类加密得到加密后的密文
private final String desEncryptString = "yangchong";
private final String desEncryptKey = "19930311";
s1 = DES.encryptDES(desEncryptString, desEncryptKey);
Log.e("加密和解密", s1);
加密和解密: 84r1gS+D3Op8yrSnF5ZDrQ==
//s1为加密后的密文
解密过程
利用加密后的密文,与设置的key,也就是密钥,则可以解密得到加密的内容
String s2 = DES.decryptDES(s1, desEncryptKey);
Log.e("加密和解密", s2);
//加密和解密: yangchong
Android中实现DES加密和解密的核心代码如下
public class DES {
//初始化向量,随意填写
private static byte[] iv = {1,2,3,4,5,6,7,8};
/**
*
* @param encryptString 明文
* @param encryptKey 密钥
* @return 加密后的密文
*/
public static String encryptDES(String encryptString,String encryptKey){
try {
//实例化IvParameterSpec对象,使用指定的初始化向量
IvParameterSpec zeroIv=new IvParameterSpec(iv);
//实例化SecretKeySpec,根据传入的密钥获得字节数组来构造SecretKeySpec
SecretKeySpec key =new SecretKeySpec(encryptKey.getBytes(),"DES");
//创建密码器
Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding");
//用密钥初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE,key,zeroIv);
//执行加密操作
byte[]encryptedData=cipher.doFinal(encryptString.getBytes());
return Base64.encodeToString(encryptedData,0);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}
return null;
}
/**
* 解密的过程与加密的过程大致相同
* @param decryptString 密文
* @param decryptKey 密钥
* @return 返回明文
*/
public static String decryptDES(String decryptString,String decryptKey){
try {
//先使用Base64解密
byte[]byteMi = Base64.decode(decryptString,0);
//实例化IvParameterSpec对象使用指定的初始化向量
IvParamete