如何使用RSA / AES加密/解密更大的文件

时间:2015-04-06 14:31:18

标签: c++ openssl aes rsa

好的,所以我正在寻找一种使用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;
  }

1 个答案:

答案 0 :(得分:5)

  

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

您需要做的就是:

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

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

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

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

在理想的世界中,OpenSSL将提供集成加密方案,如Shoup的Elliptic Curve Integrated Encryption Scheme(ECIES)或Abdalla,Bellare和Rogaway的Diffie-Hellman Authenticated Encryption Scheme(DHAES)。集成的加密方案可以帮到您。

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