软件数字签名 c语言,数字签名,该怎么解决

当前位置:我的异常网» C语言 » 数字签名,该怎么解决

数字签名,该怎么解决

www.myexceptions.net  网友分享于:2013-05-23  浏览:74次

数字签名

请问大神们,关于数字签名有没有什么比较新颖的算法,谢谢!

------解决方案--------------------

#include

#include

#include

#include

#include

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

#define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)

typedef struct {

LPWSTR lpszProgramName;

LPWSTR lpszPublisherLink;

LPWSTR lpszMoreInfoLink;

} SPROG_PUBLISHERINFO, *PSPROG_PUBLISHERINFO;

BOOL GetProgAndPublisherInfo(PCMSG_SIGNER_INFO pSignerInfo,

PSPROG_PUBLISHERINFO Info);

BOOL GetDateOfTimeStamp(PCMSG_SIGNER_INFO pSignerInfo, SYSTEMTIME *st);

BOOL PrintCertificateInfo(PCCERT_CONTEXT pCertContext);

BOOL GetTimeStampSignerInfo(PCMSG_SIGNER_INFO pSignerInfo,

PCMSG_SIGNER_INFO *pCounterSignerInfo);

int _tmain(int argc, TCHAR *argv[])

{

WCHAR szFileName[MAX_PATH];

HCERTSTORE hStore = NULL;

HCRYPTMSG hMsg = NULL;

PCCERT_CONTEXT pCertContext = NULL;

BOOL fResult;

DWORD dwEncoding, dwContentType, dwFormatType;

PCMSG_SIGNER_INFO pSignerInfo = NULL;

PCMSG_SIGNER_INFO pCounterSignerInfo = NULL;

DWORD dwSignerInfo;

CERT_INFO CertInfo;

SPROG_PUBLISHERINFO ProgPubInfo;

SYSTEMTIME st;

ZeroMemory(&ProgPubInfo, sizeof(ProgPubInfo));

__try

{

if (argc != 2)

{

_tprintf(_T("Usage: SignedFileInfo \n"));

return 0;

}

#ifdef UNICODE

lstrcpynW(szFileName, argv[1], MAX_PATH);

#else

if (mbstowcs(szFileName, argv[1], MAX_PATH) == -1)

{

printf("Unable to convert to unicode.\n");

__leave;

}

#endif

// Get message handle and store handle from the signed file.

fResult = CryptQueryObject(CERT_QUERY_OBJECT_FILE,

szFileName,

CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,

CERT_QUERY_FORMAT_FLAG_BINARY,

0,

&dwEncoding,

&dwContentType,

&dwFormatType,

&hStore,

&hMsg,

NULL);

if (!fResult)

{

_tprintf(_T("CryptQueryObject failed with %x\n"), GetLastError());

__leave;

}

// Get signer information size.

fResult = CryptMsgGetParam(hMsg,

CMSG_SIGNER_INFO_PARAM,

0,

NULL,

&dwSignerInfo);

if (!fResult)

{

_tprintf(_T("CryptMsgGetParam failed with %x\n"), GetLastError());

__leave;

}

// Allocate memory for signer information.

pSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSignerInfo);

if (!pSignerInfo)

{

_tprintf(_T("Unable to allocate memory for Signer Info.\n"));

__leave;

}

// Get Signer Information.

fResult = CryptMsgGetParam(hMsg,

CMSG_SIGNER_INFO_PARAM,

0,

(PVOID)pSignerInfo,

&dwSignerInfo);

文章评论

数字签名过程: (1) 发方A用自己的私钥PVA,采用非对称RSA算法,将原文信息进行哈希(hash)运算,并对hash进行加密,即得数字签名DS;(RSACryptoServiceProvider.SignData()) (3) 发方A用对称算法AES的对称密钥SK对原文信息、数字签名SD及发方A证书的公钥PBA采用对称算法加密,得加密信息E;(Rijndael.CreateEncryptor()) (4) 发方用收方B的公钥PBB,采用RSA算法对对称密钥SK加密,形成数字信封DE,就好像将对称密钥SK装到了一个用收方公钥加密的信封里;(RSACryptoServiceProvider.Encrypt()) (5) 发方A将加密信息E和数字信封DE一起发送给收方B; (6) 收方B接受到数字信封DE后,首先用自己的私钥PVB解密数字信封,取出对称密钥SK;(RSACryptoServiceProvider.Decrypt()) (7) 收方B用对称密钥SK通过AES算法解密加密信息E,还原出原文信息、数字签名SD及发方A证书的公钥PBA;(Rijndael.CreateDecryptor()) (8) 收方B验证数字签名,先用发方A的公钥解密数字签名得数字摘要MD; (9) 收方B同时将原文信息用同样的哈希运算,得一个新的数字摘要MD`;(RSACryptoServiceProvider.VerifyData()) (10)将两个数字摘要MD和MD`进行比较,验证原文是否被修改。如果二者相等,说明数据没有被篡改,是保密传输的,签名是真实的;否则拒绝该签名。 程序用法: “生成证书”按钮,生成发送方、接收方对应的公钥证书和私钥证书。 “签名”按钮,使用发送方私钥、发送方公钥、接收方公钥对文本框中的文本进行数字签名。得到签名后的文本。 “还原验证”按钮,使用接收方私钥将签名后的文本还原,并进行验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值