`

证书的数字签名和认证 示例代码

    博客分类:
  • VC
阅读更多

#include "stdafx.h"
#include <malloc.h>
#include <windows.h>
#include <wincrypt.h>

#pragma comment(lib, "Crypt32.lib")

#define	MY_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#define	SIGNER_NAME			L"yangsheng"
#define	CERT_STORE_NAME		L"MY"

void HandleError(char* s);

int main(int argc, char* argv[])
{
	HCERTSTORE hStoreHandle; 
	BYTE* pbMessage = (BYTE*)"Need sign message";

	DWORD cbMessage = strlen((char*)pbMessage)+1;
	PCCERT_CONTEXT pSignerCert;

	CRYPT_SIGN_MESSAGE_PARA SigParams;
	DWORD cbSignedMessageBlob;
	BYTE* pbSignedMessageBlob;                                                                                         


	const BYTE* MessageArray[] = {pbMessage};
	DWORD MessageSizeArray[1];
	MessageSizeArray[0] = cbMessage;

	//start sign .....
	printf("raw message....\n");
	printf("%s\n",pbMessage);

	
	if(!(hStoreHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,NULL,CERT_SYSTEM_STORE_CURRENT_USER, CERT_STORE_NAME)))
	{
		printf("open cert store failed!");
	}

	//Get sign cert pointer
	if(pSignerCert = CertFindCertificateInStore(hStoreHandle,MY_TYPE,0,CERT_FIND_SUBJECT_STR,SIGNER_NAME,NULL))
	{
		printf("find a cert ok.....\n");
	}
	else
	{
		printf("cann't look a cert!\n");
	}

	//sign struct initialize
	SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
	SigParams.dwMsgEncodingType = MY_TYPE;
	SigParams.pSigningCert = pSignerCert;
	SigParams.HashAlgorithm.pszObjId = szOID_RSA_MD5;
	SigParams.HashAlgorithm.Parameters.cbData = NULL;
	SigParams.cMsgCert = 1;
	SigParams.rgpMsgCert = &pSignerCert;
	SigParams.cAuthAttr = 0;
	SigParams.dwInnerContentType = 0;
	SigParams.cMsgCrl = 0;
	SigParams.cUnauthAttr = 0;
	SigParams.dwFlags = 0;
	SigParams.pvHashAuxInfo = NULL;
	SigParams.rgAuthAttr = NULL;

	
	if(CryptSignMessage(&SigParams,FALSE,1,MessageArray,MessageSizeArray,NULL,&cbSignedMessageBlob))
	{
		printf("sign after size %d\n",cbSignedMessageBlob);
	}

	
	if(!(pbSignedMessageBlob = (BYTE*)malloc(cbSignedMessageBlob)))
	{
		printf("alloc failed!\n");
	}
	
	if(CryptSignMessage(&SigParams,FALSE,1,MessageArray,MessageSizeArray,pbSignedMessageBlob,&cbSignedMessageBlob))
	{
		printf("sign successful!!\n");
	}

	/*
	verify sign
	*/
	DWORD cbDecodeMessageBlob;
	BYTE* pbDecodeMessageBlob;

	CRYPT_VERIFY_MESSAGE_PARA verifyParams;

	verifyParams.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
	verifyParams.dwMsgAndCertEncodingType = MY_TYPE;
	verifyParams.hCryptProv = 0;
	verifyParams.pfnGetSignerCertificate = NULL;
	verifyParams.pvGetArg = NULL;

	if(CryptVerifyMessageSignature(&verifyParams,0,pbSignedMessageBlob,cbSignedMessageBlob,NULL,&cbDecodeMessageBlob,NULL))
	{
		printf("total buffer%d\n",cbDecodeMessageBlob);
	}

	if(!(pbDecodeMessageBlob = (BYTE*)malloc(cbDecodeMessageBlob)))
	{
		printf("alloc failed!\n");
	}
	if(CryptVerifyMessageSignature(&verifyParams,0,pbSignedMessageBlob,cbSignedMessageBlob,pbDecodeMessageBlob,&cbDecodeMessageBlob,NULL))
	{
		printf("verify message:\n%s\n",(char*)pbDecodeMessageBlob);
	}
	/*
	some release operation........
	*/
	if(pbSignedMessageBlob)
		free(pbSignedMessageBlob);

	if(pbDecodeMessageBlob)
		free(pbDecodeMessageBlob);

	if(pSignerCert)
		CertFreeCertificateContext(pSignerCert);

	if(CertCloseStore(hStoreHandle,CERT_CLOSE_STORE_CHECK_FLAG))
	{
		printf("all release...\n");
	}
	else
	{
		printf(".......");
	}
	return 0;
}
 
分享到:
评论

相关推荐

    数字证书签名很强大的算法

    数字签名生成.txt文件可能包含了关于如何创建和验证数字签名的步骤和示例代码。在实际应用中,数字签名不仅用于电子邮件的安全传输,还广泛应用于HTTPS协议(网站的SSL/TLS证书)、软件发布(确保软件未被篡改)以及...

    Java 数字签名、数字证书生成源码

    Java 数字签名和数字证书是网络安全领域中的重要概念,它们在确保数据的完整性和认证信息来源的可靠性方面发挥着关键作用。在这个Java源码包中,我们可能找到了用于生成数字签名和数字证书的相关代码,这对于理解和...

    filedsv 数字签名的软件

    在合同签署中,数字签名提供了法律认可的身份认证和不可否认性。 **总结** filedsv软件是理解和实践数字签名技术的一个实用工具。通过使用该软件,用户可以学习到数字签名的工作原理,体验其在数据安全和身份验证...

    常见加解密及数字签名Demo

    本示例"常见加解密及数字签名Demo"旨在提供一个实践性的平台,帮助开发者理解和应用这些概念。以下将详细介绍这两个主题以及可能涉及的相关知识点。 首先,加解密是确保数据安全的基本手段。加密是将明文信息转化为...

    Java 数字签名和验证

    Java 数字签名是一种用于确保数据完整性和来源可信性的安全机制,它在网络安全中扮演着至关重要的角色。在Java中,我们可以使用内置的Java Cryptography Extension (JCE)库来实现RSA、DSA和ECC这三种不同的签名算法...

    数字签名软件

    `www.pudn.com.txt`可能是指向该网站上关于数字签名软件的更多资料,而`v30CSharpdemoSQL`可能是一个SQL数据库文件,包含示例代码或测试数据,用于演示如何在C#环境中操作数字签名。 综上所述,C#实现的数字签名...

    Android数字签名

    Android数字签名是...总结来说,Android数字签名是保障应用安全性和可信任性的重要步骤,它确保了应用的源代码完整性和开发者身份的真实性。开发者需要理解并掌握这一过程,以便于正确发布和分发Android应用程序。

    java数字签名

    在提供的`java数字签名jar.rar`和`java数字签名.zip`文件中,可能包含了具体的示例代码,展示了如何使用Java实现这些步骤。通过查看和学习这些代码,你可以更好地理解Java中的数字签名工作原理,以及如何在实际项目...

    Java加密和数字签名编程快速入门

    1. 数字签名概念:数字签名结合了非对称加密和哈希函数,提供数据完整性验证和发送者身份认证。 2. Signature类:Java提供的数字签名接口,可以实现RSA、DSA等算法。 3. 签名过程:生成消息摘要(哈希值),用私钥...

    添加数字签名器 免杀工具

    7. **适用场景**:数字签名广泛应用于软件分发、电子邮件安全、移动应用签名、代码签名等领域,以增强数据交换的安全性和可信度。 在“添加数字签名3”这个压缩包文件中,很可能包含了实现这一过程的相关工具、教程...

    DSA数字签名例子

    DSA,全称Digital Signature Algorithm(数字签名算法),是一种基于公钥密码学的数字签名协议,由美国国家安全局(NSA)设计,旨在提供一个安全的数据认证方法。在电子通信和互联网交易中,DSA数字签名被广泛用于...

    netty实现SSL/TSL双向加密认证示例

    - 私钥:每个证书都对应一个私钥,用于解密通过公钥加密的数据以及生成数字签名。 2. **配置 SSLContext** - 服务器端:使用 `SslContextBuilder.forServer()` 创建服务器上下文,提供服务器的私钥和证书。 - ...

    数字签名添加工具,简单方便

    `给EXE文件加数字签名.files`可能是一个包含相关辅助文件的目录,这些文件可能包括证书、示例脚本或配置文件,用于支持签名过程。例如,它可能包含了证书存储的位置,或者在批量处理多个EXE文件时需要用到的批处理...

    PKI/CA与数字证书技术大全

    标题"PKI/CA与数字证书技术大全"暗示了主题是关于公钥基础设施(Public Key Infrastructure, PKI)和认证授权机构(Certification Authority, CA),以及与之相关的数字证书技术。这是一套全面的资料,旨在帮助读者...

    java安全通信数字证书

    以下是计算MD5摘要的示例代码: ```java import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class DigestExample { public static void main(String[] args) throws ...

    rsa.rar_RSA数字签名_RSA签名验证

    这个“rsa.rar”压缩包包含的源代码实现了RSA算法在数字签名领域的应用,主要用于验证信息的完整性和来源的真实性。 在数字签名中,RSA算法通常分为两个主要步骤:签名生成和签名验证。以下是对这两个步骤的详细...

    java获取数字证书信息

    下面是一个简单的示例代码片段,用于展示如何从请求中获取X509证书,并打印出其主体名称和证书详情: ```java ;charset=GB2312" %&gt; java.security.cert.X509Certificate[] certs = null; try { certs = (X509...

    java多种方式实现pdf文件电子签名

    项目中的"pdfsign"可能是一个包含示例代码、配置文件或测试PDF的文件夹。开发者可以通过研究这些代码,理解如何使用iTextPDF和PDFBox进行PDF电子签名的实现。在Eclipse这样的IDE中运行这些示例,可以帮助快速掌握并...

    简单的数字认证

    5. **示例用法**:演示如何使用这些函数进行数字认证的示例代码。 在C#中实现数字认证,不仅有助于保护数据安全,还能防止中间人攻击,确保网络通信的完整性。通过深入理解并实践这样的程序,开发者可以提升在信息...

    PKCS7标准签名与验签

    `P7Verify_CSharp`可能是一个包含示例代码或库的压缩文件,它可能提供了更具体的操作步骤和示例,帮助开发者在C#环境中进行PKCS#7签名和验证。通过研究和理解这些代码,你可以更好地理解和应用PKCS#7签名机制,确保...

Global site tag (gtag.js) - Google Analytics