У меня проблема с криптопотоком, который портит мои данные - PullRequest
0 голосов
/ 25 сентября 2018

Я пытался создать для себя dll, в которой был указан класс, который криптографически называется «Криптография». При разработке и тестировании метода (то есть, это был не dll, а метод), он работал нормально, не повреждая ничего, но теперь для некоторых странностей.причины, по которым метод делает что-то странное с моими данными (в данном случае это текстовый файл), вот оригинальный текст:

line1 testing testing testing
line2 testing testing testing
line3 testing testing testing
line4 testing testing testing

, а вот результат после шифрования и дешифрования:

wš0åmŦI%1ˆìµsting testing
line2 testing testing testing
line3 testing testing testing
line4 testing testing testing

а вот два метода:

public static void EncryptFile(string inputFile, string outputFile)
        {
            try
            {
                StackFrame frame = new StackFrame(1);
                var method = frame.GetMethod();
                var type = method.DeclaringType;
                //var name = method.Name;
                //var assembly = typeof(Crypto).Assembly;
                //var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0];
                var id = type.GUID.ToString();
                StringBuilder sb = new StringBuilder(id);
                var Code = sb.Replace("-", "").ToString();
                UnicodeEncoding UE = new UnicodeEncoding();
                ASCIIEncoding AsciieEncoding = new ASCIIEncoding();
                byte[] key = AsciieEncoding.GetBytes(Code);

                string cryptFile = outputFile;
                FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create);

                RijndaelManaged RMCrypto = new RijndaelManaged();
                RMCrypto.GenerateIV();
                byte[] IV = RMCrypto.IV;
                RMCrypto.Padding = PaddingMode.ISO10126;
                CryptoStream cs = new CryptoStream(fsCrypt,
                    RMCrypto.CreateEncryptor(key, IV),
                    CryptoStreamMode.Write);

                FileStream fsIn = new FileStream(inputFile, FileMode.Open);

                int data;
                while ((data = fsIn.ReadByte()) != -1)
                    cs.WriteByte((byte)data);


                fsIn.Close();
                cs.Close();
                fsCrypt.Close();
                RegistryKey Regkey =   Registry.LocalMachine.OpenSubKey("Software", true);
                Regkey.CreateSubKey("HBH");
                Regkey = Regkey.OpenSubKey("HBH", true);
                Regkey.CreateSubKey("Data");
                Regkey = Regkey.OpenSubKey("Data", true);
                long longIV = BitConverter.ToInt64(IV, 0);
                Regkey.SetValue("Data", longIV);
                Console.WriteLine("Encryption Succeeded !");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Encryption failed! Error");
                Console.WriteLine("Do you Want to see the error message ? (y/n)");
                string Response = Console.ReadLine();
                if (Response == "y" || Response == "Y")
                {
                    Console.WriteLine(ex.Message);
                    Console.ReadLine();
                    Application.Exit();
                }
                else
                {
                    Application.Exit();
                }
            }
        }

и вот метод расшифровки:

public static void DecryptFile(string inputFile, string outputFile)
        {
            try
            {
                StackFrame frame = new StackFrame(1);
                var method = frame.GetMethod();
                var type = method.DeclaringType;
                var id = type.GUID.ToString();
                //var assembly = typeof(Crypto).Assembly;
                //var attribute = (GuidAttribute)assembly.GetCustomAttributes(typeof(GuidAttribute), true)[0];
                //var id = attribute.Value;
                StringBuilder sb = new StringBuilder(id);
                var Code = sb.Replace("-", "").ToString();
                ASCIIEncoding AsciiEncoding = new ASCIIEncoding();
                byte[] key = AsciiEncoding.GetBytes(Code);
                RegistryKey Regkey = Registry.LocalMachine.OpenSubKey("Software", true);
                Regkey.OpenSubKey("HBH");
                Regkey = Regkey.OpenSubKey("HBH", true);
                Regkey.OpenSubKey("Data");
                Regkey = Regkey.OpenSubKey("Data", true);
                byte[] IV = Regkey.GetValue("Data") as byte[];
                FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);

                RijndaelManaged RMCrypto = new RijndaelManaged();
                RMCrypto.Padding = PaddingMode.ISO10126;
                CryptoStream cs = new CryptoStream(fsCrypt,
                    RMCrypto.CreateDecryptor(key, IV),
                    CryptoStreamMode.Read);

                FileStream fsOut = new FileStream(outputFile, FileMode.Create);
                cs.Flush();
                int data;
                while ((data = cs.ReadByte()) != -1)
                    fsOut.WriteByte((byte)data);

                fsOut.Close();
                cs.Close();
                fsCrypt.Close();
                Console.WriteLine("Decryption Succeeded !");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Decryption failed! Error");
                Console.WriteLine("Do you Want to see the error message ? (y/n)");
                string Response = Console.ReadLine();
                if (Response == "y" || Response == "Y")
                {
                    Console.WriteLine(ex.Message +"at line :" + ex.StackTrace);
                    Console.ReadLine();
                    Application.Exit();
                }
                else
                {
                    Application.Exit();
                }
            }
        }
...