Skip to content

Instantly share code, notes, and snippets.

@SciresM
Created May 7, 2017 02:19
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SciresM/0ecc3c2b8c93922d3b21f7c4e552626c to your computer and use it in GitHub Desktop.
Save SciresM/0ecc3c2b8c93922d3b21f7c4e552626c to your computer and use it in GitHub Desktop.
Encryption/Decryption of Animal Crossing: New Leaf's Bell/Money values.
private static uint DecryptACNLMoney(ulong money)
{
// Unpack 64-bit value into (u32, u16, u8, u8) values.
var enc = (uint)(money & 0xFFFFFFFF);
var adjust = (ushort)((money >> 32) & 0xFFFF);
var shift_val = (byte)((money >> 48) & 0xFF);
var chk = (byte)((money >> 56) & 0xFF);
// Validate 8-bit checksum
if ((((enc >> 0) + (enc >> 8) + (enc >> 16) + (enc >> 24) + 0xBA) & 0xFF) != chk) return 0;
var left_shift = (byte)((0x1C - shift_val) & 0xFF);
var right_shift = 0x20 - left_shift;
// Handle error case: Invalid shift value.
if (left_shift >= 0x20)
{
return 0 + (enc << right_shift) - (adjust + 0x8F187432);
}
// This case should occur for all game-generated values.
return (enc << left_shift) + (enc >> right_shift) - (adjust + 0x8F187432);
}
private static ulong EncryptACNLMoney(uint dec)
{
// Make a new RNG
var r = new Random(Guid.NewGuid().GetHashCode());
// Generate random adjustment, shift values.
var adjust = (ushort) r.Next(0x10000);
var shift_val = (byte)r.Next(0x1A);
// Encipher value
var enc = dec + adjust + 0x8F187432;
enc = (enc >> (0x1C - shift_val)) + (enc << (shift_val + 4));
// Calculate Checksum
var chk = (byte) (((enc >> 0) + (enc >> 8) + (enc >> 16) + (enc >> 24) + 0xBA) & 0xFF);
// Pack result
return ((ulong)enc << 0) | ((ulong)adjust << 32) | ((ulong)shift_val << 48) | ((ulong)chk << 56);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment