怎么取文件的数字签名

16 篇文章 0 订阅

验证文件数字签名是否有效可以使用函数 WinVerifyTrust

取得文件数字签名证书信息需要使用函数 CryptQueryObject。

// FileSign.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h”
#include <windows.h>
#include <wincrypt.h>
#include <wintrust.h>
#include <stdio.h>
#include <tchar.h>
#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 <filename>\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);  
    if (!fResult)  
    {  
        _tprintf(_T("CryptMsgGetParam failed with %x\n"), GetLastError());  
        __leave;  
    }  

    // Get program name and publisher information from  
    // signer info structure.  
    //获取程序名和发布者信息  
    if (GetProgAndPublisherInfo(pSignerInfo, &ProgPubInfo))  
    {  
        if (ProgPubInfo.lpszProgramName != NULL)  
        {  
            wprintf(L"Program Name : %s\n",  
                ProgPubInfo.lpszProgramName);  
        }  
        if (ProgPubInfo.lpszPublisherLink != NULL)  
        {  
            wprintf(L"Publisher Link : %s\n",  
                ProgPubInfo.lpszPublisherLink);  
        }  
        if (ProgPubInfo.lpszMoreInfoLink != NULL)  
        {  
            wprintf(L"MoreInfo Link : %s\n",  
                ProgPubInfo.lpszMoreInfoLink);  
        }  
    }  
    _tprintf(_T("\n")); 

    // Search for the signer certificate in the temporary  
    // certificate store.  
    CertInfo.Issuer = pSignerInfo->Issuer;  
    CertInfo.SerialNumber = pSignerInfo->SerialNumber;  
    pCertContext = CertFindCertificateInStore(
        hStore,  
        ENCODING,  
        0,  
        CERT_FIND_SUBJECT_CERT,  
        (PVOID)&CertInfo,  
        NULL);  
    if (!pCertContext)  
    {  
        _tprintf(_T("CertFindCertificateInStore failed with %x\n"),  
            GetLastError());  
        __leave;  
    }  

    // Print Signer certificate information.  
    _tprintf(_T("Signer Certificate:\n\n"));  
    PrintCertificateInfo(pCertContext);  
    _tprintf(_T("\n"));  

    // Get the timestamp certificate signerinfo structure.  
    if (GetTimeStampSignerInfo(pSignerInfo, &pCounterSignerInfo))  
    {  
        // Search for Timestamp certificate in the temporary  
        // certificate store.  
        CertInfo.Issuer = pCounterSignerInfo->Issuer;  
        CertInfo.SerialNumber = pCounterSignerInfo->SerialNumber;  
        pCertContext = CertFindCertificateInStore(hStore,  
            ENCODING,  
            0,  
            CERT_FIND_SUBJECT_CERT,  
            (PVOID)&CertInfo,  
            NULL);  
        if (!pCertContext)  
        {  
            _tprintf(_T("CertFindCertificateInStore failed with %x\n"),  
                GetLastError());  
            __leave;  
        }  

        // Print timestamp certificate information.  
        _tprintf(_T("TimeStamp Certificate:\n\n"));  
        PrintCertificateInfo(pCertContext);  
        _tprintf(_T("\n"));  

        // Find Date of timestamp.  
        if (GetDateOfTimeStamp(pCounterSignerInfo, &st))  
        {  
            _tprintf(_T("Date of TimeStamp : %02d/%02d/%04d %02d:%02d\n"),  
                st.wMonth,  
                st.wDay,  
                st.wYear,  
                st.wHour,  
                st.wMinute);  
        }  
        _tprintf(_T("\n"));  
    }  
}  
__finally  
{  
    // Clean up.  
    if (ProgPubInfo.lpszProgramName != NULL)  
        LocalFree(ProgPubInfo.lpszProgramName);  
    if (ProgPubInfo.lpszPublisherLink != NULL)  
        LocalFree(ProgPubInfo.lpszPublisherLink);  
    if (ProgPubInfo.lpszMoreInfoLink != NULL)  
        LocalFree(ProgPubInfo.lpszMoreInfoLink);  
    if (pSignerInfo != NULL) LocalFree(pSignerInfo);  
    if (pCounterSignerInfo != NULL) LocalFree(pCounterSignerInfo);  
    if (pCertContext != NULL) CertFreeCertificateContext(pCertContext);  
    if (hStore != NULL) CertCloseStore(hStore, 0);  
    if (hMsg != NULL) CryptMsgClose(hMsg);  
}  
return 0;  

}

BOOL PrintCertificateInfo(PCCERT_CONTEXT pCertContext)
{
BOOL fReturn = FALSE;
LPTSTR szName = NULL;
DWORD dwData;
__try
{
// Print Serial Number.
_tprintf(_T(“Serial Number: “));
dwData = pCertContext->pCertInfo->SerialNumber.cbData;
for (DWORD n = 0; n < dwData; n++)
{
_tprintf(_T(”%02x “),
pCertContext->pCertInfo->SerialNumber.pbData[dwData - (n + 1)]);
}
_tprintf(_T(”\n”));

    // Get Issuer name size.  
    if (!(dwData = CertGetNameString(pCertContext,  
        CERT_NAME_SIMPLE_DISPLAY_TYPE,  
        CERT_NAME_ISSUER_FLAG,  
        NULL,  
        NULL,  
        0)))  
    {  
        _tprintf(_T("CertGetNameString failed.\n"));  
        __leave;  
    }  

    // Allocate memory for Issuer name.  
    szName = (LPTSTR)LocalAlloc(LPTR, dwData * sizeof(TCHAR));  
    if (!szName)  
    {  
        _tprintf(_T("Unable to allocate memory for issuer name.\n"));  
        __leave;  
    }  

    // Get Issuer name.  
    if (!(CertGetNameString(pCertContext,  
        CERT_NAME_SIMPLE_DISPLAY_TYPE,  
        CERT_NAME_ISSUER_FLAG,  
        NULL,  
        szName,  
        dwData)))  
    {  
        _tprintf(_T("CertGetNameString failed.\n"));  
        __leave;  
    }  

    // print Issuer name.  
    _tprintf(_T("Issuer Name: %s\n"), szName);  
    LocalFree(szName);  
    szName = NULL;  

    // Get Subject name size.  
    if (!(dwData = CertGetNameString(
        pCertContext, 
        CERT_NAME_SIMPLE_DISPLAY_TYPE,  
        0,  
        NULL,  
        NULL,  
        0)))  
    {  
        _tprintf(_T("CertGetNameString failed.\n"));  
        __leave;  
    }  

    // Allocate memory for subject name.  
    szName = (LPTSTR)LocalAlloc(LPTR, dwData * sizeof(TCHAR));  
    if (!szName)  
    {  
        _tprintf(_T("Unable to allocate memory for subject name.\n"));  
        __leave;  
    }  

    // Get subject name.  
    if (!(CertGetNameString(pCertContext,  
        CERT_NAME_SIMPLE_DISPLAY_TYPE,  
        0,  
        NULL,  
        szName,  
        dwData)))  
    {  
        _tprintf(_T("CertGetNameString failed.\n"));  
        __leave;  
    }  

    // Print Subject Name.  
    _tprintf(_T("Subject Name: %s\n"), szName);  
    fReturn = TRUE;  
}  
__finally  
{  
    if (szName != NULL) LocalFree(szName);  
}  
return fReturn;  

}

LPWSTR AllocateAndCopyWideString(LPCWSTR inputString)
{
LPWSTR outputString = NULL;
outputString = (LPWSTR)LocalAlloc(LPTR, (wcslen(inputString) + 1) * sizeof(WCHAR));
if (outputString != NULL)
{
lstrcpyW(outputString, inputString);
}
return outputString;
}

BOOL GetProgAndPublisherInfo(PCMSG_SIGNER_INFO pSignerInfo, PSPROG_PUBLISHERINFO Info)
{
BOOL fReturn = FALSE;
PSPC_SP_OPUS_INFO OpusInfo = NULL;
DWORD dwData;
BOOL fResult;
__try
{
// Loop through authenticated attributes and find
// SPC_SP_OPUS_INFO_OBJID OID.
for (DWORD n = 0; n < pSignerInfo->AuthAttrs.cAttr; n++)
{
if (lstrcmpA(SPC_SP_OPUS_INFO_OBJID,
pSignerInfo->AuthAttrs.rgAttr[n].pszObjId) == 0)
{
// Get Size of SPC_SP_OPUS_INFO structure.
fResult = CryptDecodeObject(ENCODING,
SPC_SP_OPUS_INFO_OBJID,
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].pbData,
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].cbData,
0,
NULL,
&dwData);
if (!fResult)
{
_tprintf(_T(“CryptDecodeObject failed with %x\n”),
GetLastError());
__leave;
}

            // Allocate memory for SPC_SP_OPUS_INFO structure.  
            OpusInfo = (PSPC_SP_OPUS_INFO)LocalAlloc(LPTR, dwData);  
            if (!OpusInfo)  
            {  
                _tprintf(_T("Unable to allocate memory for Publisher Info.\n"));  
                __leave;  
            }  

            // Decode and get SPC_SP_OPUS_INFO structure.  
            fResult = CryptDecodeObject(ENCODING,  
                SPC_SP_OPUS_INFO_OBJID,  
                pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].pbData,  
                pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].cbData,  
                0,  
                OpusInfo,  
                &dwData);  
            if (!fResult)  
            {  
                _tprintf(_T("CryptDecodeObject failed with %x\n"),  
                    GetLastError());  
                __leave;  
            }  

            // Fill in Program Name if present.  
            if (OpusInfo->pwszProgramName)  
            {  
                Info->lpszProgramName =  
                    AllocateAndCopyWideString(OpusInfo->pwszProgramName);  
            }  
            else  
                Info->lpszProgramName = NULL; 

            // Fill in Publisher Information if present.  
            if (OpusInfo->pPublisherInfo)  
            {  
                switch (OpusInfo->pPublisherInfo->dwLinkChoice)  
                {  
                case SPC_URL_LINK_CHOICE:  
                    Info->lpszPublisherLink =  
                        AllocateAndCopyWideString(OpusInfo->pPublisherInfo->pwszUrl);  
                    break;  
                case SPC_FILE_LINK_CHOICE:  
                    Info->lpszPublisherLink =  
                        AllocateAndCopyWideString(OpusInfo->pPublisherInfo->pwszFile);  
                    break;  
                default:  
                    Info->lpszPublisherLink = NULL;  
                    break;  
                }  
            }  
            else  
            {  
                Info->lpszPublisherLink = NULL;  
            }  

            // Fill in More Info if present.  
            if (OpusInfo->pMoreInfo)  
            {  
                switch (OpusInfo->pMoreInfo->dwLinkChoice)  
                {  
                case SPC_URL_LINK_CHOICE:  
                    Info->lpszMoreInfoLink =  
                        AllocateAndCopyWideString(OpusInfo->pMoreInfo->pwszUrl);  
                    break;  
                case SPC_FILE_LINK_CHOICE:  
                    Info->lpszMoreInfoLink =  
                        AllocateAndCopyWideString(OpusInfo->pMoreInfo->pwszFile);  
                    break;  
                default:  
                    Info->lpszMoreInfoLink = NULL;  
                    break;  
                }  
            }  
            else  
            {  
                Info->lpszMoreInfoLink = NULL;  
            }  

            fReturn = TRUE;  
            break; // Break from for loop.  
        } // lstrcmp SPC_SP_OPUS_INFO_OBJID  
    } // for  
}  
__finally  
{  
    if (OpusInfo != NULL) LocalFree(OpusInfo);  
}  
return fReturn;  

}

BOOL GetDateOfTimeStamp(PCMSG_SIGNER_INFO pSignerInfo, SYSTEMTIME *st)
{
BOOL fResult;
FILETIME lft, ft;
DWORD dwData;
BOOL fReturn = FALSE;
// Loop through authenticated attributes and find
// szOID_RSA_signingTime OID.
for (DWORD n = 0; n < pSignerInfo->AuthAttrs.cAttr; n++)
{
if (lstrcmpA(szOID_RSA_signingTime, pSignerInfo->AuthAttrs.rgAttr[n].pszObjId) == 0)
{
// Decode and get FILETIME structure.
dwData = sizeof(ft);
fResult = CryptDecodeObject(ENCODING,
szOID_RSA_signingTime,
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].pbData,
pSignerInfo->AuthAttrs.rgAttr[n].rgValue[0].cbData,
0,
(PVOID)&ft,
&dwData);
if (!fResult)
{
_tprintf(_T(“CryptDecodeObject failed with %x\n”),
GetLastError());
break;
}

        // Convert to local time.  
        FileTimeToLocalFileTime(&ft, &lft);  
        FileTimeToSystemTime(&lft, st);  
        fReturn = TRUE;  
        break; // Break from for loop.  
    } //lstrcmp szOID_RSA_signingTime  
} // for  
return fReturn;  

}

BOOL GetTimeStampSignerInfo(PCMSG_SIGNER_INFO pSignerInfo, PCMSG_SIGNER_INFO *pCounterSignerInfo)
{
PCCERT_CONTEXT pCertContext = NULL;
BOOL fReturn = FALSE;
BOOL fResult;
DWORD dwSize;
__try
{
*pCounterSignerInfo = NULL;
// Loop through unathenticated attributes for
// szOID_RSA_counterSign OID.
for (DWORD n = 0; n < pSignerInfo->UnauthAttrs.cAttr; n++)
{
if (lstrcmpA(pSignerInfo->UnauthAttrs.rgAttr[n].pszObjId, szOID_RSA_counterSign) == 0)
{
// Get size of CMSG_SIGNER_INFO structure.
fResult = CryptDecodeObject(ENCODING,
PKCS7_SIGNER_INFO,
pSignerInfo->UnauthAttrs.rgAttr[n].rgValue[0].pbData,
pSignerInfo->UnauthAttrs.rgAttr[n].rgValue[0].cbData,
0,
NULL,
&dwSize);
if (!fResult)
{
_tprintf(_T(“CryptDecodeObject failed with %x\n”),
GetLastError());
__leave;
}

            // Allocate memory for CMSG_SIGNER_INFO.  
            *pCounterSignerInfo = (PCMSG_SIGNER_INFO)LocalAlloc(LPTR, dwSize);  
            if (!*pCounterSignerInfo)  
            {  
                _tprintf(_T("Unable to allocate memory for timestamp info.\n"));  
                __leave;  
            }  

            // Decode and get CMSG_SIGNER_INFO structure  
            // for timestamp certificate.  
            fResult = CryptDecodeObject(ENCODING,  
                PKCS7_SIGNER_INFO,  
                pSignerInfo->UnauthAttrs.rgAttr[n].rgValue[0].pbData,  
                pSignerInfo->UnauthAttrs.rgAttr[n].rgValue[0].cbData,  
                0,  
                (PVOID)*pCounterSignerInfo,  
                &dwSize);  
            if (!fResult)  
            {  
                _tprintf(_T("CryptDecodeObject failed with %x\n"),  
                    GetLastError());  
                __leave;  
            }  
            fReturn = TRUE;  
            break; // Break from for loop.  
        }  
    }  
}  
__finally  
{  
    // Clean up.  
    if (pCertContext != NULL) CertFreeCertificateContext(pCertContext);  
}  
return fReturn;  

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要下载Win7 64位驱动程序数字签名补丁,您可以按照以下步骤进行操作: 1. 打开您的计算机的网络浏览器,例如Google Chrome、Mozilla Firefox等。 2. 进入微软官方网站,网址为https://www.microsoft.com/zh-cn/software-download/windows7。 3. 在页面上方的搜索栏中键入“Win7 64位驱动程序数字签名补丁”并按下回车键。 4. 在搜索结果页面上,找到与您操作系统版本相匹配的补丁下载链接。确保选择适用于64位版本的补丁。 5. 点击下载链接,系统将提示您保存补丁文件。选择一个您方便记忆和访问的位置,然后点击保存。 6. 下载完成后,找到保存的补丁文件并双击打开。按照提示进行安装,通常只需要按照向导的指示进行“下一步”操作即可完成。 7. 安装完成后,系统可能会要求您重新启动计算机才能使补丁生效。按照提示重新启动计算机,并等待系统的重启过程完成。 8. 重新启动后,您可以检查补丁是否成功安装,通常可以通过控制面板中的设备管理器查看驱动程序的数字签名状态。数字签名补丁安装成功后,可以帮助您安全地使用未经数字签名的驱动程序。 请注意,在下载和安装驱动程序数字签名补丁之前,请确保您从可信的来源下载补丁文件,并注意自己的计算机的安全性。 ### 回答2: 要下载Windows 7 64位驱动程序数字签名补丁,可以按照以下步骤进行: 1. 打开您偏好的网络浏览器(如Google Chrome、Mozilla Firefox等)。 2. 在搜索引擎中输入“Windows 7 64位驱动程序数字签名补丁下载”并按下回车键。 3. 检查搜索结果页面,查找可靠和安全的来源。建议从官方网站或知名的软件下载网站下载补丁。 4. 点击适当的链接,进入下载页面。 5. 在下载页面上,可能需要提供您的操作系统和位数(64位)的信息。确保选择正确的选项。 6. 点击“下载”按钮或链接,开始下载补丁文件。 7. 可能需要选择文件保存位置。您可以选择将其保存到计算机的默认下载文件夹或自定义文件夹中。 8. 等待文件下载完成。具体时间决于您的互联网连接速度和文件大小。 9. 一旦下载完成,您可以通过双击补丁文件进行安装。 10. 按照提示完成补丁的安装过程。可能需要接受许可协议和选择安装位置。 11. 安装完成后,您的Win7 64位系统将具备数字签名补丁的功能。 请注意,在下载和安装任何补丁之前,应确保您从可靠和安全的来源下载。此外,最好在安装之前备份您的计算机和重要文件,以防意外发生。 ### 回答3: Win7 64位驱动程序数字签名补丁可以通过多种渠道进行下载。其中最常见的方法是通过官方网站进行下载。以下是您可以按照的步骤: 1. 打开您的浏览器,然后在搜索引擎中输入“Win7 64位驱动程序数字签名补丁下载”进行搜索。 2. 在搜索结果中,找到官方网站或可信的软件下载站点。确保您选择的是正规和可信赖的网站。 3. 进入官方网站或下载站点后,查找与Win7 64位驱动程序数字签名补丁相关的下载链接或页面。 4. 点击下载链接,等待下载过程完成。下载速度决于您的网络连接速度以及文件大小。 5. 下载完成后,双击下载的文件进行安装。确保您已按照操作提示进行正确的安装步骤。 此外,您还可以通过其他途径获Win7 64位驱动程序数字签名补丁。例如,您可以在相关的技术论坛上搜索并查找其他用户共享的下载链接。还可以通过第三方软件平台进行下载,但在使用这些网站或平台时要确保它们是安全可信的。 无论您通过哪种方式获Win7 64位驱动程序数字签名补丁,请务必确保下载的文件是来自可信渠道,并按照指示进行正确的安装。这样可以保证您的计算机的稳定性和安全性,并解决可能存在的驱动程序数字签名问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值