diff --git a/RMDEC/MVProject.cs b/RMDEC/MVProject.cs index 860dd72..292ac4d 100644 --- a/RMDEC/MVProject.cs +++ b/RMDEC/MVProject.cs @@ -159,8 +159,32 @@ namespace RMDEC } + public void EncryptFile(Stream inStream, Stream outStream) + { + outStream.Seek(0x00, SeekOrigin.Begin); + outStream.SetLength(0x00); + + BinaryWriter boutStream = new BinaryWriter(outStream); + string magic = "RPGMV"; + byte[] magicBytes = Encoding.UTF8.GetBytes(magic); + + outStream.Write(magicBytes, 0x00, magicBytes.Length); + boutStream.Write(0x00); + boutStream.Write(0x103); + outStream.Write(new byte[0x3], 0x00, 0x3); + + inStream.Seek(0x00, SeekOrigin.Begin); + byte[] plaintextHeader = new byte[0x10]; + inStream.Read(plaintextHeader, 0x00, 0x10); + + byte[] encryptedHeader = xor(plaintextHeader, encryptionKey); + outStream.Write(encryptedHeader, 0x00, encryptedHeader.Length); + inStream.CopyTo(outStream); + } public void DecryptFile(Stream inStream, Stream outStream) { + + inStream.Seek(0x00, SeekOrigin.Begin); byte[] magic = new byte[0x05]; @@ -177,6 +201,10 @@ namespace RMDEC inStream.Read(encryptedHeader, 0x00, 0x10); byte[] plaintextHeader = xor(encryptedHeader, encryptionKey); + + outStream.Seek(0x00, SeekOrigin.Begin); + outStream.SetLength(0); + outStream.Write(plaintextHeader, 0x00, plaintextHeader.Length); inStream.CopyTo(outStream); } diff --git a/RMDEC/MVProjectToolset.cs b/RMDEC/MVProjectToolset.cs index de4dcba..26e1e3a 100644 --- a/RMDEC/MVProjectToolset.cs +++ b/RMDEC/MVProjectToolset.cs @@ -26,6 +26,8 @@ namespace RMDEC private List encFileList = new List(); private List decFileList = new List(); + private string[] blacklistedFiles = { Path.Combine("icon","icon.png"), Path.Combine("img","system","Window.png"), Path.Combine("img","system","Loading.png") }; + private bool encryptedIndexingComplete = false; private bool unencryptedIndexingComplete = false; private void onIndexThreadComplete() @@ -59,13 +61,13 @@ namespace RMDEC List pngList = new List(); List oggList = new List(); - List M4AList = new List(); + List m4aList = new List(); foreach (string file in Directory.EnumerateFiles(mvProject.FilePath, "*", SearchOption.AllDirectories)) { - string fileExtension = Path.GetExtension(file); + string fileExtension = Path.GetExtension(file).ToLower(); switch (fileExtension) { @@ -76,7 +78,7 @@ namespace RMDEC oggList.Add(file); break; case ".rpgmvm": - M4AList.Add(file); + m4aList.Add(file); break; } @@ -106,14 +108,14 @@ namespace RMDEC } //add M4A - foreach (string M4A in M4AList) + foreach (string m4a in m4aList) { - string relativeName = M4A.Remove(0, mvProject.FilePath.Length+1); + string relativeName = m4a.Remove(0, mvProject.FilePath.Length+1); Invoke((Action)delegate { encryptedFileList.Items.Add("[M4A] " + relativeName); }); - encFileList.Add(M4A); + encFileList.Add(m4a); } Invoke((Action)delegate @@ -131,12 +133,18 @@ namespace RMDEC List pngList = new List(); List oggList = new List(); - List M4AList = new List(); + List m4aList = new List(); foreach (string file in Directory.EnumerateFiles(mvProject.FilePath, "*", SearchOption.AllDirectories)) { - string fileExtension = Path.GetExtension(file); + string relativeName = file.Remove(0, mvProject.FilePath.Length + 1); + string fileExtension = Path.GetExtension(file).ToLower(); + + if(blacklistedFiles.Contains(relativeName)) + { + continue; + } switch (fileExtension) { @@ -146,8 +154,8 @@ namespace RMDEC case ".ogg": oggList.Add(file); break; - case ".M4A": - M4AList.Add(file); + case ".m4a": + m4aList.Add(file); break; } @@ -158,6 +166,7 @@ namespace RMDEC foreach (string png in pngList) { string relativeName = png.Remove(0, mvProject.FilePath.Length+1); + Invoke((Action)delegate { decryptedFileList.Items.Add("[PNG] " + relativeName); @@ -169,6 +178,7 @@ namespace RMDEC foreach (string ogg in oggList) { string relativeName = ogg.Remove(0, mvProject.FilePath.Length+1); + Invoke((Action)delegate { decryptedFileList.Items.Add("[OGG] " + relativeName); @@ -177,14 +187,15 @@ namespace RMDEC } //add M4A - foreach (string M4A in M4AList) + foreach (string m4a in m4aList) { - string relativeName = M4A.Remove(0, mvProject.FilePath.Length+1); + string relativeName = m4a.Remove(0, mvProject.FilePath.Length+1); + Invoke((Action)delegate { decryptedFileList.Items.Add("[M4A] " + relativeName); }); - decFileList.Add(M4A); + decFileList.Add(m4a); } Invoke((Action)delegate @@ -205,7 +216,99 @@ namespace RMDEC private void encryptSelected_Click(object sender, EventArgs e) { + SelectedIndexCollection itemList = decryptedFileList.SelectedIndices; + int itemCount = itemList.Count; + if (itemCount < 1) + { + return; + } + + int item = 0; + + processingBar.Style = ProgressBarStyle.Continuous; + processingBar.Maximum = itemCount; + + processingText.BackColor = Color.Yellow; + + encryptSelected.Enabled = false; + decryptSelected.Enabled = false; + + + Thread decryptFilesThread = new Thread(() => + { + int i = 1; + int total = itemCount; + do + { + + Invoke((Action)delegate + { + + itemCount = itemList.Count; + item = itemList[0]; + + processingText.Text = "Encrypting " + i.ToString() + "/" + total.ToString(); + }); + + + + string decryptedFile = decFileList[item]; + string extension = Path.GetExtension(decryptedFile).ToLower(); + string newExtension = ""; + + switch (extension) + { + case ".png": + newExtension = ".rpgmvp"; + break; + case ".ogg": + newExtension = ".rpgmvo"; + break; + case ".m4a": + newExtension = ".rpgmvm"; + break; + + } + + string encryptedFile = Path.ChangeExtension(decryptedFile, newExtension); + + FileStream Decrypted = File.OpenRead(decryptedFile); + FileStream Encrypted = File.OpenWrite(encryptedFile); + + mvProject.EncryptFile(Decrypted, Encrypted); + + Encrypted.Close(); + Decrypted.Close(); + + File.Delete(decryptedFile); + + Invoke((Action)delegate + { + string entry = decryptedFileList.Items[item].ToString(); + string encryptedEntry = Path.ChangeExtension(entry, newExtension); + encryptedFileList.Items.Add(encryptedEntry); + encFileList.Add(encryptedFile); + + decryptedFileList.Items.RemoveAt(item); + decFileList.RemoveAt(item); + + processingBar.Value = i; + }); + + i++; + } while (itemCount > 1); + + Invoke((Action)delegate + { + encryptSelected.Enabled = true; + decryptSelected.Enabled = true; + processingText.BackColor = Color.Green; + processingText.Text = "Encrypted " + total.ToString() + " files!"; + }); + }); + + decryptFilesThread.Start(); } private void decryptSelected_Click(object sender, EventArgs e) @@ -218,11 +321,8 @@ namespace RMDEC return; } - int[] selectedIndexes = new int[itemCount]; int item = 0; - itemList.CopyTo(selectedIndexes, 0); - processingBar.Style = ProgressBarStyle.Continuous; processingBar.Maximum = itemCount; @@ -250,7 +350,7 @@ namespace RMDEC string encryptedFile = encFileList[item]; - string extension = Path.GetExtension(encryptedFile); + string extension = Path.GetExtension(encryptedFile).ToLower(); string newExtension = ""; switch (extension) @@ -286,7 +386,7 @@ namespace RMDEC decryptedFileList.Items.Add(decryptedEntry); decFileList.Add(decryptedFile); - encryptedFileList.Items.Remove(entry); + encryptedFileList.Items.RemoveAt(item); encFileList.RemoveAt(item); processingBar.Value = i; @@ -304,13 +404,7 @@ namespace RMDEC }); }); - - - decryptFilesThread.Start(); - - - - + decryptFilesThread.Start(); }