AES_cfb128_encrypt不解密加密文件中的所有字节

时间:2015-04-07 03:01:46

标签: c++ openssl aes

所以我在C ++中使用以下代码与Openssl。 我从另一个SO线程得到了这个。

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", "r");
  FILE *ofp = fopen("orig.txt", "w");

  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) {
      std::cout << bytes_read << std::endl;
      break;
    }
  }

  fclose(ifp);
  fclose(ofp);

我正在做的是加密文件&#39; test.txt&#39;首先将AES_ENCRYPT传递给AES_set_encrypt_key,然后尝试解密同一个文件。加密文件存储为out.txt。

我使用上面的代码解密。我的问题是解密文件似乎只解密454字节的数据。它正确解密数据但不是全部。我试过一个测试文件&lt; 454字节工作正常,但使用8kb文件,14kb文件等总是导致只有454字节被解密。但是,加密文件的大小是正确的(即14kb测试文件的~14kb加密文件)。

制作&#39; ivec&#39;空字符串允许我解密545字节的加密文本。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

好的,我在查看了一些开源实现后设法找到了解决方案。

问题是我使用fopen作为文本读/写而不是读/写为二进制文件。

修复:

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