powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
9 сообщений из 9, страница 1 из 1
ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
    #39545909
__Pavel__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго!

Мистера pation'а прошу не читать этот пост, а то у него будет извержение. Всем остальным приятного использования!

Выкладываю класс для криптографических операций, который позволяет:
1. шифровать/дешифровать текст
2. шифровать/дешифровать объект с бинарной сериализацией
3. шифровать/дешифровать файл

Всё остальное смотрите в примере!

пример
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
            string EncriptText, Result; //переменные для примера
            TestClass TestClass; //тестовый объект для сериализации
            Cryptography CRY; //класс для криптографических операций

            //Минимальная инициализация класса шифрования с заданием ключа (пароля)
            CRY = new Cryptography("Password");

            //Шифрование/дешифрование текста
            EncriptText = CRY.EncryptText("TestText");
            Result = CRY.DecryptText(EncriptText);

            //Шифрование/дешифрование объекта с бинарной сериализацией
            //П.С. объект должен быть с тегом [Serializable]
            CRY.SerializeAndEncrypt(new TestClass(), @"C:\test.bin");
            TestClass = CRY.DeSerializeAndDecrypt<TestClass>(@"C:\test.bin");

            //Шифрование/дешифрование файла
            //все операции производятся в потоковом режиме этим достигается высокая скорость
            //и малое потребление памяти
            CRY.EncryptFile(@"C:\test.bin", @"C:\test.bin");
            CRY.DecryptFile(@"C:\test.bin", @"C:\test.bin");

            //ДОПОЛНИТЕЛЬНО
            //Данный класс поддерживает использование неограниченного количества ключей одновременно.
            //При вызове метода шифрования/дешифрования они смешиваются и образуют один ключ
            CRY = new Cryptography(new string[] { "Password_1", "Password_2", "Password_n" });

            //Все ключи в классе между его инициализацией и использованием
            //методов шифрование/дешифрования хранятся в шифрованном виде,
            //для этого используется SessionKey, который можно задать при инициализации класса
            //сразу после ключа
            CRY = new Cryptography("Password", "SessionKey");

            //Если задать SessionKey при инициализации класса, то его нужно вводить при
            //каждом вызове метода шифрования/дешифрования
            CRY = new Cryptography("Password", "SessionKey");
            Result = CRY.EncryptText("TestText", SessionKey: "SessionKey");

            //Если SessionKey при инициализации класса не был введен, то он
            //генерируется автоматически и ключи внутри класса все равно
            //хранятся в зашифрованном виде, а вот SessionKey нет, что
            //создает уязвимость, поэтому так делать не рекомендуется.
            //Но в данном случае его ввод при шифровании/дешифровании
            //не требуется

            //Также при вызове метода шифрования/дешифрования можно указать
            //секретный ключ, который добавится в стек ключей, хранящихся в классе,
            //но только на 1 раз, таким образом для каждого метода
            //можно изменять ключи на лету, не меняя ключи,
            //заданные при инициализации, например в следующем примере
            //получится 3 разных варианта
            CRY = new Cryptography("Password");
            Result = CRY.EncryptText("TestText");
            Result = CRY.EncryptText("TestText", SecretKey: "SecretKey_1");
            Result = CRY.EncryptText("TestText", SecretKey: "SecretKey_2");

            //и конечно же можно использовать быстрый вызов (я КЭП)
            Result = new Cryptography("Password").EncryptText("TestText");



класс для примера
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    [Serializable]
    public class TestClass
    {
        public Guid ID { get; set; }
        public string Name { get; set; }

        public TestClass()
        {
            ID = Guid.NewGuid();
            Name = "NewName";
        }
    }



Сразу предупрежу, что данный класс портировался с проекта 8-милетней давности с языка VB.NET и красоту я там не наводил (разве что чуть-чуть) + содержатся куски кода с MSDN и форумов
исходник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace ThisProject
{
    public class Cryptography
    {
        private string _AutoSessionKey = "";
        private bool _UseAutoSessionKey = false;
        private int _KeySize = 256;
        private bool _ExistKey = false;
        private List<string> _Keys = new List<string>();

        public Cryptography(string Key, string SessionKey = "")
        {
            SetKeys(new string[] { Key }, SessionKey);
        }

        public Cryptography(string[] Keys, string SessionKey = "")
        {
            SetKeys(Keys, SessionKey);
        }

        public Cryptography(List<string> Keys, string SessionKey = "")
        {
            SetKeys(Keys.ToArray(), SessionKey);
        }

        public void SetKeys(string[] Keys, string SessionKey)
        {
            if (Keys != null || Keys.Length != 0)
            {
                _Keys.Clear();
                if (SessionKey == "")
                {
                    _UseAutoSessionKey = true;
                    _AutoSessionKey = Gen(32);
                }
                else
                {
                    _UseAutoSessionKey = false;
                    _AutoSessionKey = "";
                }
                byte[] KEY = new byte[32];
                byte[] IV = new byte[32];
                GetSessionKEYandIV((_UseAutoSessionKey ? _AutoSessionKey : SessionKey), ref KEY, ref IV);
                foreach (string Line in Keys)
                {
                    _Keys.Add(EncryptKey(GetMd5Hash(Line), KEY, IV));
                }
                _ExistKey = true;
            }
        }

        public bool IsUseAutoSessionKey()
        {
            return _UseAutoSessionKey;
        }

        public int GetCountKeys()
        {
            return _Keys.Count;
        }

        public int GetKeySize()
        {
            return _KeySize;
        }

        public bool ExistKey()
        {
            return _ExistKey;
        }

        public void ClearKey()
        {
            _Keys.Clear();
            _ExistKey = false;
        }

        private void GetSessionKEYandIV(string SessionKey, ref byte[] Key, ref byte[] Iv)
        {
            SessionKey = GetMd5Hash(SessionKey);
            byte[] KEY = new byte[32];
            byte[] IV = new byte[32];
            for (int i = 0; i < 32; i++)
            {
                KEY[i] = Convert.ToByte(SessionKey[i]);
            }
            KEY.CopyTo(IV, 0);
            Array.Reverse(IV);
            Key = KEY;
            Array.Resize(ref IV, 16);
            Iv = IV;
        }

        private void GetKEYandIVforCRY(string SessionKey, ref byte[] Key, ref byte[] Iv, string SecretKey = "")
        {

            byte[] KEY = new byte[32];
            byte[] IV = new byte[16];
            GetSessionKEYandIV((_UseAutoSessionKey ? _AutoSessionKey : SessionKey), ref KEY, ref IV);
            string KeyLine = "";
            foreach (string Line in _Keys)
            {
                KeyLine += DecryptKey(Line, KEY, IV);
            }
            if (SecretKey != "")
                KeyLine += GetMd5Hash(SecretKey);
            KeyLine = GetMd5Hash(KeyLine);
            KEY = new byte[32];
            IV = new byte[32];
            for (int i = 0; i < 32; i++)
            {
                KEY[i] = Convert.ToByte(KeyLine[i]);
            }
            KEY.CopyTo(IV, 0);
            Array.Reverse(IV);
            Key = KEY;
            Array.Resize(ref IV, 16);
            Iv = IV;
        }

        private string GetMd5Hash(string Text)
        {
            MD5 MD5 = MD5.Create();
            byte[] Data = MD5.ComputeHash(Encoding.Default.GetBytes(Text));
            StringBuilder SB = new StringBuilder();
            for (int i = 0; i < Data.Length; i++)
            {
                SB.Append(Data[i].ToString("x2"));
            }
            return SB.ToString();
        }

        private string EncryptKey(string Text, byte[] Key, byte[] IV)
        {
            string NewText = null;
            foreach (byte Byte in EncryptStringToBytes_Aes(Text, _KeySize, Key, IV))
            {
                NewText += char.ConvertFromUtf32(Byte);
            }
            return NewText;
        }

        private string DecryptKey(string Text, byte[] Key, byte[] IV)
        {
            byte[] Bytes = new byte[Text.Length];
            for (int i = 0; i < Bytes.Length; i++)
            {
                Bytes[i] = (Byte)char.ConvertToUtf32(Text, i);
            }
            return DecryptStringFromBytes_Aes(Bytes, _KeySize, Key, IV);
        }

        private byte[] EncryptStringToBytes_Aes(string PlainText, int KeySize, byte[] Key, byte[] IV)
        {
            byte[] Encrypted;
            using (AesCryptoServiceProvider AES = new AesCryptoServiceProvider())
            {
                AES.KeySize = KeySize;
                AES.Key = Key;
                AES.IV = IV;
                ICryptoTransform encryptor = AES.CreateEncryptor(AES.Key, AES.IV);
                MemoryStream msEncrypt = new MemoryStream();
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(PlainText);
                    }
                    Encrypted = msEncrypt.ToArray();
                }
            }
            return Encrypted;
        }

        private string DecryptStringFromBytes_Aes(byte[] CipherText, int KeySize, byte[] Key, byte[] IV)
        {
            string PlainText = null;
            using (AesCryptoServiceProvider AES = new AesCryptoServiceProvider())
            {
                AES.KeySize = KeySize;
                AES.Key = Key;
                AES.IV = IV;
                ICryptoTransform decryptor = AES.CreateDecryptor(AES.Key, AES.IV);
                using (MemoryStream msDecrypt = new MemoryStream(CipherText))
                {
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {
                            PlainText = srDecrypt.ReadToEnd();
                        }
                    }
                }
            }
            return PlainText;
        }

        public string Gen(int CountSymbols, string Symbols = "1234567890ABCDEF")
        {
            string Result = "";
            Random Random = new Random(System.DateTime.Now.Millisecond);
            for (int sch = 1; sch <= CountSymbols; sch++)
            {
                Result += Symbols[Random.Next(0, Symbols.Length - 1)];
            }
            return Result;
        }

        public string EncryptText(string Text, string SessionKey = "", string SecretKey = "")
        {
            if (_ExistKey == false)
                throw new Exception("keys not installed");

            if (_UseAutoSessionKey == false && SessionKey == "")
                throw new Exception("SessionKey not entered");

            byte[] KEY = new byte[32];
            byte[] IV = new byte[16];
            GetKEYandIVforCRY((_UseAutoSessionKey ? _AutoSessionKey : SessionKey), ref KEY, ref IV, SecretKey);

            string NewText = null;
            foreach (byte Byte in EncryptStringToBytes_Aes(Text, _KeySize, KEY, IV))
            {
                NewText += char.ConvertFromUtf32(Byte);
            }
            return NewText;
        }

        public string DecryptText(string Text, string SessionKey = "", string SecretKey = "")
        {
            if (_ExistKey == false)
                throw new Exception("keys not installed");

            if (_UseAutoSessionKey == false && SessionKey == "")
                throw new Exception("SessionKey not entered");

            byte[] KEY = new byte[32];
            byte[] IV = new byte[16];
            GetKEYandIVforCRY((_UseAutoSessionKey ? _AutoSessionKey : SessionKey), ref KEY, ref IV, SecretKey);

            byte[] Bytes = new byte[Text.Length];
            for (int i = 0; i < Bytes.Length; i++)
            {
                Bytes[i] = (Byte)char.ConvertToUtf32(Text, i);
            }
            return DecryptStringFromBytes_Aes(Bytes, _KeySize, KEY, IV);
        }

        public void SerializeAndEncrypt(object Object, string Path, string SessionKey = "", string SecretKey = "")
        {
            if (_ExistKey == false)
                throw new Exception("keys not installed");

            if (_UseAutoSessionKey == false && SessionKey == "")
                throw new Exception("SessionKey not entered");

            byte[] KEY = new byte[32];
            byte[] IV = new byte[16];
            GetKEYandIVforCRY((_UseAutoSessionKey ? _AutoSessionKey : SessionKey), ref KEY, ref IV, SecretKey);
            using (RijndaelManaged RM = new RijndaelManaged())
            {
                RM.KeySize = _KeySize;
                RM.Key = KEY;
                RM.IV = IV;
                if (File.Exists(Path)) File.Delete(Path);

                using (FileStream FS = new FileStream(Path, FileMode.OpenOrCreate))
                {
                    using (CryptoStream CS = new CryptoStream(FS, RM.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter BW = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                        BW.Serialize(CS, Object);
                    }
                }
            }
        }

        public Type DeSerializeAndDecrypt<Type>(string Path, string SessionKey = "", string SecretKey = "")
        {
            if (_ExistKey == false)
                throw new Exception("keys not installed");

            if (_UseAutoSessionKey == false && SessionKey == "")
                throw new Exception("SessionKey not entered");

            byte[] KEY = new byte[32];
            byte[] IV = new byte[16];
            GetKEYandIVforCRY((_UseAutoSessionKey ? _AutoSessionKey : SessionKey), ref KEY, ref IV, SecretKey);
            using (RijndaelManaged RM = new RijndaelManaged())
            {
                RM.KeySize = _KeySize;
                RM.Key = KEY;
                RM.IV = IV;
                using (FileStream FS = new FileStream(Path, FileMode.Open))
                {
                    using (CryptoStream CS = new CryptoStream(FS, RM.CreateDecryptor(), CryptoStreamMode.Read))
                    {
                        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter BW = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                        return (Type)BW.Deserialize(CS);
                    }
                }
            }
        }

        public void EncryptFile(string OldPath, string NewPath, string SessionKey = "", string SecretKey = "")
        {
            if (_ExistKey == false)
                throw new Exception("keys not installed");

            if (_UseAutoSessionKey == false && SessionKey == "")
                throw new Exception("SessionKey not entered");

            if (File.Exists(OldPath) == false)
                throw new Exception("File not found");

            bool TimePath = false;
            if (OldPath != NewPath)
            {
                if (File.Exists(NewPath))
                    File.Delete(NewPath);
            }
            else
            {
                TimePath = true;
                NewPath += ".tf";
            }

            byte[] Buffer = new byte[2048];
            int CountRead = 0;
            byte[] KEY = new byte[32];
            byte[] IV = new byte[16];
            GetKEYandIVforCRY((_UseAutoSessionKey ? _AutoSessionKey : SessionKey), ref KEY, ref IV, SecretKey);
            using (RijndaelManaged RM = new RijndaelManaged())
            {
                RM.KeySize = _KeySize;
                RM.Key = KEY;
                RM.IV = IV;
                using (FileStream FS1 = new FileStream(OldPath, FileMode.Open))
                {
                    using (FileStream FS2 = new FileStream(NewPath, FileMode.OpenOrCreate))
                    {
                        using (CryptoStream CS1 = new CryptoStream(FS2, RM.CreateEncryptor(), CryptoStreamMode.Write))
                        {
                            do
                            {
                                CountRead = FS1.Read(Buffer, 0, 2048);
                                CS1.Write(Buffer, 0, CountRead);
                            } while (CountRead != 0);
                            CS1.Flush();
                        }
                    }
                }
            }
            if (TimePath == true)
            {
                File.Delete(OldPath);
                File.Move(NewPath, OldPath);
            }
        }

        public void DecryptFile(string OldPath, string NewPath, string SessionKey = "", string SecretKey = "")
        {
            if (_ExistKey == false)
                throw new Exception("keys not installed");

            if (_UseAutoSessionKey == false && SessionKey == "")
                throw new Exception("SessionKey not entered");

            if (File.Exists(OldPath) == false)
                throw new Exception("File not found");

            bool TimePath = false;
            if (OldPath != NewPath)
            {
                if (File.Exists(NewPath))
                    File.Delete(NewPath);
            }
            else
            {
                TimePath = true;
                NewPath += ".tf";
            }
            byte[] Buffer = new byte[2048];
            int CountRead = 0;
            byte[] KEY = new byte[32];
            byte[] IV = new byte[16];
            GetKEYandIVforCRY((_UseAutoSessionKey ? _AutoSessionKey : SessionKey), ref KEY, ref IV, SecretKey);
            using (RijndaelManaged RM = new RijndaelManaged())
            {
                RM.KeySize = _KeySize;
                RM.Key = KEY;
                RM.IV = IV;
                using (FileStream FS1 = new FileStream(OldPath, FileMode.Open))
                {
                    using (FileStream FS2 = new FileStream(NewPath, FileMode.OpenOrCreate))
                    {
                        using (CryptoStream CS1 = new CryptoStream(FS1, RM.CreateDecryptor(), CryptoStreamMode.Read))
                        {
                            do
                            {
                                CountRead = CS1.Read(Buffer, 0, 2048);
                                FS2.Write(Buffer, 0, CountRead);
                            } while (CountRead != 0);
                            FS2.Flush();
                        }
                    }
                }
            }
            if (TimePath == true)
            {
                File.Delete(OldPath);
                File.Move(NewPath, OldPath);
            }
        }
    }
}



Если вам понравился класс и вы его дополнили и сделали лучше, то скиньте мне на почту pavel_61981@mail.ru, вдруг пригодится ;)
...
Рейтинг: 0 / 0
ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
    #39546223
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__,
кому, простите, нужна Ваша говнонадстройка над CryptoStream?
Код без использования Вашего "модуля" получается компактнее и удобнее для чтения, чем с ним.
Реализуйте несколько наследников от SymmetricAlgorithm что-ли, в .NET реализовано довольно мало из популярных.
Тогда можно будет говорить о какой-то пользе от Вашего кода.
...
Рейтинг: 0 / 0
ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
    #39546259
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С дуба рухнули, что ли - пароль в ключ переводить через MD5-хэш? MD5 давно уже ненадежен, и такие ключи компрометируются на раз. Откройте для себя стандарт PBKDF2 , и реализующий его класс Rfc2898DeriveBytes
...
Рейтинг: 0 / 0
ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
    #39546263
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныС дуба рухнули, что ли - пароль в ключ переводить через MD5-хэш? MD5 давно уже ненадежен, и такие ключи компрометируются на раз. Откройте для себя стандарт PBKDF2 , и реализующий его класс Rfc2898DeriveBytes Написано же, что реализация старая, может есть какие то ограничения связанные с MD5, лично я использую SHA256-512 и не парюсь. А так любой алгоритм хеширования можно компрометировать, просто у MD5 маленькая размерность и куча rainbow баз
...
Рейтинг: 0 / 0
ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
    #39546266
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__Мистера pation'а прошу не читать этот постсписок персон нон-грата будет пополнен
...
Рейтинг: 0 / 0
ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
    #39546281
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesможет есть какие то ограничения связанные с MD5, лично я использую SHA256-512
Roman MejtesА так любой алгоритм хеширования можно компрометировать
Алгоритмы хэширования не предназначены для получения ключа шифрования. От слова "совсем". Они только могут принимать в этой операции опосредованное участие. Причины - ну, хотя бы высокая скорость алгоритмов хэширования, в разы повышающая количество попыток брутфорса в единицу времени (а в PBKDF2 специально внесены замедляющие генерацию алгоритмы - по первой ссылке выше об этом написано). Плюс дополнительная энтропия как параметр метода, плюс количество задаваемых итераций генерации - всё это сказывается на криптостойкости ключа. И при этом, надо заметить, использовать Rfc2898DeriveBytes ничуть не сложнее, чем считать хэшсумму.
Roman Mejtesи не парюсь
Может, ну тогда нафиг этот AES? Использовать ROT-13, и не париться?
...
Рейтинг: 0 / 0
ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
    #39546638
__Pavel__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код без использования Вашего "модуля" получается компактнее и удобнее для чтения, чем с ним.

У вас что-то со зрением.

С дуба рухнули, что ли - пароль в ключ переводить через MD5-хэш?

Данный недочет исправляется в считанные секунды-минуты. На тот момент мне нужно было получить сгенерированую строку на 32 символа из любой строки, он с этим справлялся.


П.С. идите лесом, п**деть не мешки ворочать! Если надстройка вам не нравится, то напишите лучше и выложите, т.к. их нет, всю инфу нужно искать по кускам! Для тех кому не нужна супер надежность (хотя мне кажется она здесь на высоком уровне, кроме MD5), но нужно незапариваясь в одну строку кода шифровать данные, она очень даже сойдет.
...
Рейтинг: 0 / 0
ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
    #39546777
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__напишите лучше и выложите
Зачем? Когда нужно что-то зашифровать - пишется типовой код в десяток строк на основе стандартных классов. Таскать по всем проектам ради этого класс считаю нецелесообразным.
__Pavel__т.к. их нет, всю инфу нужно искать по кускам!
https://www.google.ru/search?q=AesCryptoServiceProvider -> по первой же ссылке в выдаче попадаем в справку по классу - там есть всё, что нужно знать для использования класса (если не углубляться в нюансы использования различных CipherMode и режимов Padding, а в случае RijndaelManaged еще и FeedbackSize - но в классе выше этого всего нет).
...
Рейтинг: 0 / 0
ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
    #39546805
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__Код без использования Вашего "модуля" получается компактнее и удобнее для чтения, чем с ним.

У вас что-то со зрением.



Т.е. пример из сообщения выше 20919732 Вас не убеждает?
Про стойкость алгоритма я не говорю, а то, что "данный класс портировался с проекта 8-милетней давности с языка VB.NET" ни разу не аргумент, если Вы выкладываете поделку на всеобщее обозрение.
Для сериализации и записи в файл никакие "дополнительные классы" не нужны, в .NET это делается очень удобно и компактно.
Если ты (это я обобщаю, а не про Вас лично говорю) этого не умеешь, то программирование - это явно не твое.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ГОТОВЫЙ класс для криптографических операций (текст, объекты, файлы)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]