在 C++ 中使用密码保护私钥

Using a password to protect private key in c++

我打算编写一个小应用程序,其基本思想是用户能够相互共享加密信息。一个小场景:Alice 写了一个备忘录(数据格式已知),应用程序加密这个备忘录并将备忘录保存在应用服务器上。现在爱丽丝想与鲍勃分享这份备忘录。 Alice 打开应用程序,搜索用户 "Bob" 并收到 Bob 的 public 密钥。应用程序使用 Alice 和 Bob 的密钥对备忘录进行加密,并将备忘录保存在服务器上。现在 Bob 也可以阅读备忘录了。

用户的私钥只属于安装应用的设备。它永远不会通过网络传输。尽管如此,我还是想 'encrypt' 带有用户密码的私钥,因此它可以以(相对)安全的方式存储在设备上,并且只有在输入正确的密码时才会 'decrypted' 。如果用户的密码发生更改,则不应更改密钥本身,因为这将导致所有数据都必须使用此新密钥再次加密。取而代之的是,用户将不得不输入旧密码,密钥将使用新密码再次解密和加密。

是否有任何功能(也许在 OpenSSL 中?)'encrypt' 或使用密码短语保护密钥?

注意:私钥可能存储在也可能不存储在密钥库中。因为该应用程序将 运行 在许多平台上,所以事先不清楚哪个密钥库可用。

使用 OpenSSL 您可以将密钥保存在受保护的形式 (BEGIN RSA ENCRYPTED...) 中。您可能想要使用的示例函数(我省略了事先需要的所有操作,但它们非常基本)。

PEM_write_PKCS8PrivateKey(pFile, m_pKey, cipher, sPass, iPassLen, 0, NULL)

其中 cipher 是您的适当类型的加密算法。更多(有例子!)在这里:https://www.openssl.org/docs/manmaster/crypto/pem.html

Is it possible to integrate PGP in my own applications?

GnuPG Made Easy (GPGME) "is a library designed to make access to GnuPG easier for applications. It provides a High-Level Crypto API for encryption, decryption, signing, signature verification and key management."