Table of Contents

Зашифрована інформація про гру (Task API)

Навіщо це потрібно?

Якщо вам необхідно безпечно передати дані про поточного гравця або команду під час гри стороннім зовнішнім сервісам (наприклад, Telegram-боту, скрипту авторизації або кастомному сайту з флеш-грою), використовуйте генерацію зашифрованого рядка.

У цьому випадку навіть технічно підковані гравці не зможуть побачити, які саме дані передаються в URL або параметрах скрипта, і не зможуть підмінити їх самостійно. Це особливо критично на іграх довгого формату (Long).

Як це налаштувати?

1. Генерація секретного ключа

2. Використання плейсхолдера в завданні

У тексті завдання, підказки або в параметрах посилання на зовнішній сервіс пропишіть конструкцію виду:

!api:поле1,поле2!

Доступні поля для шифрування (вказуються через кому):

Приклад генерації

Якщо ви пропишете в завданні:

!api:user_id,task_id!

Движок згенерує зашифрований hex-рядок виду:

0394334e96a2f0fa738470e9a9778c684ba214990d200eab

Його можна розшифрувати на вашому сервері за допомогою ключа гри та алгоритму Blowfish (ECB). В результаті ви отримаєте JSON:

{"u": 162862, "tid": 42719}

Приклад завдання в грі

Приклади розшифрування на сервері

PHP

$data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab';
$key  = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx';
$decoded = json_decode(
  trim(
    openssl_decrypt(
      hex2bin($data),
      'BF-ECB',
      $key,
      OPENSSL_RAW_DATA | OPENSSL_NO_PADDING
    )
  ),
  true
);
// $decoded => array('u' => 162862, 'tid' => 42719)

Python

*(Потрібна бібліотека blowfish: pip install blowfish)*

import binascii
import json
import typing
import blowfish
 
def decrypt_qeng_data(data: str, key: str) -> typing.Dict[str, typing.Union[str, int]]:
    data_bytes = binascii.unhexlify(data)
    cipher = blowfish.Cipher(key.encode())
    data_decrypted = b"".join(cipher.decrypt_ecb(data_bytes))
    data_decrypted = data_decrypted.rstrip(b'\x00')
    return json.loads(data_decrypted)
 
# Використання
data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab'
key = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx'
print(decrypt_qeng_data(data, key)) # => {'u': 162862, 'tid': 42719}

Ruby

require 'json'
require 'openssl'
 
module Blowfish
  def self.decrypt(data, key)
    crypto = OpenSSL::Cipher::Cipher.new('bf-ecb').send(:decrypt)
    crypto.key_len = key.length
    crypto.key = key
    crypto.padding = 0
    crypto.update([data].pack("H*")) << crypto.final
  end
end
 
def qeng_data_decrypt(data, key)
  decrypted_text = Blowfish.decrypt(data, key)
  JSON.parse(decrypted_text, symbolize_names: true)
end
 
# Використання
data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab'
key = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx'
puts qeng_data_decrypt(data, key) # => {:u=>162862, :tid=>42719}