Ужасно сломан несколькими способами.
- Ваш ключ 64-битный, на сегодня немного маловат. Но пока это меньше всего твоих забот.
- Я вижу не криптографический PRNG. Вам нужно использовать крипто-PRNG.
- Вы повторно используете ключ в потоковом шифре. Потоковые шифры печально известны тем, что их трудно правильно использовать. В этом режиме работы он в основном ведет себя как одноразовая панель, генерируемая PRNG. После повторного использования ключа в таком режиме ваша криптография нарушается.
Предположим, что злоумышленник знает encrypt(p1)
и encrypt(p2)
. Затем он может вычислить encrypt(p1)-encrypt(p2)
, что идентично p1-p2
.
- Ваш эффективный размер ключа намного меньше 64-битного. Сумма символов в строке <2 ^ 16 * длина. И для большинства персонажей это даже <128. Таким образом, ваш ключ обычно будет числом <1000'000. Это просто для грубой силы. </li>
- Каждый элемент в
randoms
является байтом, т. Е. 8 бит. Символ 16 бит. Таким образом, вы не добавляете модуль 256. Таким образом, вы теряете информацию о зашифрованном пароле.
И чтобы улучшить его, полностью исключите свой собственный алгоритм и используйте хорошо известный, проверенный алгоритм. Изобретать собственный алгоритм - плохая идея, если вы не специалист по криптографии. И даже эксперт делает ошибки относительно часто.
А вам действительно нужно расшифровать пароль (т.е. это хранилище паролей), или достаточно хэширования пароля?
Мое предложение состоит в том, чтобы поместить ваш мастер-пароль в функцию-ключ-деривация (PKDF2 является распространенным выбором). Затем используйте ключ, который возвращает эта функция, чтобы зашифровать остаток вашего файла данных с помощью AES.