Как хранить ключ шифрования в сейфе (C ++)?

Я хочу использовать xxtea для шифрования / дешифрования данных в моей игре.

Вот пример использования библиотеки:

#include <stdio.h>
#include <string.h>
#include <xxtea.h>

int main() {
const char *text = "Hello World! 你好,中国!";
const char *key = "1234567890";
size_t len;
unsigned char *encrypt_data = xxtea_encrypt(text, strlen(text), key, &len);
char *decrypt_data = xxtea_decrypt(encrypt_data, len, key, &len);
if (strncmp(text, decrypt_data, len) == 0) {
printf("success!\n");
}
else {
printf("fail!\n");
}
free(encrypt_data);
free(decrypt_data);
return 0;
}

Как сохранить сам ключ в безопасности тогда?

0

Решение

Как отмечает @ArtjomB, вы сохраните ключ в безопасности, не вставляя его в свою программу. Во время запуска ключ должен предоставить авторизованный пользователь или устройство безопасности.

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

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

Если вы думаете «хорошо, что я могу собрать во второй половине дня, что остановит лодыжки?» делать все, что приходит на ум. XOR это с другим жестко закодированным значением. Может быть, сдвиг или что-то еще. Это не очень поможет против тех, кто заботится, но остановит самого случайного злоумышленника, и по крайней мере вы не потратите на это кучу времени и денег.

Отступая от этого, посмотрите на встроенные решения вашей платформы. Помощь ОС — большая помощь. В частности, посмотрите на Услуги SLP на винде. Mac обеспечивает принудительное лицензирование, если вы работаете через Mac App Store. Или вы можете посмотреть на коммерческих поставщиков, таких как eSellerate, у которых есть собственные проприетарные решения. SafeNet имеет несколько продуктов. Конечно, все они могут быть (и регулярно) побеждены. Но они намного сильнее, чем вы собираетесь развивать в течение нескольких дней.

Любой конкретный подход, который вы используете в StackOverflow, по определению будет бесполезен. Единственное, что запутывает, это то, что его детали являются секретными. Если вы знаете, как это работает, то вы можете победить. Вот что отличает его от шифрования. Хорошее шифрование должно быть таким же надежным, даже если злоумышленник знает весь алгоритм. Вот почему методы запутывания являются частной собственностью. Они в значительной степени должны быть. Это означает, что вы либо собираетесь (а) быстро создать паршивого, (б) потратить много времени и денег на создание чуть менее паршивого, либо (в) потратить гораздо больше денег, чтобы получить несколько — Сносно от продавца, который специализируется на этих вещах.

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

5

Другие решения

Это не может быть сделано. В большинстве случаев вы можете манипулировать ключом, разбивать слова, разбивать, смешивать, сдвигать биты, xor и т. Д. И т. Д., Чтобы сделать его сложнее. Но ничто не может помешать очень мотивированному хакеру взломать ваш код и получить ключ.

Лучшее решение для этого случая называется криптографией White Box:
https://en.wikipedia.org/wiki/Obfuscation#White_box_cryptography

Идея заключается в том, чтобы генерировать двоичный код, персонализированный для вашего шифрования, который заменяет вашу функцию decrypt(cypher, key) от whitebox_decrypt(cypher) оба возвращают один и тот же результат. Вторая функция whitebox_decrypt НЕ содержит сам ключ, а персонализированный алгоритм, который дает тот же результат, что и исходная функция дешифрования. Опять же: ЭТО МОЖЕТ БЫТЬ ОБРАТНЫМ ИНЖЕНЕРОМ, как и все, но это настолько тяжело, что действительно никого не мотивирует делать это.

Тем не менее, это то, что обычно очень дорого. Я не знаю ничего хорошего бесплатно. Это очень используется для защиты контента DRM.

2

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

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

Таким образом, пока ваш ключ сохраняется в зашифрованном виде, вы не боитесь, что кто-то узнает, что это такое.

1

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

Хранение секрета в программе — это то же самое, что записать его на листе бумаги, который вы затем отправляете по факсу всем в мире.

То есть Это больше не секрет.

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

1

Лучшее запутывание — вычислить ключ во время выполнения. Например. Вы можете рассчитать SHA1 или MD5 по системной строке, например «Нажать любую клавишу …» или «Ошибка загрузки файла». Затем используйте хеш в качестве ключа XXTEA.

1
По вопросам рекламы [email protected]