【问题标题】:C/C++ encrypt/decrypt with public keyC/C++ 使用公钥加密/解密
【发布时间】:2011-05-06 16:02:16
【问题描述】:

我正在寻找两个在概念上类似于这些的函数:

// 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 ...),但用这些库实现这些功能似乎并不容易:它们需要关于非对称加密的非肤浅知识还有很多代码。

无论如何,这项任务似乎并不罕见。 如何实现上面的两个功能?

【问题讨论】:

  • 你检查过 Keyczar 吗? code.google.com/p/keyczar
  • encrypted_text 可能是二进制数据。您需要注意嵌入的零。我会在原型中包含长度...
  • @pmg:我意识到有一个 [c]-tag,但我想 peoro 正在考虑 C++ 的 std::string,它是 8 位干净的并且包含一个长度,与字符串。
  • @pmg:我认为string 在某处嵌入了长度。当然,如果字符串是char*s,那么所有这些参数的长度都需要另一个参数:键(甚至可能是纯文本)也是二进制的。
  • @kotlinski:不,我没有检查。我去看看!

标签: c++ c encryption-asymmetric


【解决方案1】:

不幸的是,加密总是需要对所涉及的算法有非肤浅的了解。很难做到正确。 “应用密码学手册”是一本相对易读的各种可用算法指南,因此可能值得一看。

你也可以试试cryptlib。它似乎有一个层次分明的设计,为您提供了许多参数的合理默认值,因此您希望可以开始而不必过多担心细节。

【讨论】:

  • 好吧,我不太同意。我给出签名的两个函数(加上另一个生成公钥/私钥对)应该足以用于加密。当然,它们不是非常可定制的,因此它们的安全性不足以用于严重的事情,但我想它们在 99% 的情况下都可以......
  • 无论如何,我会看看cryptlib,谢谢指出!
  • 我建议你也改变你的函数签名以字节而不是字符串的形式工作。加密通常适用于不透明的字节数组,添加字符串语义只会让事情变得更难。在这一层,密钥只是一组字节,密码是一组字节,明文/密文都是字节组。它们可能表示具有某种字符编码(ASCII、UTF-8 或其他)的字符串,但加密层并不关心这些。
  • 完全不同意。
【解决方案2】:

当有人要求轻松加密时,我只能推荐KeyCzar

它不仅提供了多种语言的简洁界面(可以使用相同的键),还提供了处理键轮换等机制。

当然,实现算法的安全默认值,这样您就不必担心技术细节。

真的,到目前为止我见过的更简单、更安全的组合。

【讨论】:

  • keyczar 不只是 openssl 等的包装器吗?
  • @BjornWesen:是的。从链接 Keyczar 被设计为开放、可扩展和跨平台兼容。它并不打算取代现有的加密库,如 OpenSSL、PyCrypto 或 Java JCE,并且实际上是基于这些库构建的(强调我的)KeyCzar 的一个好处是它会为您选择安全的默认值,这样您就不会在脚下开枪。
  • 是的,这当然是一个非常值得赞赏的目标 :) 我确实发现自己处于同样的情况,需要一个轻量级库进行一些公钥签名/验证,并且想到必须参与openssl“只是”这样做很重。我后来确实找到了libtom,这对于很多事情来说可能都可以。
【解决方案3】:

假设您不需要与平台无关的东西,下一代密码术 (CNG) 是 Windows 上相对较新的密码术 API,并且非常直观且易于使用。我写了一篇文章,其中包含您在典型应用程序中可能需要的所有主要加密操作的示例。本文的示例代码还提供了使用 Visual C++ 编译器进行这些操作的完整工作示例。

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

要将公钥和私钥视为字符串,您可以简单地使用 Base64 或类似的编码。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 2019-06-30
  • 2012-09-09
相关资源
最近更新 更多