Зашифрованная информация об игре
Зачем?
Если необходимо передать некую информацию об игре во время игры сторонним сервисам (телеграм ботам, сторонним скриптам и т.п.) - то рекомендуется пользоваться генерацией зашифрованной строки. В этом случае даже технически подкованные игроки не смогут увидеть, какая именно информация передаётся, и подменить её самостоятельно (особенно актуально на Лонг форматах).
Как?
Генерация ключа
В игре надо создать ключ. Для этого в редакторе игры в разделе 'API для внешних сайтов/телеграм ботов' ткнуть кнопку 'Сгенерировать'.
Использование в задании
В заданиях и описании игры можно использовать конструкцию !api:данные!
данные - нужные стороннему серверу - указываются через запятую:
- user_id - id юзера. В данных поле 'u'.
- user_name - Логин юзера. В данных поле 'un'
- team_id - Id команды. В данных поле 'tm'
- team_name - Названия команды. В данных поле 'tmn'
- task_n - Номер уровня. В данных поле 't'
- task_id - Id уровня. В данных поле 'tid'
- game_id - Id игры. В данных поле 'gid'
Пример
Чтобы получить зашифрованную строку в игре: !api:user_id,task_id!
Сгенерирует зашифрованную строку 0394334e96a2f0fa738470e9a9778c684ba214990d200eab
, которую можно расшифровать на вашем сервере в
{'u': 162862, 'tid': 42719}
с помощью ключа игры XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx
.
Расшифровка
Пример расшифровки на PHP:
$data='0394334e96a2f0fa738470e9a9778c684ba214990d200eab'; $key='XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx'; $decoded = json_decode( trim( openssl_decrypt( hex2bin($data), 'BF-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING ) ), true ); // Расшифровуется в {'u': 162862, 'tid': 42719}
Пример расшифровки на Python:
import binascii import json import typing # Чтобы установить blowfish, выполните `pip install blowfish` в cmd import blowfish def decrypt_qeng_data( data: str, key: str, ) -> typing.Dict[str, typing.Union[str, int]]: data = binascii.unhexlify(data) cipher = blowfish.Cipher(key.encode()) data_decrypted = b"".join(cipher.decrypt_ecb(data)) data_decrypted = data_decrypted.rstrip(b'\x00') data_json = json.loads(data_decrypted) return data_json def main(): data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab' key = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx' decrypted = decrypt_qeng_data(data, key) print(decrypted) # Выводит {'u': 162862, 'tid': 42719} return None if __name__ == '__main__': main()
Пример расшифровки на 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 # Usage example # data = '0394334e96a2f0fa738470e9a9778c684ba214990d200eab' key = 'XgHxzCvUSXwPfR7wBvdY4xHC6tSFLewx' qeng_data_decrypt(data, key) # => {:u=>162862, :tid=>42719}