5

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

我刚看了维基百科上的 PGP 文章,但他们在“散列、数据压缩、对称密钥密码学,最后是公钥密码学”的某个地方迷失了我。理想情况下,我想要一个具有功能的库,signString(string, privateykey)并且接收者将具有功能readSignedString(string, publickey)。有什么建议吗?

编辑:

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

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

4

4 回答 4

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_ValidateInit,EVP_ValidateUpdateEVP_ValidateFinal. 最后一个函数返回 0/1 表示验证是否成功。

您仍然需要将密钥放入应用程序,有很多功能可以做到这一点,具体取决于您从哪里读取它(文件/内存/证书等)

于 2011-08-13T10:52:29.253 回答
2

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

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

于 2011-08-13T11:08:21.957 回答
0

你可能想看看 PGP 的 GNU 版本,GnuPG,它使用了一个名为 libgcrypt http://directory.fsf.org/project/libgcrypt/的 OSS 库,它看起来可以做你想做的事。http://www.gnupg.org/documentation/manuals/gcrypt/获取手册。

于 2011-08-13T10:21:24.477 回答
0

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

于 2011-08-17T18:02:04.643 回答