Exemplo n.º 1
0
        public static void Decrypt(string[] args)
        {
            using (FileStream fileStream = new FileStream(args[1], FileMode.Open))
                using (StreamReader streamReader = new StreamReader(fileStream))
                {
                    // Test the file length
                    if (fileStream.Length <= 8)
                    {
                        // This can't be a valid file
                        throw new Exception("The file is too small to be a nisasyst container");
                    }

                    // Seek to the magic numbers
                    fileStream.Seek(-8, SeekOrigin.End);

                    // Verify the magic numbers
                    if (streamReader.ReadToEnd() != MagicNumbers)
                    {
                        // This isn't a valid file
                        throw new Exception("This file isn't a nisasyst container");
                    }

                    // Generate a CRC32 over the game path
                    Crc32 crc32 = new Crc32();
                    uint  seed  = crc32.Get(Encoding.ASCII.GetBytes(args[0]));

                    // Create a new SeadRandom instance using the seed
                    SeadRandom seadRandom = new SeadRandom(seed);

                    // Create the encryption key and IV
                    byte[] encryptionKey = CreateSequence(seadRandom);
                    byte[] iv            = CreateSequence(seadRandom);

                    using (MemoryStream memoryStream = new MemoryStream())
                        using (AesManaged cryptor = new AesManaged())
                        {
                            cryptor.Mode      = CipherMode.CBC;
                            cryptor.Padding   = PaddingMode.PKCS7;
                            cryptor.KeySize   = 128;
                            cryptor.BlockSize = 128;

                            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptor.CreateDecryptor(encryptionKey, iv), CryptoStreamMode.Write))
                            {
                                // Seek to the beginning of the file
                                fileStream.Seek(0, SeekOrigin.Begin);

                                // Copy the encrypted data
                                CopyStream(fileStream, cryptoStream, (int)fileStream.Length - 8);
                            }

                            // Write out the new file
                            File.WriteAllBytes(args[1] + ".decrypted", memoryStream.ToArray());
                        }
                }
        }
Exemplo n.º 2
0
        private static byte[] CreateSequence(SeadRandom random)
        {
            // Create byte array
            byte[] sequence = new byte[16];

            // Create each byte
            for (int i = 0; i < sequence.Length; i++)
            {
                // Create empty byte string
                string byteString = "";// "0x";

                // Get characters from key material
                byteString += KeyMaterial[random.GetUInt32() >> 24];
                byteString += KeyMaterial[random.GetUInt32() >> 24];

                // Parse the resulting byte
                sequence[i] = Convert.ToByte(byteString, 16);
            }

            // Return the sequence
            return(sequence);
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            // Check if enough args were passed
            if (args.Length != 2)
            {
                Console.WriteLine("NisasystSharp <game path> <file path>");
                Console.WriteLine("Example: NisasystSharp Mush/ActorDb.release.byml C:\\Blitz\\ActorDb.Release.byml");

                return;
            }

            using (FileStream fileStream = new FileStream(args[1], FileMode.Open))
                using (StreamReader streamReader = new StreamReader(fileStream))
                {
                    // Test the file length
                    if (fileStream.Length <= 8)
                    {
                        // This can't be a valid file
                        Console.WriteLine("The file is too small to be a nisasyst container");
                        return;
                    }

                    // Seek to the magic numbers
                    fileStream.Seek(-8, SeekOrigin.End);

                    // Verify the magic numbers
                    if (streamReader.ReadToEnd() != MagicNumbers)
                    {
                        // This isn't a valid file
                        Console.WriteLine("This file isn't a nisasyst container");
                        return;
                    }

                    // Generate a CRC32 over the game path
                    Crc32 crc32 = new Crc32();
                    uint  seed  = crc32.Get(Encoding.ASCII.GetBytes(args[0]));

                    // Create a new SeadRandom instance using the seed
                    SeadRandom seadRandom = new SeadRandom(seed);

                    // Create the encryption key and IV
                    byte[] encryptionKey = CreateSequence(seadRandom);
                    byte[] iv            = CreateSequence(seadRandom);

                    using (MemoryStream memoryStream = new MemoryStream())
                        using (AesManaged cryptor = new AesManaged())
                        {
                            cryptor.Mode      = CipherMode.CBC;
                            cryptor.Padding   = PaddingMode.PKCS7;
                            cryptor.KeySize   = 128;
                            cryptor.BlockSize = 128;

                            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptor.CreateDecryptor(encryptionKey, iv), CryptoStreamMode.Write))
                            {
                                // Seek to the beginning of the file
                                fileStream.Seek(0, SeekOrigin.Begin);

                                // Copy the encrypted data
                                CopyStream(fileStream, cryptoStream, (int)fileStream.Length - 8);
                            }

                            // Write out the new file
                            File.WriteAllBytes(args[1] + ".decrypted", memoryStream.ToArray());

                            Console.WriteLine("Wrote decrypted file");
                        }
                }
        }