Я ищу очень простую функцию обфускации (например, шифрование и дешифрование, но не обязательно безопасную) для некоторых данных. Это не важно для миссии. Мне нужно что-то, чтобы честные люди были честными, но что-то немного сильнее, чем ROT13 или Base64 .
Я бы предпочел что-то, что уже включено в .NET Framework 2.0, поэтому мне не нужно беспокоиться о каких-либо внешних зависимостях.
Я действительно не хочу возиться с открытыми / закрытыми ключами и т. Д. Я не знаю много о шифровании, но я знаю достаточно, чтобы знать, что все, что я написал, будет бесполезным ... На самом деле, Я бы, наверное, облажался с математикой и сделал бы ее тривиальной.
c#
obfuscation
Мэтт Доуди
источник
источник
Ответы:
Другие ответы здесь работают нормально, но AES - более безопасный и современный алгоритм шифрования. Это класс, который я приобрел несколько лет назад для выполнения шифрования AES и который со временем изменил, чтобы сделать его более удобным для веб-приложений (например, я создал методы Encrypt / Decrypt, которые работают со строкой, удобной для URL). У этого также есть методы, которые работают с байтовыми массивами.
ПРИМЕЧАНИЕ: вы должны использовать разные значения в массивах Key (32 байта) и Vector (16 байтов)! Вы не хотели бы, чтобы кто-то выяснил ваши ключи, просто предполагая, что вы использовали этот код как есть! Все, что вам нужно сделать, это изменить некоторые числа (должно быть <= 255) в массивах Key и Vector (я оставил одно недопустимое значение в массиве Vector, чтобы убедиться, что вы делаете это ...). Вы можете использовать https://www.random.org/bytes/, чтобы легко создать новый набор:
Key
Vector
Использовать его легко: просто создайте экземпляр класса и затем вызовите (обычно) EncryptToString (строка StringToEncrypt) и DecryptString (строка StringToDecrypt) в качестве методов. Это не может быть проще (или более безопасно), если у вас есть этот класс на месте.
источник
Я очистил SimpleAES (выше) для моего использования. Исправлены запутанные методы шифрования / дешифрования; отдельные методы для кодирования байтовых буферов, строк и строк, удобных для URL; Использовал существующие библиотеки для кодирования URL.
Код маленький, проще, быстрее, а вывод более лаконичен. Например,
johnsmith@gmail.com
производит:Код:
источник
Да, добавить
System.Security
сборку, импортироватьSystem.Security.Cryptography
пространство имен. Вот простой пример симметричного (DES) алгоритма шифрования:источник
Просто подумал, что добавлю, что я улучшил SimplerAES Mud, добавив случайный IV, который передается обратно в зашифрованную строку. Это улучшает шифрование, поскольку шифрование одной и той же строки каждый раз приводит к разным выводам.
И бонусный юнит тест
источник
System.Random
качестве RNG. 2) Это полностью сломано против атак с использованием выбранного шифротекста (в частности, оракуловВариант оценки (отличный) ответ
Надеюсь это поможет
источник
[РЕДАКТИРОВАТЬ] Годы спустя, я вернулся, чтобы сказать: не делай этого! Посмотрите, что не так с шифрованием XOR? для деталей.
Очень простым, легким двусторонним шифрованием является шифрование XOR.
mypass
.mypassmypassmypass...
)mypassmypassmypass...
).источник
Я объединил то, что нашел лучшее из нескольких ответов и комментариев.
Код:
Обновление 2015-07-18: исправлена ошибка в приватном методе Encrypt () по комментариям @bpsilver и @Evereq. IV был случайно зашифрован, теперь добавляется в виде открытого текста, как и ожидалось Decrypt ().
источник
return _encryptor.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
byte [] inputBuffer = _encryptor.TransformFinalBlock(buffer, 0, buffer.Length); return _rijndael.IV.Concat(inputBuffer).ToArray();
Если вы просто хотите простое шифрование (т. Е. Возможно, что определенный взломщик может сломаться, но блокирует большинство случайных пользователей), просто выберите две парольные фразы одинаковой длины, скажем:
и зашифруйте свои данные с ними обоими (зацикливая пароли при необходимости) (а) . Например:
Кто-то, кто ищет ваш двоичный файл, может подумать, что строка ДНК является ключом, но вряд ли он подумает, что код C - это что-то кроме неинициализированной памяти, сохраненной вместе с вашим двоичным файлом.
(a) Имейте в виду, что это очень простое шифрование и, по некоторым определениям, оно может вообще не считаться шифрованием (поскольку цель шифрования - предотвратить несанкционированный доступ, а не просто сделать его более сложным). Хотя, конечно, даже самое надежное шифрование небезопасно, когда кто-то стоит над держателями ключей со стальной трубой.
Как указывалось в первом предложении, это означает, что случайному злоумышленнику будет достаточно сложно двигаться дальше. Это похоже на предотвращение краж со взломом в вашем доме - вам не нужно делать его неуязвимым, вам просто нужно сделать его менее беременным, чем дом по соседству :-)
источник
Шифрование легко: как отмечали другие, в пространстве имен System.Security.Cryptography есть классы, которые делают всю работу за вас. Используйте их, а не любое домашнее решение.
Но расшифровка тоже проста. У вас проблема не в алгоритме шифрования, а в защите доступа к ключу, используемому для расшифровки.
Я бы использовал одно из следующих решений:
DPAPI с использованием класса ProtectedData с областью действия CurrentUser. Это легко, так как вам не нужно беспокоиться о ключе. Данные могут быть расшифрованы только одним и тем же пользователем, поэтому нет смысла делиться данными между пользователями или машинами.
DPAPI с использованием класса ProtectedData с областью действия LocalMachine. Подходит, например, для защиты данных конфигурации на одном безопасном сервере. Но любой, кто может войти в систему, может зашифровать ее, так что ничего страшного, если сервер не защищен.
Любой симметричный алгоритм. Обычно я использую статический метод SymmetricAlgorithm.Create (), если мне все равно, какой алгоритм используется (на самом деле это Rijndael по умолчанию). В этом случае вам нужно как-то защитить свой ключ. Например, вы можете каким-то образом запутать его и спрятать в своем коде. Но имейте в виду, что любой, кто достаточно умен, чтобы декомпилировать ваш код, вероятно, сможет найти ключ.
источник
Я хотел опубликовать свое решение, поскольку ни одно из вышеперечисленных решений не было так просто, как мое. Дайте мне знать, что вы думаете:
Необязательный
Это предполагает, что MachineKey сервера, используемого для шифрования значения, совпадает с тем, который использовался для дешифрования значения. При желании вы можете указать статический MachineKey в файле Web.config, чтобы ваше приложение могло расшифровывать / шифровать данные независимо от того, где они выполняются (например, разработка или производственный сервер). Вы можете создать статический машинный ключ, следуя этим инструкциям .
источник
Пространство имен
System.Security.Cryptography
содержитTripleDESCryptoServiceProvider
иRijndaelManaged
классыНе забудьте добавить ссылку на
System.Security
сборку.источник
Использование TripleDESCryptoServiceProvider в System.Security.Cryptography :
источник
Я изменил это :
к этому:
источник
Используя встроенную библиотеку криптографии .Net, этот пример показывает, как использовать Advanced Encryption Standard (AES).
источник
Я знаю, что вы сказали, что вас не волнует, насколько это безопасно, но если вы выбрали DES, вы могли бы также использовать AES, это более современный метод шифрования.
источник
Я использовал принятый ответ Марка Бриттингема, и он мне очень помог. Недавно мне пришлось отправить зашифрованный текст в другую организацию, и здесь возникли некоторые проблемы. ОП не требует этих опций, но так как это популярный вопрос, я публикую свою модификацию (
Encrypt
иDecrypt
функции заимствованы здесь ):RijndaelManaged
значений и значений свойств (на основе взаимного соглашения между сторонами, шифрующими и дешифрующими)Вот класс (тестовый образец в конце):
а также..
Вот тестовый образец:
источник
Я думаю, что это самый простой в мире!
Тестовое задание
источник