- PVSM.RU - https://www.pvsm.ru -
Недавно я увидел на Хабрахабре пост про Road Rash [1] и мне стало интересно: «А как устроена система паролей в двух других частях?». Своими наблюдениями и результатом я хотел бы поделиться с вами в этой статье.
Пароль состоит из 20 позиций, каждая позиция состоит из 5 битов, итого 20*5= 100 битов. Эти биты сохраняют данные игровые параметры:
Теперь посмотрим из чего состоит сырой пароль:
(U,SN,SN,SN,SN) (U,PC,PC,PC,PC) (U,RF,RF,RF,RF) (U,PD,PD,PD,PD) (U,GV,GV,GV,GV) (H,H,H,H,H) (H,H,H,H,H) (H,H,H,H,H) (H,H,H,H,H) (N,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (U,U,L,L,L) (U,U,B,B,B) (C2,C2,C2,C2,C2) (C3,C3,C3,C3,C3) (C4,C4,C4,C4,C4)
U — неиспользуемые биты.
SN — номер занятого места в Sierra Nevada (0-15) в двоичной системе счисления.
PC — номер занятого места в Pacific Coast (0-15) в двоичной системе счисления.
RF — номер занятого места в Redwood Forest(0-15) в двоичной системе счисления.
PD — номер занятого места в Palm Desert (0-15) в двоичной системе счисления.
GV — номер занятого места в Grass Valey (0-15) в двоичной системе счисления.
H — количество очков (0-10485750) с шагом = 10. Количество очков делится на 10 и полученное число переводится в двоичную систему счисления.
N — бит отрицательных значений.
M — количество денег ((-83886070)-83886070) с шагом = 10.
Для того, чтобы создать положительное количество денег, нужно количество денег разделить на 10 и полученное число перевести в двоичную систему счисления.
Для того, чтобы создать отрицательное количество денег, нужно:
L — номер уровня (1-5) в двоичной системе счисления.
B — номер мотоцикла (0-7) в двоичной системе счисления.
Мотоциклы | Номер |
SHURIKEN 400 | 0 |
PANDA 600 | 1 |
BANZAI 750 | 2 |
KAMIKAZE 750 | 3 |
SHURIKEN 1000 | 4 |
FERRUCI 850 | 5 |
PANDA 750 | 6 |
DIABLO 1000 | 7 |
С1 = (сумма позиций с 1 по 17) mod64 (Полученное число переводится в двоичную систему счисления и зеркально отражается).
С2 = (сумма позиций с 6 по 10) mod32.
C3 = (сумма позиций с 11 по 15) mod32.
C4 = C2 XOR C3.
Символы в позициях могут принимать значения 0-9 и A-V. Биты в позициях кодируются в соответствии с тем, что 0=00000, 1=00001, 2=00010… U=11110, V=11111. То есть, это простое 5 битное кодирование.
5=0101
3=0011
7=0111
9=1001
1=0001
10341950 очков/10=1034195=11111100011111010011
23915840 денег/10=2391584=1001000111111000100000
уровень 5=101
номер мотоцикла 6=110
(00101) (00011) (00111) (01001) (00001) (11111) (10001) (11110) (10011) (0010*) (0100*) (0111*) (1110*) (0010*) (0000*) (00101) (00110) (*****) (*****) (*****)
Теперь переводим значения в двоичную систему счисления (* =0):
(5) (3) (7) (9) (1) (31) (17) (30) (19) (4) (8) (14) (28) (4) (0) (5) (6) (0) (0) (0).
Теперь вычисляем первую контрольную сумму:
C1= (5+3+7+9+1+31+17+30+19+4+8+14+28+4+0+5+6)mod64=191mod64= 63= 111111 (теперь зеркально отражаем контрольную сумму)=111111 (записываем полученное число вместо *).
(00101) (00011) (00111) (01001) (00001) (11111) (10001) (11110) (10011) (00101) (01001) (01111) (11101) (00101) (00001) (00101) (00110) (*****) (*****) (*****)
Теперь вычисляем вторую, третью и четвёртую контрольные суммы (нужно не забывать, что из-за C1, значения некоторых позиций изменились):
C2= (31+17+30+19+5)mod32= 102mod32= 6= 00110.
C3= (9+15+29+5+1)mod32=59mod32= 27= 11011.
C4=
00110
XOR
11011
=
11101=29
Записываем получившийся пароль в десятичной системе счисления:
(5) (3) (7) (9) (1) (31) (17) (30) (19) (5) (9) (15) (29) (5) (1) (5) (6) (6) (27) (29)
Теперь кодируем получившиеся значения:
5,3,7,9,1 V,H,U,J,5
9,F,T,5,1 5,6,6,R,T
2=0010
5=0101
8=1000
11=1011
13=1101
5931870 очков/10=593187=10010000110100100011
83886080-[-53724780]=30161300. 30161300/10=3016130=1011100000010111000010
уровень 2=010
номер мотоцикла 3=011
(10010) (10101) (11000) (11011) (11101) (10010) (00011) (01001) (00011) (1010*) (1110*) (0000*) (0101*) (1100*) (0010*) (11010) (11011) (*****) (*****) (*****)
Теперь переводим значения в двоичную систему счисления (* =0):
(18) (21) (24) (27) (29) (18) (3) (9) (3) (20) (28) (0) (10) (24) (4) (26) (27) (0) (0) (0)
Теперь вычисляем первую контрольную сумму:
C1= (18+21+24+27+29+18+3+9+3+20+28+0+10+24+4+26+7)mod64=291mod64= 35= 100011 (теперь зеркально отражаем контрольную сумму)=110001 (записываем полученное число вместо *).
(10010) (10101) (11000) (11011) (11101) (10010) (00011) (01001) (00011) (10101) (11101) (00000) (01010) (11000) (00101) (11010) (11011) (*****) (*****) (*****)
Теперь вычисляем вторую, третью и четвёртую контрольные суммы (нужно не забывать, что из-за C1, значения некоторых позиций изменились):
C2= (18+3+9+3+21)mod32=54mod32=22=10110
C3= (29+0+10+24+5)mod32=68mod32=4=00100
C4=
10110
XOR
00100
=
10010=18
Записываем получившийся пароль в десятичной системе счисления:
(18) (21) (24) (27) (29) (18) (3) (9) (3) (21) (29) (0) (10) (24) (5) (26) (27) (22) (4) (18)
Теперь кодируем получившиеся значения:
I,L,O,R,T I,3,9,3,L
T,0,A,O,5 Q,R,M,4,I
Пароль состоит из 8 позиций, каждая позиция состоит из 5 битов, итого 8*5=40 битов. Эти биты сохраняют данные игровые параметры:
Теперь посмотрим из чего состоит сырой пароль:
(?,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (M,M,M,M,C1) (U,U,L,L,L) (B,B,B,B,C1) (T,T,T,T,T) (C2,C2,C2,C2,C2)
? — всегда равен нулю.
U — неиспользуемые биты.
M — количество денег (0-327670) с шагом=10. Количество денег делится на 10 и полученное число переводится в двоичную систему счисления.
L — номер уровня (1-5) в двоичной системе счисления.
B — номер мотоцикла (0-15) в двоичной системе счисления.
Мотоциклы | Номер |
SHURIKEN 400 | 0 |
PANDA 500 | 1 |
SHURIKEN TT250 | 2 |
PANDA 900 | 3 |
BANZAI 7.11 | 4 |
BANZAI 600 N | 5 |
BANZAI 750 N | 6 |
SHURIKEN 1000 N | 7 |
BANZAI 7.11 N | 8 |
DIABLO 1000 N | 9 |
PANDA 600 | 10 |
BANZAI 600 | 11 |
BANZAI 750 | 12 |
SHURIKEN 1000 | 13 |
DIABLO 1000 | 14 |
WILD THING | 15 |
T — пройденные трассы (0-5).
Порядок битов от старшего к младшему:
4 — отвечает за прохождение пятой трассы.
3 — отвечает за прохождение четвёртой трассы.
2 — отвечает за прохождение третьей трассы.
1 — отвечает за прохождение второй трассы.
0 — отвечает за прохождение первой трассы.
C1= (сумма позиций с 1 по 6, не считая 5 позицию)mod32 (Полученное число переводится в двоичную систему счисления и зеркально отражается).
C2= ((сумма позиций с 1 по 6)mod32) XOR 7 позиция.
Кодирование значений такой же, как и в первой части.
пройденные трассы = 10101
номер уровня 3 = 011
номер мотоцикла 9 = 1001
193750 денег/10= 19375= 100101110101111
(0100*) (1011*) (1010*) (1111*) (00011) (1001*) (10101) (*****)
Теперь переводим значения в двоичную систему счисления (* =0):
(8) (22) (20) (30) (3) (18) (21) (0)
Теперь вычисляем первую контрольную сумму:
C1= (8+22+20+30+18)mod32= 98mod32= 2= 00010 (теперь зеркально отражаем контрольную сумму)=01000 (записываем полученное число вместо *).
(01000) (10111) (10100) (11110) (00011) (10010) (10101) (*****).
Теперь вычисляем вторую контрольную сумму (нужно не забывать, что из-за C1, значения некоторых позиций изменились):
C2= (8+23+20+30+3+18)mod32= 102mod32= 6mod32= 00110.
00110
XOR
10101
=
10011= 19
Записываем получившийся пароль в десятичной системе счисления:
(8) (23) (20) (30) (3) (18) (21) (19)
Теперь кодируем получившиеся значения:
8,N,K,U 3,I,L,J
Но это ещё не всё!
Я приготовил кое-что ещё…
Немного отвлечёмся от приставки Sega и перейдём на Nes (Денди). Эта игра очень сильно потрепала мои нервы. Кто играл, тот помнит длиннющие вопросы на японском, из-за которых прохождение игры превращается в ад. Пароли в ней простые, да с подковыркой. Чтобы пройти игру на 100% нужно было собрать 4 доспеха. Но есть одна проблема, чтобы их получить, надо было ответить на тонну вопросов. Сколько я ни копался в Интернете и в своей книге кодов, я так и не нашёл пароли, которые сохраняют собранные доспехи. А без них, финальный босс пошлёт вас куда подальше тонной японских иероглифов. Но покопавшись в назначениях битов, я нашёл, что игра сохраняет:
Пароль состоит из 8 позиций, каждая позиция состоит из 2 битов, итого 8*2=16 битов.
Теперь посмотрим из чего состоит сырой пароль:
(C,C) (A,L) (L,L) (L,L) (C,C) (G,G) (A,A) (G,G)
C = (сумма всех позиций, кроме 1 и 5) в двоичной системе счисления. Два старших бита контрольной суммы записываются в 5 позицию, а два младших бита в 1 позицию.
A — количество доспехов (0-4) в двоичной системе счисления.
L — номер уровня (0-20) в двоичной системе счисления.
Уровни | Номер |
1-1 | 0 |
1-2 | 1 |
1-3 | 2 |
2-1 | 3 |
2-2 | 4 |
2-3 | 5 |
3-1 | 6 |
3-2 | 7 |
3-3 | 8 |
4-1 | 9 |
4-2 | 10 |
4-3 | 11 |
5-1 | 12 |
5-2 | 13 |
5-3 | 14 |
6-1 | 15 |
6-2 | 16 |
6-3 | 17 |
7-1 | 18 |
7-2 | 19 |
7-3 | 20 |
G — номер оружия (0-15) в двоичной системе счисления.
Для кодирования используют 4 степени поедания банана, которые мы обозначим цифрами:
= 0 = 1 = 2 = 3
4 = 100
20 = 10100
15 = 1111
(**) (11) (01) (00) (**) (11) (00) (11)
Теперь переводим значения в двоичную систему счисления (* =0):
(0) (3) (1) (0) (0) (3) (0) (3)
Вычисляем контрольную сумму:
C= (3+1+0+3+0+3)= 10= 1010. 10(два старших бита)10(два младших бита).
Записываем получившийся пароль в десятичной системе счисления:
(2) (3) (1) (0) (2) (3) (0) (3)
Осталось перевести цифры в банановый эквивалент.
Вот мы и вышли на финишную прямую.
Что хотелось бы сказать? Ну что ж, надеюсь, эта статья кому-то да пригодится. Удачи, спасибо за прочтение.
Автор: awlvita
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/algoritmy/134308
Ссылки в тексте:
[1] Road Rash: https://habrahabr.ru/post/108728/
[2] Источник: https://habrahabr.ru/post/303338/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.