You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Node.js的crypto.createDecipher AES-256-ECB解密迁移至Java?

在Java中实现Node.js crypto.createDecipher(AES-256-ECB)的解密逻辑

核心原理:Node.js密钥生成逻辑

Node.js的crypto.createDecipher('aes-256-ecb', password)内部采用OpenSSL的EVP_BytesToKey算法生成密钥,默认参数为:

  • 哈希算法:MD5
  • 迭代次数:1
  • 盐值(salt):空
  • 生成32字节的AES-256密钥(ECB模式无需IV)

Java实现步骤

1. 实现EVP_BytesToKey生成密钥

编写工具方法,根据密码生成符合要求的32字节AES密钥:

import java.security.MessageDigest;
import java.util.Arrays;

public class KeyGeneratorUtil {
    public static byte[] generateAes256Key(String password) throws Exception {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        byte[] passwordBytes = password.getBytes("UTF-8");
        byte[] key = md5.digest(passwordBytes);
        
        // AES-256需要32字节,若首次MD5生成的16字节不足,循环用前一次哈希值+密码再哈希
        while (key.length < 32) {
            byte[] temp = new byte[key.length + passwordBytes.length];
            System.arraycopy(key, 0, temp, 0, key.length);
            System.arraycopy(passwordBytes, 0, temp, key.length, passwordBytes.length);
            key = md5.digest(temp);
        }
        
        // 截取前32字节作为AES-256密钥
        return Arrays.copyOf(key, 32);
    }
}

2. AES-256-ECB解密实现

ECB模式无需IV,填充方式使用PKCS5Padding(与Node.js的PKCS#7填充兼容):

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

public class AesDecryptor {
    public static String decryptAes256Ecb(String encryptedBase64, String password) throws Exception {
        // 生成密钥
        byte[] keyBytes = KeyGeneratorUtil.generateAes256Key(password);
        SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES");
        
        // 初始化Cipher:AES/ECB/PKCS5填充
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        
        // 解密流程:Base64解码加密文本 → 执行解密
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedBase64);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        
        return new String(decryptedBytes, "UTF-8");
    }
    
    // 测试示例
    public static void main(String[] args) throws Exception {
        // 替换为实际的加密文本和密码
        String encryptedText = "你的Base64编码加密文本";
        String password = "你的解密密码";
        
        String decrypted = decryptAes256Ecb(encryptedText, password);
        System.out.println("解密结果:" + decrypted);
    }
}

注意事项

  • 编码一致性:确保Node.js与Java中密码、明文的编码均为UTF-8(代码已指定)。
  • Base64处理:Node.js的crypto.createDecipher处理的加密文本通常为Base64编码,Java需先解码再解密。
  • ECB模式风险:ECB模式安全性较低(相同明文块会生成相同密文块),生产环境建议切换至CBC/GCM等带IV的加密模式。

内容的提问来源于stack exchange,提问作者Priya Baweja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:27:19