hide results

    Password Algorithm Guide by jmcmahan357

    Updated: 11/16/04 | Printable Version | Search This Guide

    **********************************************
    River City Ransom Password Algorithm
    v0.0 2004.11.15
    Author: Jerry McMahan Jr. (jerry@ensomnya.net)
    **********************************************
    
    
    *******
    Copying
    *******
    This text is freely redistributable, as is.
    
    
    *******************
    About This Document
    *******************
    This text provides a description of the password algorithm for the NES
    version of River City Ransom. The information provided should allow the
    reader to generate passwords for a desired set of character data, or to
    determine the character data associated with a particular password and
    check it's validity. The information presented was reverse-engineered 
    from the game, so there may be some errors. If you find any errors,
    email me at jerry@ensomnya.net and let me know about them.
    
    
    *************
    Prerequisites
    *************
    To understand the material in this text, you'll need to have an
    understanding of binary numbers and Boolean logic. Actually, you may be
    able to do without it and pick it up along the way, but it'll make
    things a lot easier. You will also need to know what binary coded
    decimal is, to understand how the money values are stored. You can find
    that in a lot of places online. Here's a good description:
    
    http://en.wikipedia.org/wiki/Binary_coded_decimal
    
    
    *****************
    Table of Contents
    *****************
    1. Introduction
    2. Password Description
       2.1 Data Stored in Each Position of the Password
       2.2 Password Algorithm
    3. Numeric Values of Inventory Items 
    4. Credits
    
    
    ***************
    1. Introduction
    ***************
    River City Ransom is notorious for its annoyingly long password system.
    The player is required to enter 33 characters on a menu screen. Any
    mistakes in copying just one of those characters will probably cause the
    password to fail. Partly out of a desire to provide a correction for
    this, and partly out of curiousity and boredom, I reverse-engineered the
    password system. I've not done much checking on how correct this
    information is, but all the checking I've done so far has shown has
    verified this info. 
    
    Interestingly, the information here can be used to generate passwords
    that give your character stats, inventory items, or skills that aren't
    possible to get through normal play. As a few examples of things I've
    tried out that worked, I generated a password to give my character a
    punch value of 0, to carry a "Smile" in his inventory, to equip a donut
    (that is, have a '#' next to it, as in books that are read or shoes that
    are worn), and to have the "Stone Hands" ability without having the
    "Stone Hands" book in my inventory. There are probably a lot more things
    you can do, but I just haven't tried.
    
    As an interesting side note, if the information I've found about the
    password system is thorough and completely correct, then there are 
    562013623917344407265358750030539723015559577600000 valid passwords for
    River City Ransom. The number of possible passwords you can enter, both
    valid and invalid, is 124 to the 33rd power, or
    1210362919824851463371550738227065461619969130596515513717925687066624.
    That means that if you were to randomly enter values into the password
    system, you'd have about a 1 in 2 quintillion (2 with 18 zeros after it)
    to enter a working password. Actually, I may be wrong about the above,
    but it sounds good anyway.
    
    The information is presented in a kind of awkward manner, as it's mostly
    reference information. It might be easier to look at the
    "Examples" section first, and then use the other sections as reference.
    
    Finally, for those interested, I've built written a password generator
    and decrypter, both of which have a web interface. These tools, along
    with the source code (in Python) are located at my website, here:
    
    http://ensomnya.net/projects/rcr_password/index.html
    
    (I apologize for the blatant plug of my website.) It's assumed that
    there are bugs in these programs, but so far they've been tested to work
    properly (I've even used them to make corrections in a couple of
    incorrect passwords listed on GameFAQ).
    
    If there's some point that I've not made clear enough in this text, or
    if you have any comments, email me at jerry@ensomnya.net, and I'll see
    if I can help you - and maybe, in the process, improve this document.
    
    
    ***********************
    2. Password Description
    ***********************
    The password system is actually a lot simpler than it might appear. For
    a given set of character data, there are 32 passwords that represent
    that data, corresponding with a key included with the password. This
    accounts for seeing different passwords upon entering and exiting the
    password screen several times in a row. If you do it enough times,
    you'll eventually begin to see the same passwords reappear. 
    
    The aforementioned key is the last letter in the password. It can take
    on one of 32 values, 'A' through 'Z' or 'a' through 'f'. The key is used
    in the algorithm to encrypt or decrypt the character data, as will be
    explained below.
    
    
    ************************************************
    2.1 Data Stored in Each Position of the Password
    ************************************************
    
    Each letter in the password represents a certain value in the game which
    will now be explained. The password is always of the following format,
    where each of the following numbers represents a position in the
    password:
    
    01 02 03 04 05 06 07 08 09 10 11
    12 13 14 15 16 17 18 19 20 21 22
    23 24 25 26 27 28 29 30 31 32 33
    
    For example, in the password,
    
     C  K  X  I  E  e  S  f  q  s  X
     J  P  5  f  M  U  F  D  W  G  M
     S  H  K  L  b  S  O  N  M  O  A
    
    01 = C, 02 = K, 03 = X, 04 = I, and so on.
    
    Except for position 33, the raw value represented by each character in 
    each of these positions can range from 0 to 63. For position 33, it 
    ranges from 0 to 31. The values represented by each of these characters 
    in these positions follows. An overview is presented, followed by a more
    in-depth description of each of the values.
    
    
    Summary:
    
    01 - Punch
    02 - Kick
    03 - Weapon
    04 - Throwing
    05 - Agility
    06 - Defense
    07 - Strength
    08 - Will Power
    09 - Lower bits of Stamina
    10 - Lower bits of Max Power
    11 - High bits of Stamina and Max Power
    12 - Active skills
    13 - Lower bits of cents in money
    14 - Lower bits of ones and tens digits in money
    15 - Lower bits of hundreds digit in money
    16 - High bits of cents, ones & tens digits, and hundreds digits
    17 - Lower bits of inventory slot 1
    18 - Lower bits of inventory slot 2
    19 - High bits of inventory slot 1 and 2
    20 - Lower bits of inventory slot 3
    21 - Lower bits of inventory slot 4
    22 - High bits of inventory slot 3 and 4
    23 - Lower bits of inventory slot 5
    24 - Lower bits of inventory slot 6
    25 - High bits of inventory slot 5 and 6
    26 - Lower bits of inventory slot 7
    27 - Lower bits of inventory slot 8
    28 - High bits of inventory slot 7 and 8
    29 - Bosses defeated 1
    30 - Bosses defeated 2
    31 - Bosses defeated 3
    32 - "Checksum" of values in positions 01 through 31
    33 - Password key
    
    
    In-depth:
    
    01: 
    The total value of Punch.
    
    02:
    The total value of Kick.
    
    03: 
    The total value of Weapon.
    
    04: 
    The total value of Throwing.
    
    05: 
    The total value of Agility.
    
    06: 
    The total value of Defense.
    
    07: 
    The total value of Strength.
    
    08: 
    The total value of Will Power.
    
    09:
    The first 6 bits of Stamina. 
    
    10: 
    The first 6 bits of Max Power.
    
    11:
    If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    the most significant bit, then the following description applies.
    
    The highest bit of Stamina is in bit 2 and the highest bit of Max
    Power is in the bit 0. To reconstruct Stamina, you integer divide this
    value by four (that is, truncate the value), multiply the result by
    sixty-four, and add what you get to the value in position 09. To
    reconstruct Max Power, you take this value modulo 2 (or, equivalently,
    mask out the high 7 bits), multiply the result by 64, and add it to the
    value in position 10. 
    
    12:
    This value explains what fighting skills your character has. Each bit
    represents a value. If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    the most significant bit, the bit values correspond to the different
    skills as follows
    
    bit 0 - Stone Hands
    bit 1 - Dragon Feet
    bit 2 - Grand Slam
    bit 3 - Acro Circus
    bit 4 - Javelin Man
    bit 5 - Fatal Steps
    
    A bit set to 1 means the skill is active. Otherwise, the skill is
    inactive.
    
    13:
    The lowest 6 bits of the cents value (that is, the number of cents in
    your money statistic). For example, with $123.45, the cents value is 
    "45".
    
    14:
    The lowest 6 bits of the first two digits of the whole number portion of
    your money statistic. For example, with $123.45, the first two digits
    of the whole number portion of the money is "23".
    
    15:
    The lowest 6 bits of the hundreds digit of your money statistic. For
    example, with $123.45, the hundreds digit is "1".
    
    16:
    If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    the most significant bit, then the following description applies.
    
    Bits 5 and 4 correspond to the highest bits (bits 7 and 6, respectively)
    of the cents value (from position 13). 
    
    Bits 3 and 2 correspond to the highest bits (bits 7 and 6, respectively)
    of the value in position 14.
    
    Bits 1 and 0 correspond to the highest bits (bits 7 and 6, respectively)
    of the value in position 15. Supposedly, these bits will always be zero,
    because you're not supposed to be able to get more money than $999.99,
    but there is code in the game to store the high bits here in this value.
    Whether this has an effect on anything or not is unknown.
    
    The money is stored in binary-coded decimal, in three different
    variables, one for each of the values mentioned in the description of
    position 13, 14, and 15. So for a money statistic of "$99.00", the cents
    value would be 0, the ones and tens value would be 153 (because 153 is
    0x99 in hexadecimal), and the hundreds value would be 0. 
    
    17:
    This is the first 6 bits of the value for the first inventory slot. The
    inventory items corresponding to the different values in these locations
    is listed in Section 5 of this document.
    
    18:
    This is the first 6 bits of the value for the second inventory slot.
    
    19:
    If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    the most significant bit, then the following description applies.
    
    Bits 3 and 2 correspond to bits 7 and 6 of the value for the first
    inventory slot. Bits 1 and 0 correspond to bits 7 and 6 of the value for
    the second inventory slot.
    
    20:
    This is the first 6 bits of the value for the third inventory slot. 
    
    21:
    This is the first 6 bits of the value for the fourth inventory slot.
    
    22:
    If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    the most significant bit, then the following description applies.
    
    Bits 3 and 2 correspond to bits 7 and 6 of the value for the third
    inventory slot. Bits 1 and 0 correspond to bits 7 and 6 of the value for
    the fourth inventory slot.
    
    23:
    This is the first 6 bits of the value for the fifth inventory slot. 
    
    24:
    This is the first 6 bits of the value for the sixth inventory slot.
    
    25:
    If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    the most significant bit, then the following description applies.
    
    Bits 3 and 2 correspond to bits 7 and 6 of the value for the fifth
    inventory slot. Bits 1 and 0 correspond to bits 7 and 6 of the value for
    the sixth inventory slot.
    
    26:
    This is the first 6 bits of the value for the seventh inventory slot. 
    
    27:
    This is the first 6 bits of the value for the eighth inventory slot.
    
    28:
    If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    the most significant bit, then the following description applies.
    
    Bits 3 and 2 correspond to bits 7 and 6 of the value for the seventh
    inventory slot. Bits 1 and 0 correspond to bits 7 and 6 of the value for
    the eighth inventory slot.
    
    29:
    The bits in the value stored in this position correspond to bosses
    you've defeated, or events you've gone through (like talking to Roxy or
    rescuing Cyndi). 
    
    If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    the most significant bit, then the following description applies.
    
    bit 0 - Clyde
    bit 1 - Benny
    bit 2 - Thor
    bit 3 - Otis
    bit 4 - Ivan
    
    30:
    The bits in the value stored in this position correspond to bosses
    you've defeated, or events you've gone through (like talking to Roxy or
    rescuing Cyndi). 
    
    If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    the most significant bit, then the following description applies.
    
    bit 0 - Roxy
    bit 2 - Cyndi
    bit 3 - Moose
    bit 4 - Mojo
    bit 5 - Turk
    
    31:
    The bits in the value stored in this position correspond to bosses
    you've defeated, or events you've gone through (like talking to Roxy or
    rescuing Cyndi). 
    
    If you order the bits like so:
    
    |7|6|5|4|3|2|1|0|
    
    with bit 0 representing the least significant bit and bit 7 representing
    
    the most significant bit, then the following description applies.
    
    bit 0 - Rocko
    bit 1 - Blade
    bit 2 - Randy*
    bit 3 - Andy*
    
    *Note - I'm not sure if these are reversed or not. The twins look
    identical, so I'm not sure which one is which. But it really doesn't
    matter.
    
    32:
    The "checksum" of the values in position 01 through 31. To calculate it,
    simply add all the values in positions 01 through 31 and keep only the
    lower 6 bits. If the value input here with the password doesn't match
    what the game calculates for the password, a "Wrong Password" error will
    occur.
    
    33:
    This is the password key. It's a value ranging from 0 to 31 that is
    picked at random and used in the encoding / decoding of the password.
    It's used to create 32 different passwords for each set of character
    data.
    
    
    **********************
    2.2 Password Algorithm
    **********************
    The password algorithm is pretty easy to follow. To encrypt a value, set
    up each position of the password with an appropriate value. Then for the
    first 32 positions, the following formula is applied:
    
    x_coded[x] = (key + kconstant[x]) XOR value[x]
    
    where x_coded[x] is the intermediate result, key is the value in 
    position 33, kconstnat[x] is a special number that's different for each
    position and is always added as in the formula (probably to make the
    password appear more random and irregular), and value[x] is the value
    stored in the position. The "XOR" operation in the equation is a bitwise
    XOR operation - that is, it performs an XOR on each bit (like the "^"
    operator in C, and similar operators).
    
    The kconstant is as follows, with the position it refers to preceding
    the constant:
    
    Position	Constant
    --------------------
    01:			13
    02:			5	
    03:			24
    04:			7
    05:			11
    06:			17
    07:			29
    08:			16
    09:			21
    10:			19
    11:			23
    12:			9
    13:			15
    14:			25
    15:			31
    16:			12
    17:			20
    18:			5
    19:			3
    20:			22
    21:			6
    22:			12
    23:			18
    24:			7
    25:			10
    26:			11
    27:			27
    28:			18
    29:			14
    30:			13
    31:			12
    32:			24
    
    
    Notice that the final position, 33, doesn't have this constant added to
    it, or anything XOR'ed with it. 
    
    Once these intermediate values are calculated, the number 192 is added
    to them. Then the resulting number is used as an index into the
    following table to generate the final password.
    
    
    Character Chart
    ---------------
    255 = B'
    254 = A'
    253 = 9
    252 = 8
    251 = 7
    250 = 6
    249 = 5
    248 = 4
    247 = 3
    246 = 2
    245 = 1
    244 = 0
    243 = z
    242 = y
    241 = x
    240 = w
    239 = v
    238 = u
    237 = t
    236 = s
    235 = r
    234 = q
    233 = p
    232 = o
    231 = n
    230 = m
    229 = l
    228 = k
    227 = j
    226 = i
    225 = h
    224 = g
    223 = f
    222 = e
    221 = d
    220 = c
    219 = b
    218 = a
    217 = Z
    216 = Y
    215 = X
    214 = W
    213 = V
    212 = U
    211 = T
    210 = S
    209 = R
    208 = Q
    207 = P
    206 = O
    205 = N
    204 = M
    203 = L
    202 = K
    201 = J
    200 = I
    199 = H
    198 = G
    197 = F
    196 = E
    195 = D
    194 = C
    193 = B
    192 = A
    
    
    It's worth noting from this chart that the only characters with accent
    mark following them (denoted by the single quote, ', following the
    letter) are A and B. As far as I can tell, there are never any passwords
    given by the game with the accent mark on any other character, although
    depending on what value they represent, it may be possible to generate
    passwords with them. That would require more research (and some kind of
    motivation) to find out.
    
    And that's it. To decrypt the passwords, just reverse the above steps.
    
    I was going to provide some examples, as I know it's a bit difficult to
    follow the real meaning of all this means with what I've written here,
    but I'll save that for a future improvement, if anyone requests it. For a
    working example, you can, as I mentioned above, look at the source code
    of the password generator and decrypter programs I've written that are
    available from my website at this URL:
    
    http://ensomnya.net/projects/rcr_password/index.html
    
    I don't really know anything about cryptography and what not, but I read
    an article online describing "One-Time Pad" ciphers, and that seems to 
    be what this is. If anyone could confirm or correct that, I'd appreciate
    it.
    
    Have fun messing with these passwords. If you find anything that doesn't
    match up with the information in this document, email me and let me
    know.
    
    
    *************************************
    3. Numeric Values of Inventory Items 
    *************************************
    The following list has the value, followed by the item. I've found that
    sometimes the password will cause items with different descriptions to
    be placed in the inventory, but they seem to represent the same things
    as in this list. Also, items that you can't typically hold in your
    inventory seem to cause garbled messages to appear when you try to use
    them.
    
    The possible values actually go up to 255. However, once the value
    exceeds 127, the inventory item becomes the same as the item
    corresponding to the value that is 128 numbers below that number, only
    it has the "#" sign at the beginning (like when books are read). For
    example, if the value is 130, then the item will be 130 - 127 = 3, which
    is bagel, only it will have a "#" in front of it, making it "#bagel".
    
    0 nothing
    1 donut
    2 muffin
    3 bagel
    4 honey_bun
    5 croissant
    6 sugar
    7 toll_house
    8 maple_pecan
    9 oatmeal
    10 brownie
    11 mint_gum
    12 lolly_pop
    13 jaw_breaker
    14 rock_candy
    15 fudge_bar
    16 salad_paris
    17 onion_soup
    18 cornish_hen
    19 veal_walle
    20 vita-mints
    21 digestol
    22 recharge!
    23 karma_jolt
    24 omni_elixir
    25 date_saver
    26 love_potion
    27 antedote_12
    28 r_&_b
    29 rock
    30 pop
    31 soul
    32 classical
    33 sneakers
    34 boat_shoes
    35 loafers
    36 army_boots
    37 texas_boots
    38 slippers
    39 thongs
    40 sandals
    41 mod_boots
    42 insoles
    43 maze_craze
    44 decathlete
    45 hyper_ball
    46 techno_belt
    47 teddy_bear
    48 stone_hands
    49 dragon_feet
    50 grand_slam
    51 acro_circus
    52 javelin_man
    53 fatal_steps
    54 scandal_rag
    55 comic_times
    56 mystic_seer
    57 nuclear_spy
    58 indian_lore
    59 excaliber
    60 zeus_wand
    61 rodan_wing
    62 gold_medal
    63 isis_scroll
    64 sirloin
    65 rib-eye
    66 t-bone
    67 lamb_leg
    68 merv_burger
    69 cheese_merv
    70 fish_merv
    71 mondo_merv
    72 milk
    73 iced_tea
    74 soda
    75 merv_malt
    76 merv_fries
    77 merv_rings
    78 apple_pies
    79 spicy_chili
    80 smile
    81 chickwich
    82 dark_meat
    83 white_meat
    84 combination
    85 lemonade
    86 gravy
    87 biscuits
    88 corn_cobber
    89 cole_slaw
    90 coffee
    91 tea
    92 hot_cocoa
    93 pancakes
    94 waffles
    95 ice_cream
    96 roman_shake
    97 cola_float
    98 nero_pizza
    99 lasagna
    100 fresh_juice
    101 lemon_tea
    102 herbal_tea
    103 carrot_cake
    104 pound_cake
    105 egg
    106 octopus
    107 squid
    108 conger_eel
    109 prawn
    110 salmon
    111 ark_shell
    112 sea_urchin
    113 halibut
    114 swordfish
    115 salad_roll
    116 tuna_roll
    117 shrimp_roll
    118 mixed_roll
    119 egg_roll
    120 fried_rice
    121 garlic_pork
    122 pepper_beef
    123 chow_mein
    124 sauna
    125 no_thanks
    126 nothing
    127 main_menu
    
    
    **********
    4. Credits
    **********
    Thanks to:
    
    - Technos for making such a cool game.
    - The makers of FCEU, as their debugger made this much easier to figure
      out, as did their emulator.
    - Zdravko Beikov, his "Ultimate Cheating Guide" listed some of the stat 
      locations in memory, saving me the trouble of having to find them
      myself.