Эта" статья" рассчитана на тех, кто уже умеет передавать данные в открытом виде из одной сессии в другую и хочет их закодировать, не знаю чем там кодировали джассеры в 2005, но сейчас я предлагаю это делать вот так вот:
b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
-- encoding
function enc(data)
return ((data:gsub('.', function(x)
local r, b = '', x:byte()
for i = 8, 1, -1 do
r = r .. (b % 2 ^ i - b % 2 ^ (i - 1) > 0 and '1' or '0')
end
return r;
end) .. '0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
if (#x < 6) then
return ''
end
local c = 0
for i = 1, 6 do
c = c + (x:sub(i, i) == '1' and 2 ^ (6 - i) or 0)
end
return b:sub(c + 1, c + 1)
end) .. ({ '', '==', '=' })[#data % 3 + 1])
end
-- decoding
function dec(data)
data = string.gsub(data, '[^' .. b .. '=]', '')
return (data:gsub('.', function(x)
if (x == '=') then
return ''
end
local r, f = '', (b:find(x) - 1)
for i = 6, 1, -1 do
r = r .. (f % 2 ^ i - f % 2 ^ (i - 1) > 0 and '1' or '0')
end
return r;
end) :gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
if (#x ~= 8) then
return ''
end
local c = 0
for i = 1, 8 do
c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)
end
return string.char(c)
end))
end
Это я просто загугнил с интернете Base64+ lua, ближе к сути, весь наш код может представлять из себя набор произвольных данных перечисленных через запятую или другой разделитель, и например выглядеть вот так:
"12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0"
Где:
12341234 - id героя
0 - число квестов
40 - число спасённых
26648 - количество опыта
10000000 - золото
111 - ид предмета в слоте 1
222 - ид предмета в слоте 2
333 - ид предмета в слоте 3
И так далее, и нам надо это всё закодировать, чтобы "умный" игрок не нарисовал сам себе золота и не выдал предметы
Таким образом, применив кодирование и выполнив вот такой код
12341234 - id героя
0 - число квестов
40 - число спасённых
26648 - количество опыта
10000000 - золото
111 - ид предмета в слоте 1
222 - ид предмета в слоте 2
333 - ид предмета в слоте 3
И так далее, и нам надо это всё закодировать, чтобы "умный" игрок не нарисовал сам себе золота и не выдал предметы
Таким образом, применив кодирование и выполнив вот такой код
print(enc("12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0"))
Мы увидим вот такой результат
MTIzNDEyMzQsMCw0MCwyNjY0OCwxMDAwMDAwMCwxMTEsMjIyLDMzMywxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsMCww
Можно ещё разделителей наставить, но это уже для удобства
Делаем декодирование, чтобы проверить, что функция действительно рабочая. Как видите всё ок
Делаем декодирование, чтобы проверить, что функция действительно рабочая. Как видите всё ок
Вот вам ссылка на сервис и сам код, чтобы поиграть и проверить как тут всё работает
код
b = ""..'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
-- encoding
function enc(data)
return ((data:gsub('.', function(x)
local r, b = '', x:byte()
for i = 8, 1, -1 do
r = r .. (b % 2 ^ i - b % 2 ^ (i - 1) > 0 and '1' or '0')
end
return r;
end) .. '0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
if (#x < 6) then
return ''
end
local c = 0
for i = 1, 6 do
c = c + (x:sub(i, i) == '1' and 2 ^ (6 - i) or 0)
end
return b:sub(c + 1, c + 1)
end) .. ({ '', '==', '=' })[#data % 3 + 1])
end
-- decoding
function dec(data)
data = string.gsub(data, '[^' .. b .. '=]', '')
return (data:gsub('.', function(x)
if (x == '=') then
return ''
end
local r, f = '', (b:find(x) - 1)
for i = 6, 1, -1 do
r = r .. (f % 2 ^ i - f % 2 ^ (i - 1) > 0 and '1' or '0')
end
return r;
end) :gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
if (#x ~= 8) then
return ''
end
local c = 0
for i = 1, 8 do
c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)
end
return string.char(c)
end))
end
print(enc("12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0"))
print(dec("MTIzNDEyMzQsMCw0MCwyNjY0OCwxMDAwMDAwMCwxMTEsMjIyLDMzMywxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsMCww"))
Но это всё полная ерунда, потому что декодирование слишком простое и + оно будет одинаковым для других игроков, добавим в алфавит заранее придуманное секретное слово или ник игрока
Чтобы у нас получилось примерно вот так:
Чтобы у нас получилось примерно вот так:
b = "123"..'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
ну и ещё раз выполним, как видите данные те же, а конечный код другой
JQFwKABvJwNpJ3txJ3tvKgVxL3tuJA1tJA1tJ3tuJQBpJgFvIAJwJvtuIABpJPtuIABpJ3ttIA1pJ3ttIA1pJPtuIA1pJ3ttIABpJ3tt
Ну и проверяем, что в обратную сторону ничего не сломалось
print(enc("12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0"))
print(dec("JQFwKABvJwNpJ3txJ3tvKgVxL3tuJA1tJA1tJ3tuJQBpJgFvIAJwJvtuIABpJPtuIABpJ3ttIA1pJ3ttIA1pJPtuIA1pJ3ttIABpJ3tt"))
Результат:
JQFwKABvJwNpJ3txJ3tvKgVxL3tuJA1tJA1tJ3tuJQBpJgFvIAJwJvtuIABpJPtuIABpJ3ttIA1pJ3ttIA1pJPtuIA1pJ3ttIABpJ3tt
12341234,0,40,26648,10000000,111,222,333,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,1,0,0
Можно запутывать вообще иначе, но я как бы не копал в эту область, так же стоит не забыть сделать проверку, на то что ваш сейв код не сломан.
В любом случае, продвинутый мамкин хацкер всегда сможет зареверсить вашу карту, и наболтать себе статов и или стать лидером в любой таблице. Но среднестатистический игрок не будет заморачиваться, так что возможно хватит и простого Base64
В любом случае, продвинутый мамкин хацкер всегда сможет зареверсить вашу карту, и наболтать себе статов и или стать лидером в любой таблице. Но среднестатистический игрок не будет заморачиваться, так что возможно хватит и простого Base64
Ред. ScorpioT1000