Как зашифровать Сохранить файлы без использования ключа? [закрыто]

21

Скажем, я сделал простую программу, которая принимает файл .dat, зашифрованный в двоичном формате , затем расшифровываю его в байтовый массив, а затем все снова переписывается в расшифрованный файл.

Например:

Я сделал алгоритм двоичного шифрования. => 0100100001100101001000000110100001100101011000 ...

Но это очень очень легко расшифровать ...

Есть ли способ, что, если это возможно, не нужно никакого ключа, чтобы зашифровать мой прогресс сохранения?

Даниэль Бежар
источник
15
Вы уверены, что хотите зашифровать сохранения? Существуют более простые способы обмана, например, при использовании модификации памяти. Я бы просто сжал их с помощью zlib (поместил их в .gz), это уменьшило бы размер и предотвратило бы модификацию некоторых возможных читеров.
HolyBlackCat
36
Nitpicking: То, что вы делаете, это кодировка , а не шифрование .
Филипп
13
(при условии, что это для одиночной игры) Не пытайтесь предотвратить мошенничество в однопользовательской игре, это раздражает как для вас, так и для игрока. И в конечном итоге бесполезно.
6
Это не возможно , чтобы зашифровать файлы сохранения , так что пользователь не может читать или изменять их. (Потому что, например, они могут просто приостановить вашу игру в отладчике сразу после того, как он выполнит расшифровку!). Однако вы можете сделать это сложнее (потому что открыть простой текстовый файл действительно легко по сравнению с поиском подходящего момента, чтобы приостановить игру в отладчике). Это то, что вы пытаетесь сделать?
user253751
6
@DanielBejar Я только что сказал вам, вы не можете сделать это невозможным, вы можете только сделать это сложнее.
user253751

Ответы:

77

В общем, вы никогда не должны изобретать свои собственные криптографические алгоритмы, если у вас есть хотя бы докторская степень в области математики и информатики. Но есть много хороших стандартных алгоритмов, которые не имеют известных атак и имеют бесплатные реализации на многих языках программирования. Например RC5, AES или Blowfish. В зависимости от того, какую технологию вы используете для разработки своей игры, она может даже предложить безопасное шифрование "из коробки".

Однако вопрос в том, является ли шифрование savegames хорошей идеей.

Во-первых, когда ваш исполняемый файл игры выполняет шифрование и дешифрование, вы должны включить как алгоритм, так и ключ в свой исполняемый файл игры. Это означает, что решительный хакер может найти их, извлечь их и использовать их для создания редактора сохраненных игр. Так что это никогда не может быть на 100% безопасно.

Во-вторых, почему вы все равно хотите это сделать? Когда это онлайн-игра, вы должны хранить состояние игры онлайн, где игроки не могут ее изменить. Когда это оффлайн игра, то зачем? Мошенник может только навредить своему игровому опыту в худшем случае. Честные игроки, которые хотят получать удовольствие от вашей игры, не будут затронуты этим. С другой стороны, возможность обмана игроков может повысить ценность вашей игры. Это позволяет игрокам испытать игру по-другому, что может просто увеличить их долгосрочное удовольствие от вашей игры.

Philipp
источник
5
Хотя я не могу представить, чтобы кто-то придумал что-то хорошее через несколько часов. И вы будете тратить ресурсы на то, что вам, вероятно, не нужно.
Aistis
6
«Когда это оффлайн игра, то зачем?» Что если это однопользовательская игра с рекордами онлайн?
Парень в шляпе
19
«позволение игрокам обманывать может повысить ценность вашей игры», - проголосовал за это утверждение. Я действительно раздражен играми, которые решают заблокировать часть опыта, за который я заплатил, пока я не достигну определенного уровня мастерства, и я рад, что в этих случаях есть читы, чтобы разблокировать полную игру. Например, я полностью потерялся в гоночных турнирах против искусственного интеллекта в старых частях Need for Speed ; для меня удовольствие было, скорее, проезжать через разнообразные ландшафты, поэтому я обычно пропускаю гонки и открываю все карты и автомобили. Игра, которая предотвращает это, будет просто раздражать меня.
ИЛИ Mapper
6
Я хотел бы, «если у вас есть хотя бы докторская степень по математике и информатике», переписанная как «если вы не обладаете хотя бы знаниями, которые потребуются для получения степени доктора математических и компьютерных наук» (и даже тогда, по крайней мере в Германии курсы часто полны материала, не связанного с криптографией). Никто по своей сути не нуждается в степени, чтобы превзойти кандидатов наук.
Френель
5
@phresnel Хотя вы технически правы, докторская степень - это стандартная метрика владения теоретическим предметом, присуждаемая доверенными учреждениями. Поэтому имеет смысл использовать его как сокращение количества знаний и навыков, необходимых для получения степени доктора философии. Другими словами: то, что имел в виду ФП, достаточно ясно :-)
Tobia
10

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

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

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

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

Питер - Унбан Роберт Харви
источник
Ваше второе замечание приятно. Это также может помочь отследить проблемы в случае повреждения файла.
Knowledge_is_power
4

Сохраните преобразованный SHA256-хеш фактических данных сохранения в файле сохранения.

Сравните сохраненный хеш со значением SHA256 данных при загрузке.

Если это не соответствует, они обманули или испортили файл.

Изменить , чтобы уточнить: это делает его более трудным взломать античит систему , но все - таки возможно .

Lolums
источник
7
Ничто не мешает людям пересчитать хэш после внесения изменений. Кроме того, я не понимаю, почему все еще есть люди, которые защищают сломанный алгоритм MD5 со всеми его известными криптографическими недостатками, когда есть намного лучшие альтернативы, такие как SHA-256 (для подписей) или bcrypt (для паролей).
Филипп
1
Просто, быстро и полностью сломано.
DeadMG
2
@DeadMG Это неработоспособно, потому что у пользователя есть доступ к двоичным файлам, которые должны содержать ключ. Использование более сильного хэша или шифрование файла чем-то вроде AES было бы пустой тратой ресурсов и плохим дизайном, потому что это не обеспечивает дополнительной безопасности , но увеличивает стоимость. +1 потому что пониженное голосование не заслужено.
Питер - Унбан Роберт Харви
7
@ Филипп, потому что в этом случае MD5 явно превосходит SHA-256. Для описанного подхода требуется дешевый алгоритм контрольной суммы, который в точности соответствует MD5.
Питер - Унбан Роберт Харви
3
@ transistor09 если это чисто клиентская сторона, мы ничего не можем гарантировать, и контрольная сумма работает так же, как если бы клиент шифровал все это. В любом случае, это может быть взломано.
Lolums
1

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

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

Имеет ли все это экономический смысл - это совсем другая тема.

Тобия
источник
Я не знаю ... усложнять игру просто ... но спасибо за помощь! Я буду стараться изо всех сил!
Даниэль Бежар