アプリケーションにある種の自動サインオンを実装していますが、Java で暗号化されたものを C# で復号化することに気付きました。
基本的に、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# コードの問題を指摘できますか?