加密算法分为双向加密和单向加密。单向加密包括MD5、SHA等摘要算法,它们是不可逆的。双向加密包括对称加密和非对称加密,对称加密包括AES加密、DES加密等。双向加密是可逆的,存在密文的密钥
1. 单向散列加密
单向加密又称为不可逆加密算法,其密钥是由加密散列函数生成的。单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:
1、MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文;
2、SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值。其变种由SHA192,SHA256,SHA384等;
3、CRC-32,主要用于提供校验功能;
算法特征:
① 输入一样,输出必然相同;
② 雪崩效应,输入的微小改变,将会引起结果的巨大变化;
③ 定长输出,无论原始数据多大,结果大小都是相同的;
④ 不可逆,无法根据特征码还原原来的数据;
2 . 对称加密
采用单钥密码的加密方法,同一个密钥可以同时用来加密和解密,这种加密方法称为对称加密,也称为单密钥加密。常用的单向加密算法:
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密;
算法特征:
1、加密方和解密方使用同一个密钥;
2、加密解密的速度比较快,适合数据比较长时的使用;
3、密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦;
AES加密算法
AES是高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,目前已经被全世界广泛使用,同时AES已经成为对称密钥加密中最流行的算法之一。AES支持三种长度的密钥:128位,192位,256位。
AES加密算法原理
1.密钥
密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。
AES支持三种长度的密钥:
128位,192位,256位
AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。
AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。
明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。
AES 的加密公式为 C=E(K,P),其中 K 为密钥,P 为明文,C 为密文
AES算法流程
AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。
1、解密算法的每一步分别对应加密算法的逆操作;
2、加解密所有操作的顺序正好是相反的。正是由于这几点(再加上加密算法与解密算法每步的操作互逆)保证了算法的正确性。加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到。算法中16字节的明文、密文和轮子密钥都以一个4x4的矩阵表示。
存储数据加密解密使用的KeyGenerator类,是Java的一个内置类,它用于生成密钥。这个类提供了一种生成密钥的方法,这些密钥可以用于加密和解密数据。
以下是KeyGenerator类的一些主要方法:
1. init(int keysize):初始化此密钥生成器,使其准备生成一个指定大小的密钥。参数keysize是一个整数,表示密钥的大小(以位为单位)。
2. generateKey():生成一个新的密钥。
3. reinit(int keysize):重新初始化此密钥生成器,以便它可以生成一个指定大小的新密钥。参数keysize是一个整数,表示新密钥的大小(以位为单位)。
4. getAlgorithm():返回此密钥生成器的算法名称。
5. getKeySize():返回此密钥生成器生成的密钥的大小(以位为单位)。
avax.crypto.Cipher 类提供加密和解密的功能,它构成了 Java Cryptography Extension (JCE) —— Java 加密扩展框架的核心。这些都是 Java JDK 原生的 API,不是第三方的。
Cipher 的 getInstance(String transformation) 方法可以获取实例,参数 transformation 表示转换名称,包括:加密算法/反馈模式/填充方案。加密算法是必选项,反馈模式与填充方案可以不写使用默认值。如:
Cipher cipher = Cipher.getInstance("AES");
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");