当前位置:首页 > Java

java 如何解密

2026-03-03 18:40:17Java

解密方法概述

在Java中实现解密通常涉及对称加密(如AES)、非对称加密(如RSA)或哈希算法(如SHA-256)。具体方法取决于加密时使用的算法和密钥管理方式。

对称加密解密(以AES为例)

对称加密使用相同的密钥进行加密和解密。以下是使用AES解密数据的示例代码:

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

public class AESDecryptor {
    public static String decrypt(String encryptedData, String secretKey) throws Exception {
        byte[] keyBytes = secretKey.getBytes("UTF-8");
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, keySpec);

        byte[] decodedData = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedBytes = cipher.doFinal(decodedData);

        return new String(decryptedBytes, "UTF-8");
    }
}

关键点

  • 密钥(secretKey)必须与加密时使用的相同。
  • 使用Base64解码加密数据(假设加密结果已Base64编码)。
  • 模式(如ECB、CBC)和填充方式(如PKCS5Padding)需与加密时一致。

非对称加密解密(以RSA为例)

非对称加密使用公钥加密、私钥解密。以下是RSA解密的示例:

import javax.crypto.Cipher;
import java.security.PrivateKey;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;

public class RSADecryptor {
    public static String decrypt(String encryptedData, String privateKeyStr) throws Exception {
        byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
        PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        byte[] decodedData = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedBytes = cipher.doFinal(decodedData);

        return new String(decryptedBytes, "UTF-8");
    }
}

注意事项

  • 私钥需以PKCS#8格式提供(Base64编码的PEM文件需去除头尾标记)。
  • RSA对数据长度有限制,通常用于加密对称密钥而非大数据。

哈希验证(如SHA-256)

哈希算法不可逆,但可用于验证数据完整性。示例:

import java.security.MessageDigest;
import java.util.HexFormat;

public class HashValidator {
    public static boolean verifyHash(String data, String expectedHash) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hashBytes = digest.digest(data.getBytes("UTF-8"));
        String actualHash = HexFormat.of().formatHex(hashBytes);

        return actualHash.equals(expectedHash);
    }
}

用途

  • 校验下载文件或密码存储(需加盐)。

其他注意事项

  1. 密钥安全:避免硬编码密钥,使用密钥管理服务(如AWS KMS)。
  2. 算法选择:优先选择AES-GCM( authenticated encryption )而非ECB模式。
  3. 异常处理:捕获NoSuchAlgorithmExceptionInvalidKeyException等异常。

如需更复杂的场景(如混合加密),可结合对称和非对称加密(例如用RSA加密AES密钥)。

java 如何解密

标签: java
分享给朋友:

相关文章

如何删除java

如何删除java

卸载 Java 的步骤 Windows 系统: 打开控制面板,选择“程序和功能”或“卸载程序”,在列表中找到 Java 相关条目(如“Java Runtime Environment”或“Java D…

java如何输入数据

java如何输入数据

输入数据的方法 在Java中,输入数据可以通过多种方式实现,具体取决于输入来源(如控制台、文件、网络等)。以下是几种常见的方法: 使用Scanner类从控制台输入 Scanner类是Java中最常用…

java如何创建数组

java如何创建数组

创建数组的基本方法 在Java中,数组是固定大小的同类型元素集合。创建数组需要声明数组类型并初始化。 声明数组 语法格式为 数据类型[] 数组名 或 数据类型 数组名[]: int[] arr1;…

java如何创建项目

java如何创建项目

使用IDE创建Java项目(以IntelliJ IDEA为例) 打开IntelliJ IDEA,选择“New Project”。 在左侧菜单中选择“Java”,确保已配置JDK(若无需手动添加)。 勾…

java如何创建包

java如何创建包

创建Java包的步骤 在Java中,包(package)用于组织和管理类文件,避免命名冲突。以下是创建Java包的详细方法: 定义包名 在Java源文件的开头使用package关键字声明包名。…

java如何生成随机数

java如何生成随机数

生成随机数的方法 在Java中生成随机数可以通过多种方式实现,以下是几种常见的方法: 使用Math.random()方法 Math.random()方法返回一个double类型的伪随机数,范围在[0…