我有以下问题,我想从我的计算机中读取一个加密文件,然后将它所说的内容放入命令控制台。
#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] 删除。
我来说两句