我遇到以下问题,我想从我的计算机读取一个加密文件,然后把命令放到命令控制台。
#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;
}
不知何故,这不起作用,我不知道如何获得输出。
答案 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;
}