Я разрабатываю приложение, которое с одной стороны создает код с определенной информацией о покупке, в который включена кредитная информация. Например, вы можете купить определенное количество минут, чтобы потратить на публичный ПК в кибер-кафе, и вы получите билет с номером/кодом с этим количеством минут, который затем декодируется и обрабатывается программным обеспечением блокировки ПК в публичный ПК.
Полная длина этой информации (включая дату покупки, идентификатор и т. Д.) Составляет около 12 байтов. Я должен обеспечить эти данные, очевидно, столько, сколько мне нужно сделать неизменным. У меня нет опыта в криптографии, но я читал много последних нескольких дней, поэтому я придумал схему, в которой я шифрую данные с помощью Twofish в режиме CFB (чтобы сохранить маленький зашифрованный текст) и добавьте 4 байтов длиной IV, генерируемых случайным образом. Я понимаю, что это короткий IV, но причина в том, что атакующий должен захватить явно нелепый набор билетов, чтобы стать нитью с IV из 65535 вариаций.
Проблема, которую я вижу (не говоря уже о том, что я пропустил), заключается в том, что мне также нужно аутентифицировать код, поскольку в режиме CFB небольшое изменение в зашифрованном тексте приводит к небольшому изменению открытого текста, поэтому любой может измениться, поскольку экземпляр, кредит его билета, просто изменив A для B.
Итак, первый вопрос: есть ли очевидная проблема при использовании CRC16 открытого текста как IV и добавить его (незашифрованный) в зашифрованный код, чтобы использовать его как для аутентификации, так и для IV? Повторяю, я не в криптографии, но «странно» добавить некоторую информацию об незашифрованном незашифрованном тексте вместе с cyphertext. Но это всего лишь ощущение кишки.
Или вместо этого я должен использовать потоковый шифр? Какой из них мог бы сильно изменить (/ испортить) открытый текст из небольшого изменения зашифрованного текста. Связано ли это с свойством распространения ошибки в режиме шифрования?
Некоторые рекомендации, пожалуйста?
Большое спасибо.
Кстати, если это имеет значение, я использую mcrypt на PHP.Рекомендации по обеспечению/шифрованию кода
Я должен добавить, что другой конец приложения, тот, который читает билет, не является (и не может быть) онлайн. Извините за это.
Я предпочел бы раздавать случайные числа и иметь клиентский компьютер: спросить сервер лицензий на информацию о покупке, связанную с этим случайным числом. –
Спасибо, Альбин. Вся эта схема основана на том факте, что другой конец приложения (тот, который показан на ПК) не находится в сети. Я понял, что это подразумевалось. Извини за это. Я отредактирую. – tebastian
Бессмысленно использовать IV, который получен из обычного текста. Вся суть IV заключается в том, чтобы создавать разные шифрованные тексты из одного и того же простого текста. – erickson