Base64 特征 A-Za-z0-9+- , =或== 结尾
为什么叫Base64?
因为它是基于(Base)64个字符的一种编码方式。使用其编码后的文本只包含64个ASCII码字符(偶尔加一个或二个填充字符=),如下所示:
Base64使用到的64个字符:
A-Z 26个
a-z 26个
0-9 10个 + 1个 - / 1个
下图是Base64码表,可以看到从0到63的每个数字都对应一个上面的一个字符。
使用 Base64 进行编码,大致可以分为 4 步:
- 将原始数据每三个字节作为一组,每个字节是8个bit,所以一共是 24 个 bit
- 将 24 个 bit 分为四组,每组 6 个 bit
- 在每组前面加补 00,将其补全成四组8个bit
- 到此步,原生数据的3个字节已经变成4个字节了,增大了将近30%
- 根据Base64码表得到扩展后每个字节的对应符号(见上图)
Base64字符串末尾的=是什么
有时我们会在Base64字符末尾会看到=,有时1个,有时2个,这是为啥?
通过上面的我们知道了Base64编码过程是3个字符一组的进行,如果原文长度不是3的倍数怎么办呢? 例如我们的原文为Ma,它不够3个,那么只能在编码后的字符串中补=了。缺一个字符补一个,缺两个补两个即可,所以有时候你会看见base64字符串结尾有1个或者2个=。
HEX 特征 %02X
字节转16进制 PS:汉字需要转UTF-8或UTF-16
Unicode 特征 \u
字节数组 字符串转数组
特征 new String, 逆向 so 文件常常用到,因为char * 本来就是字节数组
加密算法 MD5
消息摘要算法&单向散列函数&哈希算法
单向散列函数算法也称 Hash 算法,是一种将任意长度的消息压缩到某一固定长度的函数(该过程不可逆)。Hash 函数可以数字签名、完整性校验、消息起源的认证检测等 常见:MD5、HMAC、SHA-1、SHA-2
MD5 加密 特征:
- 压缩性:无论数据长度是多少,计算出MD5值长度相同(16位、32位)
- 抗修改性:即便修改一个字节,计算出来的MD5值也是差别很大
- 抗碰撞性,知道数据和MD5值,很小概率找到相同MD5值
- 易计算:原数据很容易计算出MD5
System.out.println("MD5\t\t" + MDUtil.MD5("123456"));
System.out.println("SHA-1\t" + MDUtil.SHA1("123456"));
System.out.println("SHA-224\t" + MDUtil.SHA224("123456"));
System.out.println("SHA-256\t" + MDUtil.SHA256("123456"));
System.out.println("SHA-384\t" + MDUtil.SHA384("123456"));
System.out.println("SHA-512\t" + MDUtil.SHA512("123456"));
// MD5 e10adc3949ba59abbe56e057f20f883e
// SHA-1 7c4a8d09ca3762af61e59520943dc26494f8941b
// SHA-224 f8cdb04495ded47615258f9dc6a3f4707fd2405434fefc3cbf4ef4e6
// SHA-256 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
// SHA-384 0a989ebc4a77b56a6e2bb7b19d995d185ce44090c13e2984b7ecc6d446d4b61ea9991b76a4c2f04b1b4d244841449454
// SHA-512 ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413
对称加密算法
加密和解密使用相同的密钥的算法叫对称加密算法,
- 速度快
DES
:DES 使用56位密钥,将数据分成64位块,进行加密,由于密钥长度比较短,容易遭受到暴力破解攻击,
3DES
:3次 DES 速度慢;
- DES(Data Encryption Standard)是一种对称加密算法,它使用相同的密钥(通常是 56 位长)进行加密和解密操作。
- ECB(Electronic Codebook)是一种加密模式,它将输入的数据分成块,每块独立进行加密运算。
- PKCS5Padding 是一种填充模式,它在数据块长度不足时,使用特定的填充方式进行填充,使每个数据块的长度达到指定长度。
/**
* DES 对称加密
*/
public static void desEncrypt() throws Exception {
String plainText = "需要加密的内容";
String secretKey = "this is password";
DESKeySpec desKeySpec = new DESKeySpec(secretKey.getBytes(StandardCharsets.UTF_8));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(desKeySpec);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("DES加密后的内容=" + encryptedText);
}
AES (高级加密标准)
:使用 128 、 192、 256 位密钥,可以对不同长度的数据块进行加密。AES和DES 更加安全,速度更快,
RC4
:RC4 密钥长度40、64、128
RSA非对称加密算法
-
公钥可以随意分发给任何需要通讯的人,私钥只能由秘钥持有者保留,
-
在非对称加密中, 公钥用户加密消息,私钥用户解密消息
-
使用公钥加密每次密文都不一样的
使用非对称加密算法 对AES的密钥进行加密;
X.509 X509编码密钥规范
X.509 是密码学里公钥证书的格式标准。
X.509 证书已应用在包括 TLS/SSL 在内的众多网络协议里,同时它也用在很多非在线应用场景里,比如电子签名服务。X.509 证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构 CA 的签名,也可以是自签名)。
PKCS 系列 PKCS8编码密钥规范
公钥加密标准(Public Key Cryptography Standards, PKCS),此一标准的设计与发布皆由 RSA 资讯安全公司(英语:RSA Security)所制定。