我們在應用程序中實現了某種自動登錄,並在C#中解密了一些用java加密的東西。在C#中實現Java解密AES算法
基本上,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 = 「^[email protected]!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 = "^[email protected]!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#代碼中的任何問題嗎?
有在Java代碼中的至少兩個錯誤:1)IV是不16個字節(讓a單獨的隨機字節)和2)密碼文本直接轉換爲字符串,並且不編碼有效字符的UTF-8編碼爲*丟失*。 –
相反Encoding.UTF8.GetBytes的'()'嘗試,'Convert.FromBase64String()'的第一個'Base64.decodeBase64()'反正 –
爲什麼不同的'vParameter'碼,如果密碼和IV是不?你會期望一個不同的純文本,有什麼用處呢? –