有没有大侠用CryptoAPI做过数字签名?

chenwangdu 2002-04-22 02:08:52
小弟正在为此发愁,有没有那位做过,贴个例子出来吧
...全文
66 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
winfit 2002-04-22
  • 打赏
  • 举报
回复
你想看更多的文档,请到http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
把所有platform SDK装上去,就有很多关于crypto api函数啦
挺拔的劲松 2002-04-22
  • 打赏
  • 举报
回复
sc
winfit 2002-04-22
  • 打赏
  • 举报
回复
while(dwPropId = CertEnumCertificateContextProperties(
pCertContext, // The context whose properties are to be listed.
dwPropId)) // Number of the last property found. This must
// be zero to find the first property identifier.
{
//--------------------------------------------------------------------
// When the loop is executed, a property identifier has been found.
// Print the property number.

printf("Property # %d found->", dwPropId);

//--------------------------------------------------------------------
// Indicate the kind of property found.

switch(dwPropId)
{
case CERT_FRIENDLY_NAME_PROP_ID:
{
printf("Friendly name: ");
break;
}
case CERT_SIGNATURE_HASH_PROP_ID:
{
printf("Signature hash identifier ");
break;
}
case CERT_KEY_PROV_HANDLE_PROP_ID:
{
printf("KEY PROVE HANDLE");
break;
}
case CERT_KEY_PROV_INFO_PROP_ID:
{
printf("KEY PROV INFO PROP ID ");
break;
}
case CERT_SHA1_HASH_PROP_ID:
{
printf("SHA1 HASH identifier");
break;
}
case CERT_MD5_HASH_PROP_ID:
{
printf("md5 hash identifier ");
break;
}
case CERT_KEY_CONTEXT_PROP_ID:
{
printf("KEY CONTEXT PROP identifier");
break;
}
case CERT_KEY_SPEC_PROP_ID:
{
printf("KEY SPEC PROP identifier");
break;
}
case CERT_ENHKEY_USAGE_PROP_ID:
{
printf("ENHKEY USAGE PROP identifier");
break;
}
case CERT_NEXT_UPDATE_LOCATION_PROP_ID:
{
printf("NEXT UPDATE LOCATION PROP identifier");
break;
}
case CERT_PVK_FILE_PROP_ID:
{
printf("PVK FILE PROP identifier ");
break;
}
case CERT_DESCRIPTION_PROP_ID:
{
printf("DESCRIPTION PROP identifier ");
break;
}
case CERT_ACCESS_STATE_PROP_ID:
{
printf("ACCESS STATE PROP identifier ");
break;
}
case CERT_SMART_CARD_DATA_PROP_ID:
{
printf("SMART_CARD DATA PROP identifier ");
break;
}
case CERT_EFS_PROP_ID:
{
printf("EFS PROP identifier ");
break;
}
case CERT_FORTEZZA_DATA_PROP_ID:
{
printf("FORTEZZA DATA PROP identifier ");
break;
}
case CERT_ARCHIVED_PROP_ID:
{
printf("ARCHIVED PROP identifier ");
break;
}
case CERT_KEY_IDENTIFIER_PROP_ID:
{
printf("KEY IDENTIFIER PROP identifier ");
break;
}
case CERT_AUTO_ENROLL_PROP_ID:
{
printf("AUTO ENROLL identifier. ");
break;
}
} // End switch

//--------------------------------------------------------------------
// Retrieve information on the property by first getting the size
// of the property size.
// For details, see CertGetCertificateContextProperty.

if(CertGetCertificateContextProperty(
pCertContext,
dwPropId ,
NULL,
&cbData))
{
// Continue.
}
else
{
// If the first call to the function failed,
// exit to an error routine.
HandleError("Call #1 to GetCertContextProperty failed.");
}
//--------------------------------------------------------------------
// The call succeeded. Use the size to allocate memory
// for the property.

if(pvData = (void*)malloc(cbData))
{
// Memory is allocated. Continue.
}
else
{
// If memory allocation failed, exit to an error routine.
HandleError("Memory allocation failed.");
}
//-----------------------------------------------------------------
// Allocation succeeded. Retrieve the property data.

if(CertGetCertificateContextProperty(
pCertContext,
dwPropId,
pvData,
&cbData))
{
// The data has been retrieved. Continue.
}
else
{
// If error occurred in the second call, exit to an error routine.
HandleError("Call #2 failed.");
}
//----------------------------------------------------------------
// Show the results.

printf("The Property Content is %d \n", pvData);

//-----------------------------------------------------------------
// Free the certificate context property memory.

free(pvData);
} // End inner while
} // End outer while

//--------------------------------------------------------------------
// Select an new certifcate using UI. This function call works only
// for Windows XP and later.

if(!(pCertContext = CryptUIDlgSelectCertificateFromStore(
hCertStore,
NULL,
NULL,
NULL,
CRYPTUI_SELECT_LOCATION_COLUMN,
0,
NULL)))
{
HandleError("Select UI failed." );
}


//--------------------------------------------------------------------
// Clean up.

CertFreeCertificateContext(pCertContext);
CertCloseStore(hCertStore,0);
printf("The function completed successfully. \n");
} // End of main

//--------------------------------------------------------------------
// This example uses the function HandleError, a simple error
// handling function, to print an error message to the standard error
// (stderr) file and exit the program.
// For most applications, replace this function with one
// that does more extensive error reporting.

void HandleError(char *s)
{
fprintf(stderr,"An error occurred in running the program. \n");
fprintf(stderr,"%s\n",s);
fprintf(stderr, "Error number %x.\n", GetLastError());
fprintf(stderr, "Program terminating. \n");
exit(1);
} // End of HandleError.
winfit 2002-04-22
  • 打赏
  • 举报
回复
//--------------------------------------------------------------------
// In this and all other sample and example code,
// use the #define and #include statements listed
// under #includes and #defines.

#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#include <cryptuiapi.h>

#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void HandleError(char *s);

void main(void)
{

//--------------------------------------------------------------------
// This program lists all of the certificates in a system certificate
// store and all of the property identifier numbers of those
// certificates. It also demonstrates the use of two
// UI functions. One, CryptUIDlgSelectCertificateFromStore,
// displays the certificates in a store
// and allows the user to select one of them,
// The other, CryptUIDlgViewContext,
// displays the contents of a single certificate.

//--------------------------------------------------------------------
// Declare and initialize variables.

HCERTSTORE hCertStore;
PCCERT_CONTEXT pCertContext=NULL;
char pszNameString[256];
char pszStoreName[256];
void* pvData;
DWORD cbData;
DWORD dwPropId = 0;
// Zero must be used on the first
// call to the function. After that,
// the last returned property identifier is passed.

//--------------------------------------------------------------------
// Begin processing. Get the name of the system certificate store
// to be enumerated. Output here is to stderr so that the program can
// be run from the command line and stdout can be redirected to a
// file.

fprintf(stderr,"Please enter the store name:");
scanf("%s",pszStoreName);
fprintf(stderr,"The store name is %s .\n",pszStoreName);

//--------------------------------------------------------------------
// Open a system certificate store.

if ( hCertStore = CertOpenSystemStore(
NULL,
pszStoreName))
{
fprintf(stderr,"The %s store has been opened. \n", pszStoreName);
}
else
{
// If the store was not opened, exit to an error routine.
HandleError("The store was not opened.");
}

//--------------------------------------------------------------------
// Use CertEnumCertificatesInStore to get the certificates
// from the open store. pCertContext must be reset to
// NULL to retrieve the first certificate in the store.

// pCertContext = NULL;

while(pCertContext= CertEnumCertificatesInStore(
hCertStore,
pCertContext))
{
//--------------------------------------------------------------------
// A certificate was retrieved. Continue.
//--------------------------------------------------------------------
// Display the certifcate. This function call works only
// for Windows XP and later.

if ( CryptUIDlgViewContext(
CERT_STORE_CERTIFICATE_CONTEXT,
pCertContext,
NULL,
NULL,
0,
NULL))
{
// printf("OK\n");
}
else
{
HandleError("UI failed.");
}

if(CertGetNameString(
pCertContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
0,
NULL,
pszNameString,
128))
{
printf("\nCertificate for %s \n",pszNameString);
}
else
fprintf(stderr,"CertGetName failed. \n");

//--------------------------------------------------------------------
// Loop to find all of the property identifiers for the specified
// certificate. The loop continues until
// CertEnumCertificateContextProperties returns zero.

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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