一、加解密算法
1. 安卓常见算法
消息摘要算法(散列函数、哈希函数)
MD5、SHA、MAC
对称加密算法
DES、3DES、AES
非对称加密算法
RSA
数字签名算法
MD5withRSA、SHA1withRSA、SHA256withRSA
2. Base64编码
2.1 什么是Base64
- Base64是一种用64个字符表示任意二进制数据的方法,它是一种编码,而非加密;
- 组成:A-Z a-z 0-9 + / =
2.2 Base64编码的特点
- Base64编码是编码,不是压缩,编码后只会增加字节数
- 算法可逆, 解码很方便, 不用于私密信息通信
- 标准的Base64每行为76个字符,行末添加换行符
- 加密后的字符串只有65种字符, 不可打印字符也可传输
- 在Java层可以通过hook对应方法名来快速定位关键代码
- 在so层可以通过输入输出的数据和码表来确定算法
3. 消息摘要算法
3.1 常见消息摘要算法
MD5 32位
SHA1、SHA256、SHA512
HmacMD5、HmacSHA1、HmacSHA256、HmacSHA512
RIPEMD160、HmacRIPEMD160、PBKDF2、EvpKDF
3.2 消息摘要算法特点
- 不同长度的输入,产生固定长度的输出;
- 散列后的密文不可逆,散列后的结果唯一;
- 一般用于校验数据完整性、签名sign;
- 由于密文不可逆,所以服务端也无法解密,想要验证,就需要跟前端一样的方式去重新签名一遍;签名算法一般会把源数据和签名后的值一起提交到服务端,要保证在签名时候的数据和提交上去的源数据一致,所以大多数时候的签名都是将表单数据加密后再拼接进表单;
3.3 MD5
// MD5的Java实现
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update("xiaojianbang".getBytes());
md5.digest();
- sha1及sha256与md5java实现是几乎一致的;
3.4 HMAC算法
- MAC算法与MD和SHA的区别是多了一个密钥,密钥可以随机给;
// MAC的Java实现
SecretKeySpec secretKeySpec = new SecretKeySpec("a12345678".getBytes(),"HmacSHA1");
Mac mac = Mac.getInstance(secretKeySpec.getAlgorithm());
mac.init(secretKeySpec);
mac.update("xiaojianbang".getBytes());
mac.doFinal();
4. 对称加密算法
4.1 对称加密特点
- 对称加密算法的密钥可以随机给,但是有位数要求;
- 各算法的密钥长度:
RC4 密钥长度1-256字节
DES 密钥长度8字节
3DES/DESede/TripleDES 密钥长度24字节
AES 密钥长度16、24、32字节
根据密钥长度不同AES又分为AES-128、AES-192、AES-256
- 对称加密算法里,使用NOPadding,加密的明文必须等于分组长度倍数,否则报错;
- 没有指明加密模式和填充方式,表示使用默认的DES/ECB/PKCS5Padding;
- 要复现一个对称加密算法,需要得到 明文、key、iv、mode、padding;
4.2 对称加密分类
序列加密/流加密: 以字节流的方式,依次加密(解密)明文(密文)中的每一个字节
RC4
分组加密: 将明文消息分组(每组有多个字节),逐组进行加密
DES、3DES、AES
4.3 DES
//DES加解密的Java实现
//DESKeySpec desKeySpec = new DESKeySpec("12345678".getBytes());
//SecretKeyFactory key = SecretKeyFactory.getInstance("DES");
//SecretKey secretKey = key.generateSecret(desKeySpec);
SecretKeySpec desKey = new SecretKeySpec("12345678".getBytes(), "DES");
IvParameterSpec ivParameterSpec = new IvParameterSpec("12345678".getBytes());
Cipher des = Cipher.getInstance("DES/CBC/PKCS5Padding");
des.init(Cipher.ENCRYPT_MODE, desKey, ivParameterSpec);
des.doFinal("xiaojianbang".getBytes());
4.3.1 ECB和CBC的区别
- ECB不需要iv,加了的话会报错;
- 如果明文中有两个分组的内容相同,ECB会得到完全一样的密文,CBC不会;
- 后续待添加
评论 (0)