0

アプリケーションにある種の自動サインオンを実装していますが、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# コードの問題を指摘できますか?

4

1 に答える 1

3

UTF8 エンコード/デコードと base64 エンコード/デコードを混同しています。また、暗号文と IV の長さが間違っているため、投稿されたコードは機能しません。それは、実際のデータを公開しないように変更したからだと思います。

とにかく、同じ結果を返す Java スニペットと C# スニペットを次に示します。

Java (私は vParameter と appIV を動作するものに変更しただけです):

String vParameter= "Lq4aURUiyvKvEZBWMWpUr2wRSMu96E+J1UeHLTOhKEM=";  //The string that needs to be decoded.
byte[] encryptedV = Base64.decodeBase64(vParameter.getBytes("ASCII"));
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 = "SampleIV12345678";// 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");
System.out.println(v); // foobarfoobarfoobarfoobarfoobar

C# (Base64 を使用して vParameter をデコードし、復号化されたデータを UTF-8 としてデコードします。また、AES オブジェクトの名前を tdes ではなく aes に変更します。):

string vParameter = "Lq4aURUiyvKvEZBWMWpUr2wRSMu96E+J1UeHLTOhKEM="; //v parameter
byte[] encryptedV = Convert.FromBase64String(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 = "SampleIV12345678";
byte[] iv = Encoding.UTF8.GetBytes(appIV); //iv
Array.Copy(key, 2, finalKey, 0, 16); //key 2, 16
AesManaged aes = new AesManaged();
aes.Key = finalKey;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.IV = iv;
ICryptoTransform crypt = aes.CreateDecryptor();
byte[] cipher = crypt.TransformFinalBlock(encryptedV, 0, encryptedV.Length);
string decryptedText = Encoding.UTF8.GetString(cipher);
Console.WriteLine(decryptedText); // foobarfoobarfoobarfoobarfoobar
于 2012-12-18T12:44:13.653 に答える