备忘-国密解密算法

公司的采购的简单云(ezOne.work)的DevOps平台,研究了一下他的前端的登录界面的用户输入密码的加密算法(JavaScript)中,写了一段java进行加密处理的代码,特记录备忘

java 复制代码
package org.example.util;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

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

public class SM4EncriptUtil {
    static {
        // 检查是否已经注册了BouncyCastle提供者,如果没有则注册
        if (Security.getProvider("BC") == null) {
            Security.addProvider(new BouncyCastleProvider());
        }
    }

    private static final String ALGORITHM = "SM4/ECB/NoPadding";

    /**
     * 等效于 JS 的 sm4PasswordEncode(password, key)
     * 使用ECB模式和PKCS7填充
     *
     * @param password 明文密码
     * @param key      16 字节密钥(如 "1234567890abcdef")
     * @return 十六进制编码的密文
     */
    public static String sm4PasswordEncode(String password, String key) {
        try {
            // 先进行PKCS7填充
            byte[] passwordBytes = password.getBytes("UTF-8");
            byte[] paddedBytes = pkcs7Padding(passwordBytes);
            
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "SM4");
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
            byte[] encrypted = cipher.doFinal(paddedBytes);
            
            // 直接返回十六进制字符串,而不是Base64编码
            return bytesToHex(encrypted);
        } catch (Exception e) {
            throw new RuntimeException("SM4 encrypt error", e);
        }
    }
    
    /**
     * PKCS7填充实现
     * @param data 原始数据
     * @return 填充后的数据
     */
    private static byte[] pkcs7Padding(byte[] data) {
        int blockSize = 16; // SM4块大小为16字节
        int paddingSize = blockSize - (data.length % blockSize);
        byte[] paddedData = new byte[data.length + paddingSize];
        System.arraycopy(data, 0, paddedData, 0, data.length);
        
        // 填充paddingSize个字节,每个字节的值都是paddingSize
        for (int i = data.length; i < paddedData.length; i++) {
            paddedData[i] = (byte) paddingSize;
        }
        
        return paddedData;
    }
    
    /**
     * 将字节数组转换为十六进制字符串
     * @param bytes 字节数组
     * @return 十六进制字符串
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}
java 复制代码
package org.example;

import org.example.util.SM4EncriptUtil;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.util.Base64;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;


public class Main {

    public static String encryptPassword(String pwd) throws Exception{
        String key = "ezOne68330710717"; // 16 字节
        String result = SM4EncriptUtil.sm4PasswordEncode(pwd, key);
        System.out.println("Encrypted: " + result);
        return result;
    }

    public static void main(String[] args) throws Exception {
        encryptPassword(encryptPassword("lyz****password"));
    }
}

/**
经过双重加密:
输出如下:
Encrypted: fc59a84c1c2a389b91450638dd6c01fc
Encrypted: 25a22fc4d547bdb4ead99f214ed071c30c679d3f9bf7b3e3c5ef26155b7c647154e1b66d1f9145e6e24c73e598af243f
*/
XML 复制代码
<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
相关推荐
Wang's Blog5 分钟前
Java 项目实战: 外卖平台优化-YApi接口管理平台与文档导入导出
java·开发语言·yapi
专业程序开发源10 分钟前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
jimy112 分钟前
基类没有虚析构函数,基类指针删除派生类对象,行为是未定义的
开发语言·c++
迅猛龙办公室21 分钟前
python获取星期字符串
开发语言·python
vx_Biye_Design26 分钟前
springboot一站式旅游管理平台81037-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·课程设计·express·旅游
写后端的胖头鱼31 分钟前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
嵌入式学习菌35 分钟前
ESP32 ModbusTCP 分片缓存
java·后端·spring
vx_Biye_Design36 分钟前
springboot宠物寄养服务预约与监管系统82684-计算机课程设计、毕业设计
java·vue.js·spring boot·elasticsearch·课程设计·express·宠物
程序员小杰@42 分钟前
Spring Boot 常用注解分类速记
java·spring boot·后端
vx_Biye_Design1 小时前
springboot小学生英语学习APP62773-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·学习·课程设计