шифрование с использованием System.Security.Cryptography с использованием класса DES c # - PullRequest
0 голосов
/ 25 октября 2011

Я пытался зашифровать строку с помощью System.Security.Cryptography.DES, но обнаружил, что при каждом запуске программы результат шифрования менялся! Я не знаю, как получить один и тот же результат при каждом запуске приложения? Есть ли постоянный ключ или что-то еще, чтобы добавить тот же результат? Я хочу, когда я ввожу "Google" в этом коде

byte[] plaintextBytes = (new UnicodeEncoding()).GetBytes(expireddate);
            SymmetricAlgorithm sa = DES.Create();
            MemoryStream msEncrypt = new MemoryStream();
            CryptoStream csEncrypt = new CryptoStream(msEncrypt, sa.CreateEncryptor(), CryptoStreamMode.Write);
            csEncrypt.Write(plaintextBytes, 0, plaintextBytes.Length);
            csEncrypt.Close();
            byte[] encryptedTextBytes = msEncrypt.ToArray();

получить "google" из этого кода, когда я введу результат массива байтов в следующий раз, когда я открою приложение?

MemoryStream msDecrypt = new MemoryStream(decodedlistbyte.ToArray());
            CryptoStream csDecrypt = new CryptoStream(msDecrypt, sa.CreateDecryptor(), CryptoStreamMode.Read);
            byte[] decryptedTextBytes = new Byte[decodedlistbyte.Count];
            csDecrypt.Read(decryptedTextBytes, 0, decodedlistbyte.Count);
            csDecrypt.Close();
            msDecrypt.Close();
            string decrypteddate = (new UnicodeEncoding()).GetString(decryptedTextBytes);

Ответы [ 4 ]

2 голосов
/ 25 октября 2011

Вы генерируете криптографически безопасный IV (вектор инициализации) каждый раз, когда повторно шифруете простой текст - это хорошо, и значение должно меняться каждый раз. IV может быть общедоступным и никоим образом не должен относиться к ключу шифрования.

Однако Des больше не является очень безопасным алгоритмом, и я бы порекомендовал перейти на Rijndael или tripple des.

0 голосов
/ 25 октября 2011

Ваша проблема не в том, что он шифрует текст иначе. Это на самом деле важное свойство схемы шифрования.

Ваша проблема либо в том, что вы повторно используете один и тот же объект симметричного алгоритма без сброса его состояния, либо - что более вероятно, но я не могу сказать из фрагмента, - реинтеграции симметричного алгоритма с другим ключом и iv.

Для дешифрования создайте новый симметричный алгоритм, а затем установите sa.Key и sa.IV в качестве значений, используемых в зашифрованном вами. Важно, убедитесь, что вы надежно храните ключ и убедитесь, что ваш IV случайный (вам нужно будет включить его в данные, которые вы храните). Не жестко закодируйте IV. Это совершенно небезопасно .

Кстати, DES довольно небезопасен (я мог опробовать все возможные ключи примерно 3 дня 10 лет назад). Используйте AESManaged. Кроме того, шифрование сложно, и я не рекомендую делать это самостоятельно. Если вы хотите, рассмотрите этот , он выполняет большую часть того, что вы хотите, и немного больше.

0 голосов
/ 25 октября 2011

Как @Ross сказал, что зашифрованная строка будет отличаться, потому что новый IV должен * каждый раз использоваться .

Однако в текущем коде каждый раз используются новые клавиши и IV . Если вы хотите иметь возможность расшифровывать на другом компьютере, то вам следует установить Ключ и IV самостоятельно - или сохранить тот, который автоматически создается при шифровании.

например. при шифровании

byte[] key = sa.Key;
byte[] iv = sa.IV;
ICryptoTransform ct = sa.CreateEncryptor ();

например. во время расшифровки (на другом компьютере)

ICryptoTransform ct = sa.CreateDecryptor (key, iv);

Вы можете передавать IV с зашифрованными данными. секретный ключ должен, конечно, передаваться / совместно использоваться вне диапазона.

0 голосов
/ 25 октября 2011

Я рекомендую вам использовать алгоритм строгого симметричного ключа, такой как AES (т.е. Rijndael).Взгляните на класс RijndaelManaged в .NET.Один и тот же ключ можно использовать для шифрования и дешифрования, поэтому это симметричный алгоритм.Безопасность ключа крайне важна, поэтому держите его в секрете и надежно храните.

...