hexstr / FGOAssetsModifyTool

Fate/GO资源解密工具
448 stars 63 forks source link

资源加密是不是应该先压缩再加密? #45

Closed NepPure closed 2 years ago

NepPure commented 2 years ago

不是很确定,所以没有直接pr

自测时,发现单元测试不通过

        [TestMethod()]
        public void CatGame3Test()
        {
            CatAndMouseGame decryptor = new(CatAndMouseGame.FileType.CN);
            var test = "abcd";

            var enc = decryptor.CatGame3(test);
            var dec = decryptor.MouseGame3(enc);

            Assert.AreEqual(test, dec);
        }

对照解密方式,改了一下压缩资源的加密为先压缩后加密,然后正常

        public byte[] CatHomeMain(byte[] data, byte[] home, byte[] info, bool isCompress = false)
        {
            byte[] result = null;
            try
            {
                if (isCompress)
                {
                    using (MemoryStream inStream = new MemoryStream(data))
                    {
                        using (MemoryStream outStream = new MemoryStream())
                        {
                            if (fileType == FileType.CN)
                            {
                                BZip2.Compress(inStream, outStream, true, -9);
                            }
                            else
                            {
                                GZip.Compress(inStream, outStream, true);
                            }
                            data = outStream.ToArray();
                        }
                    }
                }

                var blockCipher = new CbcBlockCipher(new RijndaelEngine(256));
                var cipher = new PaddedBufferedBlockCipher(blockCipher, new Pkcs7Padding());
                var keyParam = new KeyParameter(home);
                var keyParamWithIV = new ParametersWithIV(keyParam, info, 0, 32);
                cipher.Init(true, keyParamWithIV);
                var buffer = new byte[cipher.GetOutputSize(data.Length)];
                var length = cipher.ProcessBytes(data, buffer, 0);
                cipher.DoFinal(buffer, length);
                result = buffer;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
                result = null;
            }
            return result;
        }

这个方法应该是主要用在文本替换那,是日服是和国服不一样?

hexstr commented 2 years ago

对,就是写反了