Java加密解密与密码学

密码学是关于加密和解密的科学。在现代计算机和网络系统中,密码学起着至关重要的作用,用于保护敏感信息的安全性和隐私。Java提供了强大的密码学库,使开发人员能够轻松地实现各种加密和解密算法。

密码学基础

密码学涵盖了几个重要的概念和算法。其中最基本的是对称密钥和非对称密钥加密算法。

对称密钥加密算法

对称密钥加密算法是一种使用相同密钥进行加密和解密的算法。这意味着发送方和接收方都需要使用相同的密钥来进行加密和解密。常见的对称密钥加密算法有DES、AES和RC4。

下面是一个使用Java的AES算法进行对称加密和解密的示例代码:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class SymmetricEncryptionExample {
    public static void main(String[] args) throws Exception {
        String plainText = "Hello, World!";
        String secretKey = "ThisIsASecretKey";

        // 创建AES加密算法实例
        Cipher cipher = Cipher.getInstance("AES");

        // 创建密钥规范
        SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), "AES");

        // 使用密钥初始化加密器
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

        // 对明文进行加密
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());

        // 将加密结果转换为Base64编码字符串
        String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);

        System.out.println("Encrypted Text: " + encryptedText);

        // 使用密钥初始化解密器
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

        // 对加密文本进行解密
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));

        // 将解密结果转换为字符串
        String decryptedText = new String(decryptedBytes);

        System.out.println("Decrypted Text: " + decryptedText);
    }
}

非对称密钥加密算法

非对称密钥加密算法使用一对相关联的密钥,一个用于加密,另一个用于解密。这对密钥被称为公钥和私钥。公钥用于加密数据,并可以安全地传输给接收方,而私钥只能由接收方持有,用于解密数据。常见的非对称密钥加密算法有RSA、DSA和ECC。

下面是一个使用Java的RSA算法进行非对称加密和解密的示例代码:

import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.util.Base64;

public class AsymmetricEncryptionExample {
    public static void main(String[] args) throws Exception {
        String plainText = "Hello, World!";

        // 创建RSA密钥对生成器
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(2048); // 使用2048位的密钥长度

        // 生成RSA密钥对
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        // 创建RSA加密算法实例
        Cipher cipher = Cipher.getInstance("RSA");

        // 使用公钥初始化加密器
        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());

        // 对明文进行加密
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());

        // 将加密结果转换为Base64编码字符串
        String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);

        System.out.println("Encrypted Text: " + encryptedText);

        // 使用私钥初始化解密器
        cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());

        // 对加密文本进行解密
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));

        // 将解密结果转换为字符串
        String decryptedText = new String(decryptedBytes);

        System.out.println("Decrypted Text: " + decryptedText);
    }
}

数字签名

数字签名是一种用于验证数据完整性和身份认证的技术。数字签名使用私钥对数据进行加密,然后使用公