在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()
!您必须“尊重”加密库,这些库将“保留”指针传递给未发布任何内容且源不可用的算法。。。