[Из песочницы] Генерирование паролей к играм Road Rash 1 и 2
Добрый день, уважаемые пользователи.
Недавно я увидел на Хабрахабре пост про Road Rash и мне стало интересно: «А как устроена система паролей в двух других частях?». Своими наблюдениями и результатом я хотел бы поделиться с вами в этой статье.
Первый Road Rash
Теория
Пароль состоит из 20 позиций, каждая позиция состоит из 5 битов, итого 20×5= 100 битов. Эти биты сохраняют данные игровые параметры:
- номер занятого места (0–15) на пяти разных трассах (0 означает, что на этой трассе ты ещё не ездил).
- количество очков (0–10485750)
- количество денег ((-83886070)-83886070)
- текущий уровень (1–5)
- мотоцикл (1–8)
Теперь посмотрим из чего состоит сырой пароль:
(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 и полученное число перевести в двоичную систему счисления.
Для того, чтобы создать отрицательное количество денег, нужно:
- Активировать бит отрицательных значений.
- Из числа 83886080 вычесть количество денег (по модулю), полученный остаток разделить на 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 битное кодирование.
- SN=5 место, PC=3 место, RF=7 место, PD=9 место, GV=1 место
- количество очков (10341950)
- количество денег (23915840)
- текущий уровень (5)
- мотоцикл (6)
- все неиспользуемые биты равны нулю
Переводим значения в двоичную систему счисления:
5=0101
3=0011
7=0111
9=1001
1=0001
10341950 очков/10=1034195=11111100011111010011
23915840 денег/10=2391584=1001000111111000100000
уровень 5=101
номер мотоцикла 6=110Записываем сырой пароль и вычисляем 4 контрольные суммы:
(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
- SN=2 место, PC=5 место, RF=8 место, PD=11 место, GV=13 место
- количество очков (5931870)
- количество денег (-53724780)
- текущий уровень (2)
- мотоцикл (3)
- все неиспользуемые биты равны единице
Переводим значения в двоичную систему счисления:
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Записываем сырой пароль и вычисляем 4 контрольные суммы:
(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
Второй Road Rash
Теория
Пароль состоит из 8 позиций, каждая позиция состоит из 5 битов, итого 8×5=40 битов. Эти биты сохраняют данные игровые параметры:
- пройденные трассы на данном уровне (0–5)
- количество денег (0–327670)
- текущий уровень (1–5)
- мотоцикл (1–16)
Теперь посмотрим из чего состоит сырой пароль:
(?, 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 позиция.Кодирование
Кодирование значений такой же, как и в первой части.
- пройдены пятая, третья и первая трассы
- количество денег (193750)
- текущий уровень (3)
- мотоцикл (9)
- все неиспользуемые биты равны нулю
Переводим значения в двоичную систему счисления:
пройденные трассы = 10101
номер уровня 3 = 011
номер мотоцикла 9 = 1001
193750 денег/10= 19375= 100101110101111Записываем сырой пароль и вычисляем 2 контрольные суммы:
(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
Но это ещё не всё!
Я приготовил кое-что ещё…
На десерт — Banana Prince
Немного отвлечёмся от приставки Sega и перейдём на Nes (Денди). Эта игра очень сильно потрепала мои нервы. Кто играл, тот помнит длиннющие вопросы на японском, из-за которых прохождение игры превращается в ад. Пароли в ней простые, да с подковыркой. Чтобы пройти игру на 100% нужно было собрать 4 доспеха. Но есть одна проблема, чтобы их получить, надо было ответить на тонну вопросов. Сколько я ни копался в Интернете и в своей книге кодов, я так и не нашёл пароли, которые сохраняют собранные доспехи. А без них, финальный босс пошлёт вас куда подальше тонной японских иероглифов. Но покопавшись в назначениях битов, я нашёл, что игра сохраняет:
- номер текущего уровня (0–20) в десятичной системе счисления
- номер оружия (0–15)
- доспехи (0–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 доспеха
- номер уровня (20)
- номер оружия (15)
Переводим значения в двоичную систему счисления:
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)
Осталось перевести цифры в банановый эквивалент.
Заключение
Вот мы и вышли на финишную прямую.
Что хотелось бы сказать? Ну что ж, надеюсь, эта статья кому-то да пригодится. Удачи, спасибо за прочтение.