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

