我们正在我们的应用程序中实现某种自动登录,并在 C# 中解密一些在 java 中加密的东西时感到震惊。
基本上,Java 应用程序会生成某种 URL。当用户点击链接时,我需要验证查询字符串,如果匹配,让用户登录。
有人提供了java代码。我需要将相同的代码转换为 C#,因为我的应用程序是 C#。当我在 C# 中完全实现它时出现错误。
这是java解密代码:
String vParameter= "ksyR31QsRcbeJoysNOsAGBHajLKWsT00wavt9LJYGOMRC8zc_vqrNOeOlGHKJHIt3sLmFhDVw_JZKr4JT0H3Jj7_Di9bKNw99qCzMOKCXYM="; //The string that nees to be decoded.
byte[] encryptedV = Base64.decodeBase64(vParameter);
String salt = “jkjkyt4”; // the i parameter - user’s id
String password = “^hjkh673!v@!a89mz+%5rT”; // application specific
MessageDigest digester = MessageDigest.getInstance("SHA-1");
digester.update((salt + password).getBytes("UTF-8"));
byte[] key = digester.digest();
SecretKeySpec secretKey = new SecretKeySpec(key, 2, 16, “AES”);
String appIV = "SampleIV"// application specific
IvParameterSpec iv= new IvParameterSpec(appIV.getBytes(“UTF-8”));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
byte[] decryptedV = cipher.doFinal(encryptedV, 0, encryptedV.length);
String v = new String(decryptedV, “UTF-8”);
这是对应的C#代码
string vParameter = "ksyR31QsRcbeJoysNOsAGBHajLKWsT00wavt9LJYGOMRC8zc_vqrNOeOlGHKJHIt3sLmFhDVw_JZKr4JT0H3Jj7_Di9bKNw99qCzMOKCXYM="; //v parameter
byte[] encryptedV = Encoding.UTF8.GetBytes(vParameter);
String salt = "jkjkyt4"; // the i parameter - user’s id
String password = "^hjkh673!v@!a89mz+%5rT"; // application specific
var sha1 = SHA1Managed.Create();
byte[] keyBytes = Encoding.UTF8.GetBytes(salt + password); //salt + password
byte[] key = sha1.ComputeHash(keyBytes);
byte[] finalKey = { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8 };
String appIV = "SampleIV";
byte[] iv = Encoding.UTF8.GetBytes(appIV); //iv
Array.Copy(key, 2, finalKey, 0, 16); //key 2, 16
AesManaged tdes = new AesManaged();
tdes.Key = finalKey;
tdes.Mode = CipherMode.CBC;
tdes.Padding = PaddingMode.PKCS7;
tdes.IV = iv;
ICryptoTransform crypt = tdes.CreateDecryptor();
byte[] cipher = crypt.TransformFinalBlock(encryptedV, 0, encryptedV.Length);
string decryptedText = Convert.ToBase64String(cipher);
return decryptedText;
我究竟做错了什么?谁能指出错误?
编辑:我已经更新了 V 参数...注意 - 密钥、密码和 IV 不是真实的。我不得不更改它们,因为我不希望我的公司密钥公开。
编辑 2:嗨,我已经更新了 vParameter.. 现在它们是一样的。Java 代码正在运行......它已在另一个应用程序中实现。现在,我必须为我的 C# 应用程序创建一个类似的版本。你们能指出 C# 代码中的任何问题吗?