/*
Simple Fallout Shelter saved game decrypt/encrypt
Author: superkhung@vnsecurity.net
Usage: FOSDecrypt.exe input_file
File will decrypt if it's encrypted and vice versa
Use any json editor to edit saved data
*/
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
public static class FalloutShelterDecrypt
{
private const string initVector = "tu89geji340t89u2";
private const string passPhrase = "UGxheWVy";
private const int keysize = 256;
public static bool IsBase64String (this string s)
{
s = s.Trim ();
return (s.Length % 4 == 0) && Regex.IsMatch (s, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None);
}
public static string Encrypt (string Text)
{
byte[] initVectorBytes = Encoding.UTF8.GetBytes (initVector);
byte[] plainTextBytes = Encoding.UTF8.GetBytes (Text);
Rfc2898DeriveBytes password = new Rfc2898DeriveBytes (passPhrase, initVectorBytes);
byte[] keyBytes = password.GetBytes (keysize / 8);
RijndaelManaged symmetricKey = new RijndaelManaged ();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform encryptor = symmetricKey.CreateEncryptor (keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream ();
CryptoStream cryptoStream = new CryptoStream (memoryStream, encryptor, CryptoStreamMode.Write);
cryptoStream.Write (plainTextBytes, 0, plainTextBytes.Length);
cryptoStream.FlushFinalBlock ();
byte[] Encrypted = memoryStream.ToArray ();
memoryStream.Close ();
cryptoStream.Close ();
return Convert.ToBase64String (Encrypted);
}
public static string Decrypt (string EncryptedText)
{
byte[] initVectorBytes = Encoding.ASCII.GetBytes (initVector);
byte[] DeEncryptedText = Convert.FromBase64String (EncryptedText);
Rfc2898DeriveBytes password = new Rfc2898DeriveBytes (passPhrase, initVectorBytes);
byte[] keyBytes = password.GetBytes (keysize / 8);
RijndaelManaged symmetricKey = new RijndaelManaged ();
symmetricKey.Mode = CipherMode.CBC;
ICryptoTransform decryptor = symmetricKey.CreateDecryptor (keyBytes, initVectorBytes);
MemoryStream memoryStream = new MemoryStream (DeEncryptedText);
CryptoStream cryptoStream = new CryptoStream (memoryStream, decryptor, CryptoStreamMode.Read);
byte[] plainTextBytes = new byte[DeEncryptedText.Length];
int decryptedByteCount = cryptoStream.Read (plainTextBytes, 0, plainTextBytes.Length);
memoryStream.Close ();
cryptoStream.Close ();
return Encoding.UTF8.GetString (plainTextBytes, 0, decryptedByteCount);
}
static void Main (string[] args)
{
if (args.Length < 1) {
Console.WriteLine ("Usage: FOSDecrypt.exe input_file");
}
String data = File.ReadAllText (args [0]);
if (IsBase64String (data)) {
File.WriteAllText (args [0], Decrypt (data));
} else {
File.WriteAllText (args [0], Encrypt (data));
}
}
}