如何将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
相关产品推荐
相关产品推荐

