在C中读取文件并加密取消保护的数据

在C中读取文件并加密取消保护的数据,c,winapi,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; F

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

#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;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
数据块加密;
数据块描述;
字符c;
int i;
FILE*fp=fopen(“一些数据”,“rb”);
encr.cbData=1;
fseek(fp,20L,SEEK_SET);
对于(i=0;i<60;i++){
c=fgetc(fp);
encr.pbData=(字节*)c;
printf(“%c”,c);
CryptUnprotectData(&encr,NULL,NULL,NULL,NULL,0,&decr)
printf(“%s”,数据量);
encr.pbData=NULL;
}
返回0;
}

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

您无法逐个字节解密。您必须将整个内容读入缓冲区,然后将其全部传递给
cryptounprotectData()
。最初调用
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;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
字节缓冲区[60];
数据块加密;
数据块描述;
字符c;
int i;
FILE*fp=fopen(“某些数据”,“rb”);//TODO检查返回值
encr.cbData=1;
encr.pbData=缓冲区;
fseek(fp,20L,SEEK_SET);//TODO检查返回值
fread(buffer,60,1,fp);//TODO检查返回值
CryptUnprotectData(&encr,NULL,NULL,NULL,0,&decr);//TODO检查返回值
printf(“%s”,数据量);
返回0;
}

你能改进一下你所说的“不知何故这不起作用”吗?不编译,崩溃,没有输出,输出错误,什么?
encr.pbData=(BYTE*)c
看起来可疑,因为
c
是一个字节而不是字节指针。
fgetc
返回一个
int
,而不是
char
,原因很充分!阅读您使用的函数的文档。并始终使用错误检查。您是否看到了使用
CryptUnprotectData
时的这一点?旁白:好的旧MS-它有
void main()
!您必须“尊重”加密库,这些库将“保留”指针传递给未发布任何内容且源不可用的算法。。。