Java文字加密解密:从基础到实践

Java文字加密解密:从基础到实践

在信息安全领域,文字加密解密是一项基础而重要的技术。Java作为一门广泛使用的编程语言,提供了丰富的加密库支持。无论是保护用户密码、传输敏感数据,还是实现数字签名,掌握Java中的加密解密技术都是开发者必备的技能。

一、加密解密的基本概念

加密是将明文转换成密文的过程,而解密则是将密文还原为明文。根据密钥的使用方式,加密算法可分为对称加密和非对称加密两大类。

  • 对称加密:使用同一个密钥进行加密和解密。优点:速度快;缺点:密钥分发困难。常见算法:AES、DES、3DES。
  • 非对称加密:使用一对密钥(公钥和私钥),公钥加密,私钥解密。优点:安全性高;缺点:速度较慢。常见算法:RSA、ECC。

二、Java中的加密库:JCA与JCE

Java提供了Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE) 用于加密操作。JCA定义了加密服务的接口和引擎,而JCE提供了具体实现。注意,在JDK中默认包含了JCA/JCE,但某些算法可能需要安装额外的权限策略文件(特别是旧版本JDK)。

三、对称加密实战:AES加密解密文字

AES(Advanced Encryption Standard)是目前最流行的对称加密算法,支持128、192、256位密钥。以下是一个完整的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.util.Base64;

public class AESUtil {
    // 生成密钥
    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(256); // 密钥长度
        return keyGen.generateKey();
    }

    // 加密
    public static String encrypt(String plainText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // 解密
    public static String decrypt(String encryptedText, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }

    public static void main(String[] args) throws Exception {
        String originalText = "Hello, 世界!";
        SecretKey key = generateKey();
        String encrypted = encrypt(originalText, key);
        String decrypted = decrypt(encrypted, key);
        System.out.println("原文: " + originalText);
        System.out.println("密文: " + encrypted);
        System.out.println("解密: " + decrypted);
    }
}

注意:在JDK中,AES 256位密钥可能需要安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files(JDK 8及之前版本),JDK 9+默认支持。

四、非对称加密实战:RSA加密解密文字

RSA算法基于大整数分解的数学难题,广泛用于密钥交换和数字签名。以下是一个简单的RSA加密解密示例:

import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;

public class RSAUtil {
    // 生成密钥对
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
        generator.initialize(2048);
        return generator.generateKeyPair();
    }

    // 公钥加密
    public static String encrypt(String plainText, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // 私钥解密
    public static String decrypt(String encryptedText, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
        return new String(decryptedBytes, "UTF-8");
    }

    public static void main(String[] args) throws Exception {
        String originalText = "RSA加密测试";
        KeyPair keyPair = generateKeyPair();
        String encrypted = encrypt(originalText, keyPair.getPublic());
        String decrypted = decrypt(encrypted, keyPair.getPrivate());
        System.out.println("原文: " + originalText);
        System.out.println("密文: " + encrypted);
        System.out.println("解密: " + decrypted);
    }
}

RSA加密数据长度有限制(取决于密钥长度),通常用于加密对称密钥或少量数据。

五、实际应用场景与注意事项

  • 密码存储:应使用哈希算法(如SHA-256)加盐,而非可逆加密。
  • 数据传输:建议使用对称加密加密数据,非对称加密加密对称密钥(如HTTPS中的TLS)。
  • 编码问题:密文通常使用Base64编码传输,注意字符编码一致性。
  • 密钥管理:密钥需安全存储,可使用密钥库(KeyStore)或硬件安全模块(HSM)。

六、总结

本文介绍了Java中文字加密解密的核心概念和常用算法,提供了AES和RSA的完整代码示例。实际开发中,应根据安全需求、性能要求以及合规性选择合适的加密方案。加密解密技术是构建安全系统的基石,深入理解并正确应用至关重要。