AES:一种高级加密标准(英语:Advanced Encryption Standard,缩写:AES)在密码学中又称Rijndael加密法,这个标准用来替代原先的DES(数据加密标准),是对称密钥加密中最流行的算法之一。
密钥:AES要求密钥的长度可以是128位16个字节,192位或256位,位数越高,加密强度自然越大,但是加密的效率自然会低一些,因此要做好衡量,我们开发通常采用128位16个字节的密钥,我们使用AES加密时需要主动提供密钥,而且只需要提供一个密钥就够了,每段数据加密使用的都是这一个密钥,密钥来源为随机生成。
五种加密模式:AES一共有五种加密模式,分别是ECB(Electronic Codebook,电码本模式),
ECB模式一般只适用于小数据量的字符信息的安全性保护,例如密钥保护。,CBC(Cipher Block Chaining,密码分组链接模式),CTR(计算器模式),CFB(密码反馈模式),OFB(输出反馈模式)
Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法,由于 2^6=64,所以每 6 个比特为一个单元,对应某个可打印字符。
Base64 常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括 MIME 的电子邮件及 XML 的一些复杂数据。
Base64 编码要求把 3 个 8 位字节(3 * 8=24)转化为 4 个 6 位的字节(4*6=24),之后在 6 位的前面补两个 0,形成 8 位一个字节的形式。 如果剩下的字符不足 3 个字节,则用 0 填充,输出字符使用 =,因此编码后输出的文本末尾可能会出现 1 或 2 个 =。
为了保证所输出的编码位可读字符,Base64 制定了一个编码表,以便进行统一转换。编码表的大小为 2^6=64,这也是 Base64 名称的由来。
在 Base64 中的可打印字符包括字母 A-Z、a-z、数字 0-9,这样共有 62 个字符,此外两个可打印符号在不同的系统中而不同。
加解密的世界很复杂,对称加密、非对称加密。java内容-使用工具类实现:
加密及编码
public String encrypt(String encryptKey, String data) throws Exception{
//创建密码器 AlgorithmProvider("AES/ECB/PKCS5Padding")-加密器
Cipher cipher = Cipher.getInstance(AlgorithmProvider);
//初始化 encryptKey-加密key data-要加密的json数据 encoding-编码("utf-8") Algorithm-("AES")
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(encoding),Algorithm));
byte[] result = cipher.doFinal(data.getBytes(encoding));
//编码
BASE64Encoder base64 = new BASE64Encoder();
return base64.encode(result);
}
解码及解密
public String decrypt(String decryptKey, String data) throws Exception{
//创建密码器 AlgorithmProvider("AES/ECB/PKCS5Padding")-加密器
Cipher cipher = Cipher.getInstance(AlgorithmProvicer);
//初始化 decryptKey-解密key data-要解密数据 encoding-编码("utf-8") Algorithm-("AES")
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(encoding), Algorithm));
BASE64Decoder base64 = BASE64Decoder();
//解码
byte[] decoderResult = base64.decodeBuffer(data);
//解密
byte[] result = cipher.doFinal(decoderResult);
return new String(result, encoding);
}
MD5
通俗的讲,MD5 算法能对一串输入生成一串唯一的不可逆的 128 bit 的 0 和 1 的二进制串信息。
不同的输入,输出就会不一样,即使只做了细微修改,两者输出仍旧毫无规律而言。
另外,因为经过 MD5 计算后输出是 128 bit 的 0 和 1 二进制串,但通常都是用十六进制来表示比较友好,1个十六进制是 4 个 bit,128 / 4 = 32,所以常说的 32 位的 MD5 指的是用十六进制来表示的输出串。
那么,为什么还会有 16 位的 MD5 值?其实也就是嫌 32 位的数据太长了,所以去掉开头 8 位,末尾 8 位,截取中间的 16 位来作为 MD5 的输出值。
所以,MD5 算法的输出只有一种:128 bit 的二进制串,而通常结果都用十六进制表示而已,32 位与 16 位的只是精度的区别而已。
MD5 的应用
应用场景很多:数字签名、身份校验、完整性(一致性)校验等等。
参考文档: