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

C#与Java DES加密结果不一致问题排查求助

DES加密Java转C#后复杂用例结果不一致排查

将Java的DES密码加密代码转换为C#版本后,简单测试用例(如密码000000、密钥18823214892)结果一致,但复杂用例(如密码crmeb.com、密钥demo)结果不同:Java输出7iIl3H5zCinwrYbrxAR7cQ==,C#输出7iIl3H5zCikSuWVlZa1dyA==。怀疑是des.IV初始化方式或加密类选择有误,请求协助排查问题。

原Java代码

public static String encryptPassword(String pwd, String key) {
    try {
        Security.addProvider(new com.sun.crypto.provider.SunJCE());
        Key secretKey = getDesSecretKey(key);
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] data = pwd.getBytes(StandardCharsets.UTF_8);
        byte[] result = cipher.doFinal(data);
        return new sun.misc.BASE64Encoder().encode(result);
    } catch (Exception e) {
        return null;
    }
}

public static SecretKey getDesSecretKey(String key) {
    byte[] result = new byte[8];
    byte[] keys;
    keys = key.getBytes(StandardCharsets.UTF_8);
    for (int i = 0; i < 8; i++) {
        if (i < keys.length) {
            result[i] = keys[i];
        } else {
            result[i] = 0x01;
        }
    }
    return new SecretKeySpec(result, "DES");
}

转换后的C#代码

public static string EncryptPassword(string password, string key)
{
    const int keyLength = 8;
    var bytes = new byte[keyLength];
    var keyBytes = Encoding.UTF8.GetBytes(key);
    for (int i = 0; i < keyLength; i++)
    {
        if (i < keyBytes.Length)
            bytes[i] = keyBytes[i];
        else
            bytes[i] = 0x01;
    }

#pragma warning disable S5547
    using var des = DES.Create();
#pragma warning restore S5547
    des.Key = bytes;
    des.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };
#pragma warning disable S3329
    var encryptor = des.CreateEncryptor(des.Key, des.IV);
#pragma warning restore S3329
    var passwordBytes = Encoding.UTF8.GetBytes(password);
    var payload = encryptor.TransformFinalBlock(passwordBytes, 0, passwordBytes.Length);
    
    return Convert.ToBase64String(payload);
}

测试代码

var encryptedPassword = CryptoUtils.EncryptPassword("000000", "18823214892");
encryptedPassword.Should().Be("PwePP4OrK2o=");

encryptedPassword = CryptoUtils.EncryptPassword("123456", "admin");
encryptedPassword.Should().Be("L8qdg72wbeQ=");

encryptedPassword = CryptoUtils.EncryptPassword("000000", "18292417675");
encryptedPassword.Should().Be("w9LTrURn7xU=");

encryptedPassword = CryptoUtils.EncryptPassword("crmeb.com", "demo");
encryptedPassword.Should().Be("7iIl3H5zCinwrYbrxAR7cQ==");

其中最后一个测试用例未通过,参考微软文档进行代码转换仍未解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:10:08