Java 常用加密解密算法及应用示例

摘要:在Java开发中,加密解密技术是保护数据安全的重要手段。无论是存储敏感信息(如用户密码、个人信息)还是传输加密数据,都需要用到加密算法。不同的加密算法运用的场景也不同,因此选择合适的加密解密算法也是至关重要。

一、加密算法分类

加密算法的种类繁多,主要可以归纳为以下几大类:

一、对称加密算法

  • 定义:加密和解密使用相同密钥的加密算法。
  • 特点:加密强度高,效率高,但密钥分发和管理较为复杂。
  • 常见算法:
    • DES:一种使用对称密钥加密的块算法,由IBM公司于1975年研发,是广泛应用的早期对称加密算法之一,但由于密钥长度较短(56位),安全性已逐渐降低。
    • 3DES:DES算法的一个更安全的变形,使用3条56位的密钥对数据进行三次加密,提高了安全性,是DES算法向AES算法过渡的算法。
    • AES:高级加密标准(Advanced Encryption Standard),是一种分块加密算法,用于替代原先的DES算法。AES算法由三种不同的算法组成,分别使用128、192或256位加密密钥,具有高强度、高速度和易于实现的特点。
    • RC4:一种流密码算法,由Ron Rivest于1987年创建,通过生成一个伪随机数流与明文进行异或运算来实现加密,具有速度快、简单易用、灵活性高以及适用范围广的特点。
    • 其他还包括Blowfish、IDEA、RC5、RC6等算法。

二、非对称加密算法

  • 定义:非对称加密算法是指加密和解密使用不同密钥的加密算法,通常包含公钥和私钥。公钥用于加密,私钥用于解密(或反之用于验签)。
  • 特点:加密速度慢,但强度高,适用于密钥交换和数字签名等场景。
  • 常见算法:
    • RSA:一种基于公钥加密的算法,广泛应用于SSL证书中的密钥交换和数字签名过程,助力网站实现HTTPS加密,确保网络通信安全。
    • ECC:基于椭圆曲线密码学的加密算法,相比于RSA算法,ECC算法提供了更高的安全性和更短的密钥长度。
    • 其他还包括Diffie-Hellman、El Gamal、DSA(数字签名用)等算法。

三、哈希算法

  • 定义:也叫安全散列算法、消息摘要算法、杂凑算法,是一种将任意长度的输入数据输出为固定长度数据的算法,具有单向性,即不能通过输出数据反推出输入数据。
  • 特点:可实现数据签名、数据完整性校验等功能。
  • 常见算法:
    • MD5:一种加密散列函数算法,将任意长度的信息作为输入,并转换为128位(16字节)的固定长度信息,主要用于验证文件是否被篡改。但近年来,由于其哈希值长度较短,安全性逐渐受到质疑。
    • SHA系列:包括SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)等算法,其中SHA-1算法可以生成160位(20字节)散列值,而SHA-2算法则是SHA-1算法的继承者,提供了更高的安全性。SHA系列算法广泛应用于文件传输校验、代码签名证书等领域。
    • 其他还包括MD2、MD4、HAVAL等算法,但部分算法由于安全性问题已逐渐被淘汰。

二、加密算法实现

本文将介绍几种Java中常用的加密解密算法,并提供相应的使用示例。

对称加密算法

DES算法

DES(Data Encryption Standard)是一种古老的对称加密算法,它以64位为分组长度,密钥长度为56位,8位用于奇偶校验。
在Java中,可以使用javax.crypto.Cipher类来执行DES加密和解密。

import com.alibaba.fastjson.JSON;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

/**
 * DES算法加解密工具类
 */
public class DESUtil {
   

    /**
     * 生成DES密钥
     *
     * @return SecretKey DES密钥
     * @throws NoSuchAlgorithmException 当DES算法不可用时抛出
     */
    public static SecretKey generateDESKey() throws NoSuchAlgorithmException {
   
        KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
        keyGenerator.init(56); // DES算法密钥长度为56位,这里每次调用随机都会生成新的密钥。
        return keyGenerator.generateKey();
    }

    /**
     * 生成固定DES密钥
     *
     * @return SecretKey DES密钥
     */
    public static SecretKey generateFixDESKey() throws UnsupportedEncodingException {
   
        // 定义一个8字节字符串key
        String fixedKey = "qwerasdf";

        // 使用固定的字节数组(64位)创建DES密钥
        return new SecretKeySpec(fixedKey.getBytes(StandardCharsets.UTF_8), "DES");
    }

    /**
     * 使用DES算法加密
     *
     * @param data      待加密的数据
     * @param secretKey DES密钥
     * @return 加密后的数据(Base64编码)
     * @throws Exception 加密过程中的异常
     */
    public static String encrypt(String data, SecretKey secretKey) throws Exception {
   
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }

    /**
     * 使用DES算法解密
     *
     * @param data      加密的数据(Base64编码)
     * @param secretKey DES密钥
     * @return 解密后的数据
     * @throws Exception 解密过程中的异常
     */
    public static String decrypt(String data, SecretKey secretKey) throws Exception {
   
        byte[] encryptedData = Base64.getDecoder().decode(data);
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedData = cipher.doFinal(encryptedData);
        return new String(decryptedData);
    }

    // 工具类不应该有公共构造器
    private DESUtil() {
   
    }

    // 主方法用于测试工具类
    public static void main(String[] args) {
   
        try {
   
            // 生成DES密钥
            SecretKey secretKey = generateFixDESKey();

            System.out.println(JSON.toJSONString(secretKey));

            // 加密数据
            String originalString = "Hello, World!";
            String encryptedString = encrypt(originalString, secretKey);
            System.out.println("Encrypted: " + encryptedString);

            // 解密数据
            String decryptedString = decrypt(encryptedString, secretKey);
            System.out.println("Decrypted: " + decryptedString);
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
}

AES算法

AES(Advanced Encryption Standard)是一种高级加密标准,是目前广泛使用的加密算法之一,提供多种密钥长度(如128位、192位、256位)。
在Java中,可以使用javax.crypto.Cipher类来执行AES加密和解密。

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class AESUtil {
   

    // AES算法名称
    private static final String AES_ALGORITHM = "AES";

    /**
     * 生成AES密钥
     *
     * @return SecretKey AES密钥
     * @throws NoSuchAlgorithmException 当AES算法不可用时抛出
     */
    public static SecretKey generateAESKey() throws NoSuchAlgorithmException {
   
        KeyGenerator keyGenerator = KeyGenerator.getInstance(AES_ALGORITHM);
        keyGenerator.init(128); // 设置密钥长度为128位
        return keyGenerator.generateKey();
    }

    /**
     * 生成AES特定密钥
     *
     * @return SecretKey AES密钥
     * @throws NoSuchAlgorithmException 当AES算法不可用时抛出
     */
    public static SecretKey generateFixAESKey() throws NoSuchAlgorithmException {
   
        // 定义一个16字节字符串key
        String fixedKey = "qwerasdfzxcvbnml";

        // 使用固定的字节数组(128位)创建DES密钥
        return new SecretKeySpec(fixedKey.getBytes(StandardCharsets.UTF_8), "AES");
    }

    /**
     * 使用AES算法加密
     *
     * @param data      待加密的数据
     * @param secretKey AES密钥
     * @return 加密后的数据(Base64编码)
     * @throws Exception 加密过程中的异常
     */
    public static String encrypt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值