Java工具类系列:详解8种常用加解密算法及应用场景

该系列属于 java 工具类系列。主要目的是展示 100 个较为常用的 java 工具类。

Java工具类系列:详解8种常用加解密算法及应用场景

此文重点讲述:常见的8种加解密算法。

一、加解密算法应用场景

加解密是什么呢?为什么需要进行加密呢?加密的类型都包含哪些呢?存在万能的加密方式吗?

加密,就是添加密码。密码的作用有加密保护和安全认证。

如果没有进行加密,信息是明文显示的,这样很容易引发信息泄露的情况;而在加密之后,即使未经授权的用户获取到了信息,但是由于他们不知道秘钥,所以依然无法知晓信息的具体内容。

加密算法主要分为单向加密和双向加密这两大类。其中,双向加密又包含对称加密和非对称加密这两种类型。

单向加密指的是非可逆加密,也就是一种不可解密的加密方式。例如:MD5、SHA、HMAC。

双向加密是可逆加密,采用秘钥进行加密和解密。

对称加密会使用相同的密钥来进行加密以及解密。例如:DES 这种加密方式,还有 IDEA、RC2、RC4、SKIPJACK、RC5、AES 等。

非对称加密通常借助两个密钥来完成加密和解密的操作。这两个密钥分别是公开密钥(公钥)以及私有密钥(私钥)。例如:RSA 和 DSA 。

世界上不存在万能的加密算法,只有相对安全的加密算法。加密算法会不断变得更加安全,然而,任何加密算法都有被破解的可能,这听起来似乎相互矛盾。

二、个性化字符串工具类(本文重点)

公共静态最终字符串 MD5 为 "MD5"。
公共静态最终字符串 SHA1 等于 "SHA1"。
公共静态最终字符串 HmacMD5 为 "HmacMD5"。
“公有的静态最终字符串 HmacSHA1 等于 HmacSHA1 。”
3. 存在一个静态的、最终的字符串,它是“DES”。
公共静态最终字符串 AES 等于 "AES";
公共静态字符串 charset 等于 "utf-8"。
公共静态整型 keysizeDES 等于 0 ;
公共静态整型 keysizeAES 的值为 128 。
 //1.Base64算法
 /**
     * 使用Base64进行加密
     * @param res 密文
     */
通过特定的方式对字符串 res 进行 Base64 编码处理。
将 res 转换为字节数组,然后使用 Base64 进行编码并返回。
    }
    /**
     * 使用Base64进行解密
     */
定义一个静态方法 Base64Decode,该方法接收一个字符串参数 res 。
使用 Base64 进行解码操作,将结果 res 进行解码,然后返回一个新的字符串。
    }
 
 //2.AES算法
 /**
     * 使用AES加密算法经行加密(可逆)
     * @param res 需要加密的密文
     * @param key 秘钥
     * @return
     * @return
     */
将字符串 res 进行 AES 加密,使用的密钥为 key 。
调用 keyGeneratorES 函数,传入 res、AES、key、keysizeAES 以及 true 作为参数。
    }
    /**
     * 对使用AES加密算法的密文进行解密
     * @param res 需要解密的密文
     * @param key 秘钥
     */
将字符串 res 进行 AES 解密操作,使用的密钥为 key 。
调用 keyGeneratorES 函数,传入 res、AES、key、keysizeAES 和 false 作为参数,然后返回该函数的执行结果。
    }
 //3.DES算法
 /**
     * 使用DES加密算法进行加密(可逆)
     * @param res 需要加密的原文
     * @param key 秘钥
     */
将字符串 res 使用 DES 算法进行加密,加密时使用的密钥为 key 。具体来说,就是通过特定的 DES 加密机制,将 res 转化为加密后的字符串。
调用 keyGeneratorES 函数,传入参数 res、DES、key、keysizeDES 和 true ,以生成相关结果。
    }
    /**
     * 对使用DES加密算法的密文进行解密(可逆)
     * @param res 需要解密的密文
     * @param key 秘钥
     */
使用指定的密钥 key 对字符串 res 进行 DES 解密操作,最终返回解密后的字符串。
调用 keyGeneratorES 函数,传入 res、DES、key、keysizeDES 和 false 作为参数。
    }
 //4.md5算法
 /**
     * md5加密算法进行加密(不可逆)
     * @param res 需要加密的原文
     */
静态的 String 类型的 MD5 方法接收一个 String 类型的参数 res。
调用 messageDigest 函数并传入 res 和 MD5 作为参数,然后返回结果。
    }
 
    /**
     * md5加密算法进行加密(不可逆)
     * @param res  需要加密的原文
     * @param key  秘钥
     */
将字符串 res 和字符串 key 进行 MD5 加密操作,得到的结果是一个字符串。具体来说,通过特定的 MD5 算法对 res 和 key 进行处理,最终返回经过加密后的字符串。
调用 keyGeneratorMac 函数,传入 res、HmacMD5 和 key 作为参数,然后返回该函数的结果。
    }
 //5.SHA1算法
 /**
     * 使用SHA1加密算法进行加密(不可逆)
     * @param res 需要加密的原文
     */
公共静态字符串 SHA1(字符串 res)。
通过 messageDigest 函数对 res 按照 SHA1 算法进行处理,之后将处理后的结果返回。
    }
    /**
     * 使用SHA1加密算法进行加密(不可逆)
     * @param res 需要加密的原文
     * @param key 秘钥
     * @return
     */
将字符串 res 和字符串 key 进行 SHA1 加密操作,最终得到一个加密后的字符串。
使用 HmacSHA1 算法,通过 keyGeneratorMac 函数对 res 和 key 进行处理并返回结果。
    }
 //6.MessageDigest算法
  /**
     * 使用MessageDigest进行单向加密(无密码)
     * @param res 被加密的文本
     * @param algorithm 加密算法名称
     */
定义一个静态方法 messageDigest,该方法接收两个参数,一个是字符串 res,另一个是字符串 algorithm。
        try {
获取指定算法的消息摘要实例,创建一个名为 md 的 MessageDigest 对象,即 MessageDigest md = MessageDigest.getInstance(algorithm);
如果 charset 为 null ,则 byte[] resBytes = res.getBytes();如果 charset 不为 null ,则 byte[] resBytes = res.getBytes(charset)。
使用 base64 对 md 的摘要(resBytes)进行编码并返回。
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
使用 KeyGenerator 能够进行单向加密或者双向加密,并且可以设置密码。
     * @param res 被加密的原文
     * @param algorithm  加密使用的算法名称
     * @param key 加密使用的秘钥
     */
使用指定的算法和密钥生成用于 res 的 MAC 值。具体来说,是通过特定的方式利用 res、算法以及密钥来生成相关的 MAC 内容。这种生成过程是在私有静态方法 keyGeneratorMac 中进行的。
        try {
            SecretKey sk = null;
            if (key==null) {
获取一个密钥生成器实例,该实例用于生成指定算法的密钥。首先指定要使用的算法,然后通过 KeyGenerator 的 getInstance 方法获取对应的密钥生成器实例。即 KeyGenerator kg 被初始化为通过 getInstance 方法获取的与指定算法相关的密钥生成器实例。
                sk = kg.generateKey();
            }else {
如果 charset 为 null ,那么 byte[] keyBytes = key.getBytes();如果 charset 不为 null ,那么 byte[] keyBytes = key.getBytes(charset)。
创建了一个名为 sk 的 SecretKeySpec 对象,该对象使用 keyBytes 作为密钥字节数组,algorithm 作为算法。
            }
Mac 类的 mac 实例通过 Mac.getInstance(algorithm)方法获取到。
            mac.init(sk);
mac 对 res 的字节数组进行处理后得到一个字节数组,这个字节数组就是 result,即 result 等于 mac 对 res 的字节数组执行 doFinal 方法后的结果。
            return base64(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 //7.KeyGenerator算法 
 /**
使用 KeyGenerator 进行双向加密,包括 DES 和 AES。要注意的是,在将其转化为字符串时,是将二进制转换为十六进制格式的字符串,而不是直接进行转换,因为直接转换会出错。
     * @param res 加密的原文
     * @param algorithm 加密使用的算法名称
     * @param key  加密的秘钥
     * @param keysize
     * @param isEncode
     * @return
     */
2. 该方法接收四个参数,分别是 res、algorithm、key 和 keysize 以及一个布尔类型的 isEncode。
        try {
获取密钥生成器实例,该实例用于生成指定算法的密钥,获取方式为通过 KeyGenerator 的 getInstance 方法并传入算法参数,即 KeyGenerator kg = KeyGenerator.getInstance(algorithm);
            if (keysize == 0) {
                byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);
kg 初始化了一个新的 SecureRandom 对象,并传入了 keyBytes 参数。
            }else if (key==null) {
                kg.init(keysize);
            }else {
                byte[] keyBytes = charset==null?key.getBytes():key.getBytes(charset);
kg 初始化(密钥大小,新的安全随机数生成器(密钥字节数));
            }
生成密钥的操作是通过 kg 来实现的,生成后的密钥被赋值给了 SecretKey sk 。
创建了一个 SecretKeySpec 对象 sks,其密钥由 sk 的编码值构成,使用的算法为 algorithm。
Cipher 是通过以下方式获取的:Cipher cipher = Cipher.getInstance(algorithm);
            if (isEncode) {
cipher 开始进行加密模式的初始化操作,使用了 sks 作为相关参数。
如果 charset 为 null ,那么 byte[] resBytes = res.getBytes();如果 charset 不为 null ,那么 byte[] resBytes = res.getBytes(charset)。
调用 cipher 的 doFinal 方法处理 resBytes 后,将结果通过 parseByte2HexStr 方法进行解析并返回。
            }else {
cipher 开始进行解密模式的操作,并且使用了 sks 。
使用 cipher 的 doFinal 方法对通过 parseHexStr2Byte 方法处理后的 res 进行处理,然后将结果转换为新的 String 并返回。
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
静态的私有字符串 base64 接收一个字节数组 res 作为参数。
        return Base64.encode(res);
    }
 //8.异或
 /**
     * 使用异或进行加密
     * @param res 需要加密的密文
     * @param key 秘钥
     */
定义一个名为 XORencode 的静态方法,该方法接收两个字符串参数 res 和 key,在方法内部进行异或编码操作。
        byte[] bs = res.getBytes();
        for (int i = 0; i < bs.length; i++) {
            bs[i] = (byte) ((bs[i]) ^ key.hashCode());
        }
        return parseByte2HexStr(bs);
    }
    /**
     * 使用异或进行解密
     * @param res 需要解密的密文
     * @param key 秘钥
     */
    public static String XORdecode(String res, String key) {
        byte[] bs = parseHexStr2Byte(res);
        for (int i = 0; i < bs.length; i++) {
            bs[i] = (byte) ((bs[i]) ^ key.hashCode());
        }
        return new String(bs);
    }

本文是供个人记录用的,大家可以从中借鉴。每行代码都是自己亲手打的,经过实际测试可以直接粘贴执行。如果有任何问题,可以在评论区进行提问,欢迎大家相互交流。

编辑人:程序幻境

码字不易,不喜勿踩

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

28阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

26阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读