在C ++中实现公钥加密的简单方法?

时间:2011-08-13 10:04:08

标签: c++ encryption signature pgp

我希望能够签名文件。我的意思是,收件人可以检查该文件确实来自我,并可以查看其内容。有没有简单的方法在C ++中做到这一点?

我刚刚看了一下维基百科上的PGP文章,但是他们在“散列,数据压缩,对称密钥加密,最后是公钥加密”的中间失去了我。理想情况下,我想要一个具有函数signString(string, privateykey)的库,并且收件人将具有函数readSignedString(string, publickey)。有什么建议吗?

修改

我不确定我是否使用了正确的方法,所以这就是我要做的事情:

我想在桌面应用程序中实现一些简单的盗版保护。因此,当用户购买许可证时,我会向他们发送包含其姓名和电子邮件的签名文件。然后,用户安装该文件,应用程序将其读取:它检查签名有效性并显示名称/电子邮件(在“关于”框中)。为了确保破解者无法生成这些文件,我需要确保解密文件的密钥与加密文件的密钥不同。有没有简单的方法来实现这个?

4 个答案:

答案 0 :(得分:6)

OpenSSL几乎就是您所需要的。它没有两个这样的功能,但它几乎一样容易。 首先,每个数字签名都需要哈希算法。原因是你没有加密文件,你只加密文件哈希(否则需要很长时间来验证)。

使用OpenSSL,您可以使用以下内容:

#include <openssl/evp.h>

EVP_MD_CTX ctx;
unsigned char signature[SIGNATURE_LEN];
int signature_len;

EVP_SignInit(&ctx, EVP_sha1());
EVP_SignUpdate(&ctx, data, size);
EVP_SignFinal(&ctx, signature, &signature_len, pkey);

验证签名几乎相同,只使用EVP_ValidateInitEVP_ValidateUpdateEVP_ValidateFinal。最后一个函数返回0/1,表示验证是否成功。

您仍需要将密钥输入应用程序,有很多功能可以执行此操作,具体取决于您从哪里读取它(文件/内存/证书等)。

答案 1 :(得分:2)

您还可以使用Keyczar加密和解密您的文件。

但实际上你不能像这样破解你的程序,它会让它变得更难,但是破解者可以反汇编你的程序,找到检查那些签名文件的有效性的函数,并将其更改为接受任何类型的文件

答案 2 :(得分:0)

您可能想看看GGP的GNU版本,GnuPG,它使用名为libgcrypt http://directory.fsf.org/project/libgcrypt/的OSS库,它看起来能够做你想要的。手册http://www.gnupg.org/documentation/manuals/gcrypt/

答案 3 :(得分:0)

有关信息,在尝试了大部分建议之后,我最终使用了openpgp命令行工具。 UPX后它非常轻巧,它是跨平台的,它可以轻松地完成我需要的工作。