【数据安全】Java国标加密解密

Java国标加密解密

固定或配置秘钥的方式


在Java中实现一个符合国密标准(GM/T)的数据敏感信息加密方案,通常需要考虑使用国家密码管理局认可的加密算法和密钥管理机制。以下是一个简化的加密解密方案示例,使用SM4分组密码算法进行数据加密,并提供动态和固定密钥两种解密方式。

文章目录


1、准备环境

首先,你需要一个支持国密算法的Java密码库,比如Bouncy Castle。如果你还没有安装,可以通过Maven添加依赖:

java 复制代码
<dependency>  
    <groupId>org.bouncycastle</groupId>  
    <artifactId>bcprov-jdk15on</artifactId>  
    <version>你的版本号</version>  
</dependency>

2、加密与解密实现

java 复制代码
import org.bouncycastle.jce.provider.BouncyCastleProvider;  
import javax.crypto.Cipher;  
import javax.crypto.KeyGenerator;  
import javax.crypto.SecretKey;  
import javax.crypto.spec.IvParameterSpec;  
import javax.crypto.spec.SecretKeySpec;  
import java.nio.charset.StandardCharsets;  
import java.security.Security;  
  
public class SM4Encryption {  
    static {  
        Security.addProvider(new BouncyCastleProvider());  
    }  
  
    public static byte[] encrypt(String plainText, SecretKey secretKey, IvParameterSpec ivParameterSpec) throws Exception {  
        Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS5Padding", "BC");  
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);  
        return cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));  
    }  
  
    public static String decrypt(byte[] cipherText, SecretKey secretKey, IvParameterSpec ivParameterSpec) throws Exception {  
        Cipher cipher = Cipher.getInstance("SM4/CBC/PKCS5Padding", "BC");  
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);  
        byte[] decrypted = cipher.doFinal(cipherText);  
        return new String(decrypted, StandardCharsets.UTF_8);  
    }  
  
    public static SecretKey generateSecretKey() throws Exception {  
        KeyGenerator keyGenerator = KeyGenerator.getInstance("SM4", "BC");  
        keyGenerator.init(128); // SM4的密钥长度固定为128位  
        return keyGenerator.generateKey();  
    }  
  
    public static IvParameterSpec generateIv() {  
        // 初始化向量IV通常与分组大小相同,SM4的分组大小为128位(16字节)  
        byte[] iv = new byte[16];  
        // 这里简单使用随机数填充IV,实际应用中需要根据安全要求来设置IV  
        // 注意:解密时需要使用相同的IV  
        // ...  
        return new IvParameterSpec(iv);  
    }  
  
    public static void main(String[] args) throws Exception {  
        // 生成密钥和初始化向量  
        SecretKey secretKey = generateSecretKey();  
        IvParameterSpec ivParameterSpec = generateIv();  
  
        // 加密  
        String originalText = "这是一段需要加密的敏感信息";  
        byte[] encryptedText = encrypt(originalText, secretKey, ivParameterSpec);  
        System.out.println("加密后的数据: " + new String(encryptedText, StandardCharsets.UTF_8));  
  
        // 解密  
        String decryptedText = decrypt(encryptedText, secretKey, ivParameterSpec);  
        System.out.println("解密后的数据: " + decryptedText);  
    }  
}

相关推荐
老马识途2.01 小时前
关于跨域问题的总结
java·前端
都叫我大帅哥1 小时前
Java日期时间三十年战争:从Date考古到LocalDateTime革命,以及数据库与前端的那点事儿
java
Muscleheng2 小时前
SpringBoot 集成 DeepSeek 实现 RAG 文档问答
java·spring boot·ai·springai
2501_936415692 小时前
可变参数&综合练习&斗地主游戏
java·windows·游戏
极客先躯3 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
xqqxqxxq4 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
wang09074 小时前
自己动手写一个spring之aop_1
java·后端·spring
国科安芯5 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
deng12045 小时前
【Thread类的用法(1)-- Thread类的基本用法】
java·java-ee
suconnect5 小时前
Spring Boot接入企业RAG:文档切分、向量检索、权限过滤和答案溯源
java·spring boot·后端