如何使用 RSA/AES encrypt/decrypt 更大的文件

How to encrypt/decrypt larger file using RSA/AES

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

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

我只是不太明白如何一起使用 AES/RSA 来实现这一点。我有一些代码可以执行简单的 RSA encryption/decryption 和一些可用的 AES 代码。我从其他 SO 问题中得到了这段代码。

我在 C++ 中使用 Openssl。

当前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;
  }

Okay so i'm looking for a way to encrypt/decrypt larger files using RSA and AES. I don't quite understand what I need to do...

您只需:

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

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

要改进此模式,您应该 select 提供保密性和真实性的模式。 AES/GCM 是个不错的选择。 EVP Authenticated Encryption and Decryption.

的 OpenSSL wiki 上有一个示例

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

在理想情况下,OpenSSL 会提供像 Shoup 的 Elliptic Curve Integrated Encryption Scheme (ECIES) or Abdalla, Bellare and Rogaway's Diffie-Hellman Authenticated Encryption Scheme (DHAES) 那样的集成加密方案。集成的加密方案为您完成这一切。

顺便说一下,Crypto++ is a C++ crypto library that provides both integrated encryption schemes. Maybe you should consider switching security libraries. Here's the documentation with sample code on ECIES