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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:54:30