Skip to content

AES、DES、3DES算法

AES、DES、3DES 都是 对称 的 块加密算法,加解密 的过程是 可逆的。常用的有 AES128、AES192、AES256 (默认安装的 JDK 尚不支持 AES256,需要安装对应的 jce 补丁进行升级 jce1.7,jce1.8)。

1. DES算法

DES 加密算法是一种 分组密码,以 64 位为 分组对数据 加密,它的 密钥长度 是 56 位,加密解密 用 同一算法。

DES 加密算法是对 密钥 进行保密,而 公开算法,包括加密和解密算法。这样,只有掌握了和发送方 相同密钥 的人才能解读由 DES加密算法加密的密文数据。因此,破译 DES 加密算法实际上就是 搜索密钥的编码。对于 56 位长度的 密钥 来说,如果用 穷举法 来进行搜索的话,其运算次数为 2 ^ 56 次。

2. 3DES算法

是基于 DES 的 对称算法,对 一块数据 用 三个不同的密钥 进行 三次加密,强度更高。

3. AES算法

AES 加密算法是密码学中的 高级加密标准,该加密算法采用 对称分组密码体制,密钥长度的最少支持为 128 位、 192 位、256 位,分组长度 128 位,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的 区块加密标准。

AES 本身就是为了取代 DES 的,AES 具有更好的 安全性、效率 和 灵活性。

```java AES import net.pocrd.annotation.NotThreadSafe; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom;

@NotThreadSafe public class AesHelper { private SecretKeySpec keySpec; private IvParameterSpec iv;

public AesHelper(byte[] aesKey, byte[] iv) {
    if (aesKey == null || aesKey.length < 16 || (iv != null && iv.length < 16)) {
        throw new RuntimeException("错误的初始密钥");
    }
    if (iv == null) {
        iv = Md5Util.compute(aesKey);
    }
    keySpec = new SecretKeySpec(aesKey, "AES");
    this.iv = new IvParameterSpec(iv);
}

public AesHelper(byte[] aesKey) {
    if (aesKey == null || aesKey.length < 16) {
        throw new RuntimeException("错误的初始密钥");
    }
    keySpec = new SecretKeySpec(aesKey, "AES");
    this.iv = new IvParameterSpec(Md5Util.compute(aesKey));
}

public byte[] encrypt(byte[] data) {
    byte[] result = null;
    Cipher cipher = null;
    try {
        cipher = Cipher.getInstance("AES/CFB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
        result = cipher.doFinal(data);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return result;
}

public byte[] decrypt(byte[] secret) {
    byte[] result = null;
    Cipher cipher = null;
    try {
        cipher = Cipher.getInstance("AES/CFB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
        result = cipher.doFinal(secret);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return result;
}

public static byte[] randomKey(int size) {
    byte[] result = null;
    try {
        KeyGenerator gen = KeyGenerator.getInstance("AES");
        gen.init(size, new SecureRandom());
        result = gen.generateKey().getEncoded();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return result;
}

} ```