使用公钥进行C/C++加密/解密

13

我正在寻找两个与以下函数在概念上类似的函数:

// returns the encrypted text
string encrypt( string public_key, string pass_phrase, string text );
// returns the original text
string decrypt( string private_key, string pass_phrase, string encrypted_text );

其中 string 可以是一个 char*, 一个 std::string 或者可以轻松转换成这两种类型的任何东西。而 public_keyprivate_key 可以是基本上任何东西,从使用某些命令(gpg/ssl工具或其他)生成的密钥,到使用其他简单函数生成的密钥。

我研究了几个密码库(libgcrypt、libgpgme、openssl……),但是要使用这些库来实现这样的函数并不容易:它们需要对非对称加密有深入的了解和大量的代码。

无论如何,这个任务似乎并不少见。 我该如何实现上述两个函数?


2
你有没有看过Keyczar?http://code.google.com/p/keyczar/ - Johan Kotlinski
加密文本可能是二进制数据。你需要注意嵌入的零。我会在原型中包含长度... - pmg
@pmg:我知道有一个[c]标签,但我想peoro是在考虑C++的std::string,它是8位清洁的,并包括一个长度,与字符串内容分开。 - Magnus Hoff
@pmg:我认为string中嵌入了长度。当然,如果字符串是char*,那么所有这些参数都需要另一个参数来表示长度:此外,密钥(甚至纯文本)也是二进制的。 - peoro
@kotlinski:不,我还没有看过。我会去看一下! - peoro
3个回答

7

很不幸,加密始终需要对所涉及算法有深入的了解。这是一项难以正确实现的技术。《应用密码学手册》是一个相对易读的指南,介绍了各种可用的算法,因此值得一看。

你也可以尝试使用 cryptlib。它似乎具有分层设计,为许多参数提供了合理的默认值,因此您可以希望能够开始而无需过多担心细节。


2
嗯,我不完全同意。我给出了两个函数的签名(以及生成公钥/私钥对的另一个函数),应该足以用于加密。当然它们并不是非常可定制化,所以在处理重要内容时并不足够安全,但我认为对于99%的情况来说它们还可以... - peoro
我会看一下cryptlib,不管怎样,谢谢你指出来! - peoro
2
我建议您还要更改函数签名,以便使用字节而不是字符串。加密通常使用不透明的字节数组,并添加字符串语义只会使事情更加困难。在这个层面上,密钥只是一组字节,密码短语也是一组字节,明文/密文都是一组字节。它们可能表示某种字符编码的字符串(ASCII、UTF-8或其他),但加密层不关心这些。 - Cameron Skinner
绝对不同意。 - Lothar

5
当有人要求简单的加密时,我只能推荐KeyCzar。它不仅提供了几种语言的清晰界面(可以使用相同的密钥),还提供了处理密钥轮换等机制。当然,实现的算法也有安全的默认设置,这样您就不必担心技术细节。真的,这是我迄今为止见过的最好的易用和安全的组合。

Keyczar只是对OpenSSL等的包装器,不是吗? - BjornW
1
@BjornWesen:是的,它就是。从链接中可以看到,Keyczar旨在开放、可扩展和跨平台兼容。它并不打算取代现有的加密库,如OpenSSL、PyCrypto或Java JCE,实际上是基于这些库构建的。(强调我的)KeyCzar的一个好处是它为您选择安全的默认值,因此您不会自己搞砸。 - Matthieu M.
是的,这当然是一个非常受欢迎的目标 :) 不过我发现自己也处于同样需要轻量级库进行一些公钥签名/验证的情况下,而必须涉及openssl来完成这个任务的想法很繁琐。后来我找到了libtom,它可能适用于许多事情。 - BjornW

0

假设您不需要平台无关的东西,Cryptography Next Generation(CNG)是Windows上一个相对较新的密码学API,而且令人惊讶地直观易用。我写了一篇文章,其中包括您在典型应用程序中可能需要的所有主要密码操作的示例。该文章的示例代码还使用Visual C++编译器为这些操作提供了完整的工作示例。

http://msdn.microsoft.com/en-us/magazine/cc163389.aspx

如果要将公钥和私钥作为字符串处理,你可以简单地使用Base64或类似的编码。


这个链接只提供了杂志的目录,你的文章是在哪一期呢?谢谢! - savolai ᯓ
遗憾的是,那些较旧的文章已经被存档为chm文件。http://download.microsoft.com/download/3/A/7/3A7FA450-1F33-41F7-9E6D-3AA95B5A6AEA/MSDNMagazineJuly2007en-us.chm - Kenny Kerr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接