Я ищу алгоритм для шифрования секретных номеров на мобильном устройстве со следующими свойствами:
- Каждое число имеет имя, связанное с пользователем, которое хранится в открытом тексте, но может использоваться для возмущенияшифрование
- Число должно быть зашифровано паролем без указания подсказки о том, является ли данный пароль правильным или неправильным
- При расшифровке с неправильным паролем результатом должно быть числоравной длины (т. е. если оригинал был 4-значным, неправильный должен быть также 4-значным)
- Когда злоумышленник знает одно или несколько чисел, самый простой способ получить другие числа долженбыть взломанным паролем до тех пор, пока числа не расшифруют до этого значения.
- При желании он может поддерживать другие наборы символов (например, 0-9a-f или 0-9a-zA-Z) - набор символов будетхранится вместе с записью, и каждое неправильное дешифрование покажет только эти символы, конечно
- Я предполагаю, что злоумышленник, который получил мУстройство obile найдет способ вывести из него зашифрованные данные и повторно реализовать алгоритм или любую логику взлома, поэтому даже при наличии доступа к необработанным данным оно не должно раскрывать информацию о неправильных паролях
Поскольку у меня есть SHA-1, доступное на устройстве, я подумал о следующем:
- Найдите наименьшее число байтов, в которое можно сохранить все значения диапазона (для 3-значного числа).число, используйте 2 байта, поскольку 999 не умещается в один байт)
- возьмите число для шифрования и проверьте, как часто вы можете добавлять
10**digitcount
к нему, чтобы оно все еще вписывалось в диапазон, т.е. когдачисло шифрования 555, это 64, как 65555> 65536, но при шифровании 222 это 65, как 65222 <65536. </li> - Выберите случайное число от 0 до числа, определенного вами на последнем шаге (линейноераспределение) и добавьте
number*(10**digitcount)
к числу для шифрования - Результатом должно быть число, которое каким-то образом равномерно распределено по всему диапазону байтов.
- Возьмите SHA-1 из
name+password
, обрежьте первые (или последние) байты - столько, сколько нужно для покрытия числа из последнего шага - и присвойте им XOR с номером из последнего шага. - Сохраните Xor-ed SHA1,длина номера и имя.
- Адаптация к другим базам, кроме 10, проста, что может удовлетворить необязательные требования, приведенные выше.
Что вы думаете?Есть идеи по улучшению?Есть ли более простые способы добиться того же?Есть ли какие-то очевидные недостатки, которые я пропустил?
(И есть ли (бесплатные, как в речи) приложения для мобильных устройств, которые реализуют аналогичный алгоритм?)
(Или есть какие-либо другие веб-сайты для обмена стеками, гдевопрос подходит лучше?)
edit : Теперь я принял единственный ответ, который не пытается сказать мне, что требования неверны.Да, я знаю, что требования неверны, но альтернатива (хранить все свои PINS в открытом виде или слабо зашифрованными на вашем мобильном устройстве) определенно является большим злом.