.NET加密与MD5哈希代码转Java实现求助
.NET加密与哈希代码的Java转换方案
一、EncryptNVal加密功能转换
原.NET代码逻辑分析
原.NET代码使用Rijndael算法(即AES)加密,核心逻辑:
- 直接将Base64格式的
vVal解码为IV,sharedSecret解码为密钥 - 采用Rijndael默认参数:CBC模式、PKCS7填充,密钥长度由输入Key的字节数决定(常见128/256位)
- 对UTF-8编码的
accountNumber加密后,输出Base64格式密文
你的Java代码问题
错误使用了PBEWithMD5AndDES算法,这是基于密码的加密方案,和原代码直接用固定密钥、IV的逻辑完全不符,导致运行报错。
正确Java实现
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; import java.nio.charset.StandardCharsets; public String encryptNVal(String vVal, String accountNumber, String sharedSecret) throws Exception { byte[] iv = Base64.decodeBase64(vVal); byte[] keyBytes = Base64.decodeBase64(sharedSecret); // 初始化AES密钥和IV参数 SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv); // 对应.NET Rijndael默认配置:CBC模式 + PKCS7填充(Java中PKCS5Padding与PKCS7兼容) Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); byte[] plaintext = accountNumber.getBytes(StandardCharsets.UTF_8); byte[] ciphertext = cipher.doFinal(plaintext); return Base64.encodeBase64String(ciphertext); }
二、哈希功能转换(MD5/SHA256)
原.NET MD5逻辑分析
将输入字符串转为UTF-8字节数组,计算MD5哈希后,把每个字节转为两位小写十六进制字符(不足两位补前导零)。
你的Java代码问题
当哈希字节值小于0x10时,Integer.toHexString仅输出一位字符(比如0x05输出"5"而非"05"),导致结果和.NET不一致。
正确MD5实现
import java.security.MessageDigest; import java.nio.charset.StandardCharsets; public String getMd5Hash(String input) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8); byte[] hashBytes = md.digest(inputBytes); StringBuilder hexBuilder = new StringBuilder(); for (byte b : hashBytes) { // 格式化两位小写十六进制,补前导零 hexBuilder.append(String.format("%02x", b)); } return hexBuilder.toString(); }
SHA256替代实现
若需改用SHA256,仅修改算法名称即可:
import java.security.MessageDigest; import java.nio.charset.StandardCharsets; public String getSha256Hash(String input) throws Exception { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8); byte[] hashBytes = md.digest(inputBytes); StringBuilder hexBuilder = new StringBuilder(); for (byte b : hashBytes) { hexBuilder.append(String.format("%02x", b)); } return hexBuilder.toString(); }
注意事项
- 确保Base64工具类一致:示例用Apache Commons Codec的
Base64,也可改用Java 8+自带的java.util.Base64 - AES密钥长度需符合要求:128/192/256位对应
sharedSecret解码后字节数为16/24/32 - 哈希结果大小写可通过修改格式化字符串调整:小写用
%02x,大写用%02X
内容的提问来源于stack exchange,提问作者JenRobb
相关产品推荐
相关产品推荐

