【问题标题】:How to encrypt/decrypt larger file using RSA/AES如何使用 RSA/AES 加密/解密较大的文件
【发布时间】:2015-04-06 14:31:18
【问题描述】:

好的,所以我正在寻找一种使用 RSA 和 AES 加密/解密较大文件的方法。 我不太明白我需要做什么。

情况是我有更大的文件(从 200kb 到 50mb)。我希望能够加密在当前目录中留下密钥(私钥)的特定文件以及加密文件。然后,用户可以保存密钥,随身携带,稍后再回来解密文件。

我只是不太明白如何同时使用 AES/RSA 来实现这一点。我有一些代码来做简单的 RSA 加密/解密和一些工作 AES 代码。我从其他 SO 问题中获得了此代码。

我正在使用 Openssl 和 C++。

当前的 AES 程序:(来自在线)

int main() {

int bytes_read, bytes_written;
  unsigned char indata[AES_BLOCK_SIZE];
  unsigned char outdata[AES_BLOCK_SIZE];

  /* ckey and ivec are the two 128-bits keys necesary to
  en- and recrypt your data.  Note that ckey can be
  192 or 256 bits as well */
  unsigned char ckey[] = "thiskeyisverybad";
  unsigned char ivec[] = "dontusethisinput";

  /* data structure that contains the key itself */
  AES_KEY key;

  /* set the encryption key */
  AES_set_encrypt_key(ckey, 128, &key);

  /* set where on the 128 bit encrypted block to begin encryption*/
  int num = 0;

  FILE *ifp = fopen("out.txt", "rb");
  FILE *ofp = fopen("outORIG.txt", "wb");

  while (true) {
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp);

    AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num,
      AES_DECRYPT); //or AES_DECRYPT

    bytes_written = fwrite(outdata, 1, bytes_read, ofp);
    if (bytes_read < AES_BLOCK_SIZE)
      break;
  }

【问题讨论】:

  • 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
  • 此修改无法解决问题。 “我有一些代码来进行简单的 RSA 加密/解密和一些部分工作的 AES 代码(加密工作正常,但无法解密超过特定文件大小)。” 然后将该代码显示为最小示例并准确解释你有什么问题(编译器/运行时错误)。
  • 代码没有添加任何东西,我正在寻找其他人提出实现这一点的方法,这些人过去可能已经这样做过。但如果它对你来说意义重大,我会添加我所拥有的。
  • 那么您的问题与第一条评论中提到的无关。或者甚至只是太宽泛(这是另一个离题的关闭原因)。
  • 不,真的不是。唯一的问题是我要求我已修复的资源。

标签: c++ openssl aes rsa


【解决方案1】:

好的,所以我正在寻找一种使用 RSA 和 AES 加密/解密较大文件的方法。我不太明白我需要做什么......

您需要做的就是:

  • 生成随机 AES 密钥
  • 使用 AES 密钥加密大文件
  • 在 RSA 密钥下加密 AES 密钥

此外,仅靠加密通常是不够的。这意味着可以改进您对 AES/CFB 的选择。这是因为 CFB(和其他模式,如 CBC)只提供机密性。您无法检测到意外和恶意篡改。

要改进该模式,您应该选择一种提供机密性和真实性的模式。 AES/GCM 将是一个不错的选择。在 OpenSSL wiki EVP Authenticated Encryption and Decryption 上有一个示例。

您可以在 Crypto++ wiki Authenticated Encryption 上阅读更多关于 Authenticated Encryption 的信息。它是一个不同的库和不同的 wiki,但它提供了有关经过身份验证的加密的信息。

在理想情况下,OpenSSL 将提供像 Shoup 的 Elliptic Curve Integrated Encryption Scheme (ECIES) 或 Abdalla、Bellare 和 Rogaway 的 Diffie-Hellman Authenticated Encryption Scheme (DHAES) 这样的集成加密方案。一个集成的加密方案为您完成这一切。

顺便说一下,Crypto++ 是一个 C++ 加密库,它提供了两种集成加密方案。也许您应该考虑切换安全库。这是ECIES 上带有示例代码的文档。

【讨论】:

  • 我不明白这里 RSA 的作用。这是一种选择: 1)使用 PBKDF2 等来制作 AES 密钥。 2)通过安全通道将密钥传递给其他用户,完成。唯一的问题是如果安全通信不可用。这将是 RSA 提供的一项工作。大文件(最大 50 Mb)的身份验证似乎有点过头了。我知道在 CTR/OFB 模式下怎么可能弄乱小文件,但是任何使用 CFB/CBC 的回火都会破坏整个文件。也许我需要就此提出一个新问题。
  • @Barmak - “我知道在 CTR/OFB 模式下如何处理小文件是可能的,但是任何对 CFB/CBC 的回火都会破坏整个文件。也许我需要启动一个新问题。” - 无需开始新问题。阅读有关经过身份验证的加密的文章。它告诉你你需要知道的一切。或者查看代码项目上的Authenticated Encryption。我能够篡改示例许可证文件并使用 CFB 模式将 licenses=10 更改为 licenses=305070 :) 无需解密。
  • @Barmak - "...唯一的问题是如果安全通信不可用..." - 好的,现在这是一个不同的要求。您最初的问题使我相信这是本地的长期存储。对于安全通信,您需要像 Ephemeral Diffie-Hellman(包括 EC 变体)、MQV、Fully-Hashed MQV 等密钥协议算法。您可能应该将讨论移至Information Security Stack Exchange,以便您讨论需求和设计安全架构。
  • 谢谢,我对 RSA 是什么感到困惑。
  • 感谢您的解释。对于这个项目,我不需要验证完整性,因此经过身份验证的加密并不是我想要的(但很高兴阅读,谢谢!)。但是,您已将我设置在正确的路径上,我将使用 AES 加密,然后使用 RSA 密钥安全地传输 AES 密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2015-08-29
相关资源
最近更新 更多