Я не уверен, что вы храните вместе номер карты и закрытый ключ. Кажется, просто используя пароль пользователя для шифрования файла закрытого ключа, вы открываете дверь для атаки по словарю, если доступны зашифрованные файлы закрытого ключа.
Не уверен, почему вы хотите использовать криптографию с открытым ключом, которая может быть довольно медленной. Также модель из 1 пары ключей на пользователя может не масштабироваться (сколько файлов вы можете сгенерировать для операций с открытым ключом). Обратите внимание, что у вас может быть оскорбительное поведение - люди проверяют, хорош ли их список украденных карт.
Вы по-прежнему можете запретить любое использование номера карты, когда пользователя нет, добавив свой главный секрет и составив расписание ключей из комбинации. Как правило, большинство продавцов не могут следовать этому строгому требованию, так как существует существенная необходимость использовать номер карты, когда пользователя нет.
Если вам просто нужны определенные пользователем ключи (и вы должны каждый раз использовать разные IV), тогда вы можете идти по маршруту openssl EVP_BytesToKey и каждый раз передавать разные соли с главным секретным ключом, из которого будет получен ключ шифрования и iv. производные (и они будут разными для каждого пользователя).
Наконец, использование платежного инструмента защищено только паролем пользователя, как описано. Некоторые пользователи выбирают слабые пароли. Поэтому вы можете захотеть использовать дополнительные средства проверки, чтобы убедиться, что карта принадлежит пользователю - часть этого для вашего же блага, так как вы можете бороться с дружескими ответными мошенничествами и поддерживать низкий уровень реальных возвратных платежей мошенничества.