Во-первых, обратите внимание, что «подписание» данных (чтобы заметить, когда они были подделаны) является совершенно отдельной и независимой операцией от «шифрования» данных (чтобы не дать другим людям их читать).
Тем не менее, стандарт OpenPGP делает и то, и другое. GnuPG - это популярная реализация: http://www.gnupg.org/gph/en/manual.html
В основном вам нужно:
- Создайте пару ключей, но не беспокойтесь о публикации публичной части.
- Подпишите и зашифруйте ваши данные (это одна операция в gpg)
- ... хранилище ...
- Расшифруйте и проверьте подпись (это также одна операция).
Но имейте в виду, что это может использоваться только в том случае, если вы можете хранить свой закрытый ключ более надежно, чем остальные данные. Если вы не можете гарантировать безопасность ключа, то GPG не сможет помочь вам против злонамеренной попытки чтения или подделки ваших данных. И ни одна другая схема шифрования / подписи не может.
Забывая о шифровании, вы можете подумать, что вы можете подписать данные на каком-либо защищенном сервере с помощью закрытого ключа, а затем проверить их на компьютере какого-либо пользователя с помощью открытого ключа. Это хорошо, насколько это возможно, но если пользователь злонамеренный и умный, он может придумать новые данные, подписать их, используя собственный закрытый ключ, и изменить ваш код, чтобы заменить ваш открытый ключ своим. Их данные затем будут проверены. Таким образом, вам все еще нужно, чтобы хранилище открытого ключа было защищено от несанкционированного доступа, согласно вашей модели угроз.
Вы можете реализовать эквивалент самостоятельно, что-то вроде:
- Выберите длинную строку случайных символов. Это твой ключ.
- Объедините ваши данные с ключом. Хеш это с помощью безопасной хэш-функции (SHA-256). Затем объедините полученный хеш с вашими данными и зашифруйте его, используя ключ и безопасный симметричный шифр (AES).
- ... хранилище ...
- Расшифруйте данные, отрежьте хеш-значение, верните ключ обратно, хеш-код и сравните результат с хеш-значением, чтобы убедиться, что он не был изменен.
Вероятно, это будет быстрее и будет использовать меньше кода в целом, чем gpg: для начала PGP - это криптография с открытым ключом, и это больше, чем вам требуется здесь. Но сворачивание собственного означает, что вы должны выполнить некоторую работу, написать часть кода и убедиться, что в только что описанном протоколе нет глупой ошибки. Например, у него есть потенциальные недостатки, если данные не имеют фиксированной длины, которую решает HMAC.
Хорошая безопасность избегает выполнения работы, которую какой-то другой, умный человек сделал для вас. Это добродетельная лень.