в общем с Apeckou уже 2 день мучаемся. снифнули приложение андроида.но не понятно как шлются данные вот вылажую то что имеется, кто возможно знает, или давайте думать вместе потренеруем логику в етих даных идет , имя\ДР\мыло\ПАс\пароль , нужно только понять как генерировать етот код. и что вообще внутри вроде base64 но при декоде мусор вот еще 1 запрос запросы разные. как видно в начале кусок кода повторяется всегда W6blXWXOgI5XeLens2ful дальше декомпелил приложуху. стал рытся в коде. но не понял подчти нечего. что нашел ето пробовал побайтово декодить ето бас64 , но работает не полностью после 8 байта нужно брать не следующие 2 , а те 2 только либо первый и последний с пребедущего или 2 и 1 со следующего. правда получилось всего 50% но и там мусор ето не то что шлется. вот еще нашел в коде. Вот еще тут уже всплывает AES и как я понял ключ к нему Вот еше тоже ключи какието Code: .field public static final AES_ALGORYTHM:Ljava/lang/String; = "AES" field public static final AES_ALGORYTHM_SPEC:Ljava/lang/String; = "AES/ECB/ZeroBytePadding" .field public static final AES_CRYPT_KEY:Ljava/lang/String; = "Ua3!shYk#hMCxoEn" .field public static final BALANCE_PRODUCT_LIST_ID:I = 0x4b5 .field public static final BILLING_PUB_KEY:Ljava/lang/String; = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsdetyN99gwSb4WSd5HXrgMYLG6sCSCkABbR6u+yaioYyywYTR4SA4srxAUAO2jo8oOsRMw3/O4502BPF+q+DbRL2wUtYYSiyJQJ0BWWVrLKVECNVHL/cbH5MViM8gzEtLciNnlR6KW2PhlTqTKh88eYaI8gRxHiyta5dKOIoryS4dO3vJDyY+Q8o3f9EAfBiiDEFqM56sI6ctKwzKWEdlYhCjCQ48hAVRj6xcKMzXoXr8J9DE6R6e4F7PGD7rLD9RPkCM5j0L4hygy+D4tLUyNEkp6FpJK/S4Ifg2IcSrnWL+6aGRBo4vgnAMDwjDL74k6z6onVrqKUFLljzZWuzpwIDAQAB" .field public static final FLURRY_CODE:Ljava/lang/String; = "H5TVBXYXPDJG4RM39M54" .field public static final MD5_SALT:Ljava/lang/String; = "8Ub_!dI32mD-fd1$" .field public static final PUSHLINK_CODE:Ljava/lang/String; = "b6ra3ri2lsrge838" .field public static final TAPJOY_APP_ID:Ljava/lang/String; = "72383039-ac60-4cf8-b6c2-0c3d1dea8ae2" .field public static final TAPJOY_SECRET_KEY:Ljava/lang/String; = "LTvITTEEn1vfOoB88UX1" .field public static final VIP_PRODUCT_LIST_ID:I = 0x3e9
методом телепатической связи было установлено, что юзается алгоритм AES Но пока непонятно, либо AES/CBC/PKCS5Padding либо AES/ECB/ZeroBytePadding кто может расшифровать плз отпишитесь! ключ Ua3!shYk#hMCxoEn jYv0x3URkZvx8Xrx7E13APxQbDLyXJursEQzfWMMUEzbhbrgDRdmxaQHoQudHJFx1UdWDmcXUxggtpXn04QceUcKZufkX7ZlEOyGXwMtVpEoozqe2LoXaGVj4UtjdBh6mbeg3%2BaLAAbBAFrvB7tnCiwQ%2BIB9O4uULS0trIJ%2BFKs%3D у меня кракозябры получаются
Инициализирующий вектор ещё нужен, тогда можно расшифровать. Если в начале кусок одинаковый, то скорее всего после AES строка никак не изменяется.
где вектор взять? как он выглядит примерно? верно там в начале идет код W6blXWXOgI5XeLens2ful он повторяется дальше другой. и еще было найдено Code: "net.robotmedia.billing.utils.AESObfuscator-1|" и еще смущает джаву я не знаю. но догадываюсь что ето не обычный бас64. или я ошибаюсь?
Что-то я запутался. Расшифровывается очень легко, для ECB не нужен вектор. Это обычный base64. Что тут мучится то Недавно в своем проекте использовал подобную технологию, правда там шифр получше, ключ бинарный, и данные шифруются 2 раза, используя перевернутую строку первого результата + код с ключами недоступен и ещё одна функция пытается запутать взломщика. PHP: $a = new AES_Encryption('Ua3!shYk#hMCxoEn'); echo $a->decrypt(base64_decode('W6blXWXOgI5XeLens2fulIJynxKBxo8oTD+XH6xHN9oDlLzHU2pvdjsL1DW5GCDI6qu+AvAOvrTVMajjKMXq/gOS26MB2jF58j2cEPBkqkncZsG5gE4K5nNBRYr0rZBlWJlZ/Dw1vDADkCdAaSCjSO9dP1Gy/zKhaS2BUUs3xLQ=')); class AES_Encryption { private $key, $initVector, $mode, $cipher, $encryption = null; private $allowed_bits = array(128, 192, 256); private $allowed_modes = array('ecb', 'cfb', 'cbc', 'nofb', 'ofb'); private $vector_modes = array('cbc','cfb','ofb'); private $allowed_paddings = array( 'ANSI_X.923' => 'ANSI_X923', 'ISO_10126' => 'ISO_10126', 'PKCS7' => 'PKCS7', 'BIT' => 'BIT', 'ZERO' => 'ZERO', ); private $padCrypt_url = 'http://dev.strategystar.net/2011/10/php-cryptography-padding-ansi-x-923-iso-10126-pkcs7-bit-zero/'; private $aesEncrypt_url = 'http://dev.strategystar.net/'; /*** * String $key = Your secret key that you will use to encrypt/decrypt * String $initVector = Your secret vector that you will use to encrypt/decrypt if using CBC, CFB, OFB, or a STREAM algorhitm that requires an IV * String $padding = The padding method you want to use. The default is ZERO (aka NULL byte) [ANSI_X.923,ISO_10126,PKCS7,BIT,ZERO] * String $mode = The encryption mode you want to use. The default is cbc [ecb,cfb,cbc,stream,nofb,ofb] **/ public function __construct($key, $initVector='', $padding='ZERO', $mode='ecb') { $mode = strtolower($mode); $padding = strtoupper($padding); if(!class_exists('padCrypt')) { throw new Exception('The padCrypt class must be loaded for AES_Encryption to work: '.$padCrypt_url); } if(!function_exists('mcrypt_module_open')) { throw new Exception('The mcrypt extension must be loaded.'); } if(strlen($initVector) != 16 && in_array($mode, $this->vector_modes)) { throw new Exception('The $initVector is supposed to be 16 bytes in for CBC, CFB, NOFB, and OFB modes.'); } elseif(!in_array($mode, $this->vector_modes) && !empty($initVector)) { throw new Exception('The specified encryption mode does not use an initialization vector. You should pass an empty string, zero, FALSE, or NULL.'); } $this->encryption = strlen($key)*8; if(!in_array($this->encryption, $this->allowed_bits)) { throw new Exception('The $key must be either 16, 24, or 32 bytes in length for 128, 192, and 256 bit encryption respectively.'); } $this->key = $key; $this->initVector = $initVector; if(!in_array($mode, $this->allowed_modes)) { throw new Exception('The $mode must be one of the following: '.implode(', ', $this->allowed_modes)); } if(!array_key_exists($padding, $this->allowed_paddings)) { throw new Exception('The $padding must be one of the following: '.implode(', ', $this->allowed_paddings)); } $this->mode = $mode; $this->padding = $padding; $this->cipher = mcrypt_module_open('rijndael-128', '', $this->mode, ''); $this->block_size = mcrypt_get_block_size('rijndael-128', $this->mode); } /*** * String $text = The text that you want to encrypt **/ public function encrypt($text) { mcrypt_generic_init($this->cipher, $this->key, $this->initVector); $encrypted_text = mcrypt_generic($this->cipher, $this->pad($text, $this->block_size)); mcrypt_generic_deinit($this->cipher); return $encrypted_text; } /*** * String $text = The text that you want to decrypt **/ public function decrypt($text) { mcrypt_generic_init($this->cipher, $this->key, $this->initVector); $decrypted_text = mdecrypt_generic($this->cipher, $text); mcrypt_generic_deinit($this->cipher); return $this->unpad($decrypted_text); } /*** * Use this function to export the key, init_vector, padding, and mode * This information is necessary to later decrypt an encrypted message **/ public function getConfiguration() { return array( 'key' => $this->key, 'init_vector' => $this->initVector, 'padding' => $this->padding, 'mode' => $this->mode, 'encryption' => $this->encryption . ' Bit', 'block_size' => $this->block_size, ); } private function pad($text, $block_size) { return call_user_func_array(array('padCrypt', 'pad_'.$this->allowed_paddings[$this->padding]), array($text, $block_size)); } private function unpad($text) { return call_user_func_array(array('padCrypt', 'unpad_'.$this->allowed_paddings[$this->padding]), array($text)); } public function __destruct() { mcrypt_module_close($this->cipher); } } class padCrypt { public static function pad_ISO_10126($data, $block_size) { $padding = $block_size - (strlen($data) % $block_size); for($x=1; $x<$padding; $x++) { mt_srand(); $data .= chr(mt_rand(0,255)); } return $data . chr($padding); } public static function unpad_ISO_10126($data) { $length = ord(substr($data, -1)); return substr($data, 0, strlen($data)-$length); } public static function pad_ANSI_X923($data, $block_size) { $padding = $block_size - (strlen($data) % $block_size); return $data . str_repeat(chr(0), $padding - 1) . chr($padding); } public static function unpad_ANSI_X923($data) { $length = ord(substr($data, -1)); $padding_position = strlen($data) - $length; $padding = substr($data, $padding_position, -1); for($x=0; $x<$length; $x++) { if(ord(substr($padding, $x, 1)) != 0) { return $data; } } return substr($data, 0, $padding_position); } public static function pad_PKCS7($data, $block_size) { $padding = $block_size - (strlen($data) % $block_size); $pattern = chr($padding); return $data . str_repeat($pattern, $padding); } public static function unpad_PKCS7($data) { $pattern = substr($data, -1); $length = ord($pattern); $padding = str_repeat($pattern, $length); $pattern_pos = strlen($data) - $length; if(substr($data, $pattern_pos) == $padding) { return substr($data, 0, $pattern_pos); } return $data; } public static function pad_BIT($data, $block_size) { $length = $block_size - (strlen($data) % $block_size) - 1; return $data . "\x80" . str_repeat("\x00", $length); } public static function unpad_BIT($data) { if(substr(rtrim($data, "\x00"), -1) == "\x80") { return substr(rtrim($data, "\x00"), 0, -1); } return $data; } public static function pad_ZERO($data, $block_size) { $length = $block_size - (strlen($data) % $block_size); return $data . str_repeat("\x00", $length); } public static function unpad_ZERO($data) { return rtrim($data, "\x00"); } } На выходе получаем: PHP: a=register&l=lolnaponobggm%40mail.ru&n=lol&g=m&bd=30&bm=10&by=2006&dt=1&d=d4dd7a5f-b2f3-363b-938a-0cf2791e1cb0&p=lol123