读取文件和C

时间:2017-07-08 18:26:31

标签: c winapi

我遇到以下问题,我想从我的计算机读取一个加密文件,然后把命令放到命令控制台。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <wincrypt.h>

int main(int argc, char **argv){
    DATA_BLOB encr;
    DATA_BLOB decr;
    char c;
    int i;
    FILE *fp = fopen("some data", "rb");
    encr.cbData = 1;
    fseek(fp, 20L, SEEK_SET);
    for (i = 0; i < 60; i++){
        c = fgetc(fp);
        encr.pbData = (BYTE*)c;
        printf("%c", c);
        CryptUnprotectData(&encr, NULL, NULL, NULL, NULL, 0, &decr)
        printf("%s", decr.pbData);
        encr.pbData = NULL;
    }
    return 0;
}

不知何故,这不起作用,我不知道如何获得输出。

1 个答案:

答案 0 :(得分:1)

您不能逐字节解密。您必须将整个内容读入缓冲区,然后将其全部传递给CryptUnprotectData()。当你最初调用CryptProtectData()时,它会告诉你输出的大小是多少。这是你应该一次解密的​​缓冲区的大小。

假设您的缓冲区实际上是60个字节且在20偏移量中,您的代码应该类似于:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <wincrypt.h>

int main(int argc, char **argv){
  BYTE buffer[60];
  DATA_BLOB encr;
  DATA_BLOB decr;
  char c;
  int i;
  FILE *fp = fopen("some data", "rb"); // TODO check return value
  encr.cbData = 1;
  encr.pbData = buffer;
  fseek(fp, 20L, SEEK_SET); // TODO check return value
  fread(buffer, 60, 1, fp); // TODO check return value
  CryptUnprotectData(&encr, NULL, NULL, NULL, NULL, 0, &decr); // TODO check return value
  printf("%s", decr.pbData);
  return 0;
}