Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Просьба помочь c функцией декомпилированного .apk


Автор: Winsock 10.12.2015, 14:09
Здравствуйте, уважаемые форумчане!
Модератор, если разместил тему не в нужном разделе - заранее прошу прощения и прошу переместить куда следует.

Только вникаю в тему программирования на java.

Стоит задача имитировать https запросы приложения Android.

Столкнулся с функцией кодирования строк (насколько я понял):

Код

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Base64;
import android.util.Log;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.UUID;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.json.JSONException;
import org.json.JSONObject;

private String base64encryptedConfirmationHash(long time, String tag) {
        String sSecret = this.mInfo.optString("identity_secret");
        if (sSecret == null) {
            return "";
        }
        byte[] secretBytes = Base64.decode(sSecret.getBytes(), 0);
        int dataLen = 8;
        if (tag != null) {
            if (tag.length() > 32) {
                dataLen = 8 + 32;
            } else {
                dataLen = 8 + tag.length();
            }
        }
        byte[] dataBytes = new byte[dataLen];
        int i = 8;
        while (true) {
            int i2 = i - 1;
            if (i <= 0) {
                break;
            }
            dataBytes[i2] = (byte) ((int) time);
            time >>>= 8;
            i = i2;
        }
        if (tag != null) {
            System.arraycopy(tag.getBytes(), 0, dataBytes, 8, dataLen - 8);
        }
        SecretKeySpec signKey = new SecretKeySpec(secretBytes, "HmacSHA1");
        try {
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signKey);
            return percentEncodeUrlUnsafeChars(Base64.encodeToString(mac.doFinal(dataBytes), 2));
        } catch (NoSuchAlgorithmException e) {
            return null;
        } catch (InvalidKeyException e2) {
            return null;
        }
    }

    public String getTaggedConfirmationUrlParams(String tag) {
        if (base64encryptedConfirmationHash(TimeCorrector.getInstance().currentTimeSeconds(), tag) == null) {
            return "";
        }
        return String.format("p=%s&a=%s&k=%s&t=%d&m=android&tag=%s", new Object[]{getUniqueIdForPhone(), getId(), base64encryptedConfirmationHash(TimeCorrector.getInstance().currentTimeSeconds(), tag), Long.valueOf(TimeCorrector.getInstance().currentTimeSeconds()), tag});
    }


Входящими параметрами функции являются unix время и tag, который мне пока не известен.

Результатом функции является : LYBIvTb2vdxjsMZvTD%2bpcxPN6%2f8%3d (url decode: LYBIvTb2vdxjsMZvTD+pcxPN6/8=)

В итоге запрос имеет вид:
?op=allow&p=android:af740075-ecf8-485c-bffd-d4c1343203db&a=76261198246295941&k=LYBIvTb2vdxjsMZvTD%2bpcxPN6%2f8%3d&t=1449703601&m=android&tag=allow&cid=8984774&ck=980894818334077389



В подобных запросах меняются следующие параметры: cid=8984774&ck=980894818334077389

Просьба помочь в понимании процесса кодирования и расшифровки ключа для возможности имитировать запрос.

Автор: Winsock 11.12.2015, 16:03
Мдаа...

Неужели  настолько сложная функция, что никто не в состоянии помочь?

На сколько я вижу - это должно быть элементарно для носителя языка.

Ну что же, что поделать, буду на других форумах спрашивать, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)