在 C 中读取文件和 CryptUnprotectData

我有以下问题,我想从我的计算机中读取一个加密文件,然后将它所说的内容放入命令控制台。

#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;
}

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

小的

你不能逐字节解密。您必须将整个内容读入缓冲区,然后将其全部传递给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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章