请帮忙看看这段程序,100分回报!

tigerwen01 2004-07-03 01:25:12
请问以下这段程序是什么语言编写的?该怎样编译运行?
---------------------------------
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_TYPE (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)

void HandleError(char *s);

void main ()
{

/////////////////////////////////////////////////////////////////////////
//打开库

HCRYPTPROV hCryptProv;
HCERTSTORE hSysStore;

if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT))
{
if(hSysStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
hCryptProv,
CERT_SYSTEM_STORE_CURRENT_USER,
L"MY"
))
{
printf("===================================================\n");
}
else
{
HandleError("打开证书库失败\n");
}
}
else
{
HandleError("获取库句柄失败\n");
}


////////////////////////////////////////////////////////////////////////////
//枚举系统证书库

PCCERT_CONTEXT pCertContext=NULL;

while(pCertContext= CertEnumCertificatesInStore(
hSysStore,
pCertContext))
{

////////////////////////////////////////////////////////////////
//取颁发者

char Issuer[256];

CertGetNameString(
pCertContext,
CERT_NAME_RDN_TYPE,
CERT_NAME_ISSUER_FLAG,
NULL,
Issuer,
128);
printf("==颁发者\n==> %s\n",Issuer);

///////////////////////////////////////////////////////////////
//取主题

char Subject[256];

CertGetNameString(
pCertContext,
CERT_NAME_RDN_TYPE,
0,NULL,
Subject,
128);
printf("==主题\n==> %s\n",Subject);

//////////////////////////////////////////////////////////////
//取证书有效终止期

FILETIME *lpFileTime[2];
SYSTEMTIME stime[2];

lpFileTime[1] = (FILETIME *)malloc(sizeof(pCertContext-> pCertInfo-> NotBefore));
lpFileTime[2] = (FILETIME *)malloc(sizeof(pCertContext-> pCertInfo-> NotAfter));

lpFileTime[1]-> dwHighDateTime=pCertContext-> pCertInfo-> NotBefore.dwHighDateTime;
lpFileTime[2]-> dwHighDateTime=pCertContext-> pCertInfo-> NotAfter.dwHighDateTime;

lpFileTime[1]-> dwLowDateTime=pCertContext-> pCertInfo-> NotBefore.dwLowDateTime;
lpFileTime[2]-> dwLowDateTime=pCertContext-> pCertInfo-> NotAfter.dwLowDateTime;

FileTimeToSystemTime(lpFileTime[1],&stime[1]);
FileTimeToSystemTime(lpFileTime[2],&stime[2]);

printf("==有效期起始日期\n==>%d-%d-%d %d时:%d分:%d秒 \n",stime[1].wYear,stime[1].wMonth,stime[1].wDay,stime[1].wHour,stime[1].wMinute,stime[1].wSecond);
printf("==有效期终止日期\n==>%d-%d-%d %d时:%d分:%d秒 \n",stime[2].wYear,stime[2].wMonth,stime[2].wDay,stime[2].wHour,stime[2].wMinute,stime[2].wSecond);

/////////////////////////////////////////////////////////////////////////////////////
//取序列号

CRYPT_INTEGER_BLOB SerialNumber;

if(CryptFormatObject(
MY_TYPE,
0,
0,
NULL,
0,
pCertContext->pCertInfo ->SerialNumber .pbData ,
pCertContext->pCertInfo ->SerialNumber .cbData ,
NULL,
&SerialNumber.cbData ))
{
if(SerialNumber.pbData = (BYTE *)malloc(SerialNumber.cbData ))
{
if(CryptFormatObject(
MY_TYPE,
0,
0,
NULL,
0,
pCertContext->pCertInfo ->SerialNumber .pbData ,
pCertContext->pCertInfo ->SerialNumber .cbData ,
SerialNumber.pbData ,
&SerialNumber.cbData ))
{
printf("==序列号\n==>%S\n",SerialNumber.pbData );
}
else
{
HandleError("Error\n");
}
}
else
{
HandleError("Error\n");
}
}
else
{
HandleError("Error\n");
}
////////////////////////////////////////////////////////////////////////////////////////
//取公钥

CRYPT_BIT_BLOB PublicKey;

if(CryptFormatObject(
MY_TYPE,
0,
0,
NULL,
0,
pCertContext->pCertInfo ->SubjectPublicKeyInfo .PublicKey .pbData ,
pCertContext->pCertInfo ->SubjectPublicKeyInfo .PublicKey .cbData ,
NULL,
&PublicKey.cbData ))
{
if(PublicKey.pbData = (BYTE *)malloc(PublicKey.cbData ))
{
if(CryptFormatObject(
MY_TYPE,
0,
0,
NULL,
0,
pCertContext->pCertInfo ->SubjectPublicKeyInfo .PublicKey .pbData ,
pCertContext->pCertInfo ->SubjectPublicKeyInfo .PublicKey .cbData ,
PublicKey.pbData ,
&PublicKey.cbData ))
{
printf("==公钥\n==>%S\n",PublicKey.pbData );
}
else
{
HandleError("Error\n");
}
}
else
{
HandleError("Error\n");
}
}
else
{
HandleError("Error\n");
}
//////////////////////////////////////////////////////////////////////////////////////
printf("===================================================\n");
} // End of while

CertCloseStore(
hSysStore,
CERT_CLOSE_STORE_CHECK_FLAG);
CryptReleaseContext(
hCryptProv,
0);

}

void HandleError(char *s)
{
fprintf(stderr,"在运行程序时出现错误. \n");
fprintf(stderr,"%s\n",s);
fprintf(stderr, "错误代号 %x.\n", GetLastError());
fprintf(stderr, "程序终止运行. \n");
exit(1);
} // End of HandleError
...全文
173 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
绝影 2004-07-04
  • 打赏
  • 举报
回复
控制台编译也可:
cl /c filename.cpp
link /subsystem:console filename.obj wincrypt.lib
broown 2004-07-03
  • 打赏
  • 举报
回复
直接把它改成*.c然后用VC打开,按F5
freefalcon 2004-07-03
  • 打赏
  • 举报
回复
windows程序,c语言编写
如楼上所说,用vc建立一个控制台(console)工程,然后将程序拷过去

但是这段代码有很多要求,比如函数CertGetNameString的要求如下:
Windows NT: Requires version 4.0 SP3 or later. Available also in IE 3.02 and later.
Windows: Requires Windows 98 (or Windows 95 with IE 3.02 or later).
Windows CE: Unsupported.
Header: Declared in wincrypt.h.
Import Library: Use crypt32.lib.
Unicode: Defined as Unicode and ANSI prototypes.

所以要使你的程序能编译通过,你至少要做如下处理

#define _WIN32_WINNT 0x400 // 增加版本定义
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h> // 我的这个头文件中并没有CertGetNameString的声明,比较奇怪
#pragma comment(lib, "crypt32.lib") // 导入连接库
meiggy 2004-07-03
  • 打赏
  • 举报
回复
新建一个VC的console application,都拷进去编译不就完了。
runall 2004-07-03
  • 打赏
  • 举报
回复
.net也可以编译,新建一个vc的控制台工程就可以
tigerwen01 2004-07-03
  • 打赏
  • 举报
回复
请问以上各位高手,具体编译的命令如何写?是否需要安装VC编译器?
另外,使用VS.NET可以编译吗?
xjp6688 2004-07-03
  • 打赏
  • 举报
回复
用VC就可以或者用BCB
北极猩猩 2004-07-03
  • 打赏
  • 举报
回复
这应该是一个纯C的程序。不过程序好像并不完整。
用VC编译就可以了
runall 2004-07-03
  • 打赏
  • 举报
回复
当然是c语言了
用vc编译

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧