65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 PKCS #12 证书加密和签名数据

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.37/5 (17投票s)

2005年6月12日

CPOL

4分钟阅读

viewsIcon

109217

downloadIcon

1837

使用 PKCS #12 证书加密和签名数据。

下载源代码 - 482 Kb

引言

本文介绍如何使用 .NET 1.1 中的 Microsoft CryptoAPI 2.0 通过 PKCS # 12 (.pfx) 证书对数据进行加密/解密和签名/验证。[但是,仅当 PKCS # 12 证书的私钥可导出时,加密和验证才能正常工作]

解释

由于 .NET 2.0 已进入最后阶段,并且我们拥有支持 PKI(公钥基础设施)的 .NET 2.0 Beta 2 版本,该版本支持使用证书加密和签名数据。但 .NET 1.1 呢?要在 .NET 1.1 中使用 PKI 这样的功能,我们需要一个 P/Invoke 类型的解决方案,即 Microsoft CryptoAPI(另一种是 CAPICOM 2.0)。在本文中,我们将使用 MS CrypotAPI 2.0 中一些有用的证书函数来完成我们的任务。

但是,Windows XP Professional 引入了一些新的证书函数,可以使证书的用户界面更加易用,因此我们的代码只能在 Windows XP Professional 或 Windows 2003 Server 上运行。最后,我将介绍一种在 Windows 2000 Professional 或 2000 Server 上使用此功能的方法。

我将只讨论两个新的 MS CryptoAPI 2.0 函数:CryptUIDlgSelectCertificateFromStoreCryptUIDlgCertMgr,以及我为使用 PKCS12 证书进行加密和签名而实现的技术。

有关其他代码,请下载源代码链接。不用担心,它带有详细的注释和嵌入的 .chm 帮助文件,以简化操作。

  • CryptUIDlgSelectCertificateFromStore

    CryptUIDlgSelectCertificateFromStore 函数显示一个对话框,允许从指定的存储区选择证书。对话框如下图所示。

    该函数在 Windows XP Professional 或 2003 Server 上运行。请参阅 MSDN(Platform SDK > Security>CrypotAPIFunctions)。

  • CryptUIDlgCertMgr

    CryptUIDlgCertMgr 函数显示一个对话框,允许用户管理证书。对话框如下图所示。

    该函数在 Windows XP Professional 或 2003 Server 上运行。请参阅 MSDN(Platform SDK > Security>CrypotAPIFunctions)。

加密和解密工作原理

对于加密,概念很简单。我初始化一个 RijndaelManaged 新对象,并生成其随机密钥和 IV(Initialization Vectors)。然后,我使用所选 PKCS12 证书的公钥加密密钥和 IV,并将它们作为文本文件导出到“我的文档”目录(当前线程登录的用户)。

同样,对于解密,密钥和 IV 都通过所选的同一个 PKCS12 证书的相应私钥进行解密。

现在,如果您愿意,可以将这两个文件发送给拥有相同 PKCS12 证书的其他人,以便他们可以使用该证书的相应私钥进行解密。

签名和验证工作原理

对于签名,我初始化新对象,并使用所选 PKCS12 证书的私钥加密要签名的数据,然后将其作为文本文件导出到“我的文档”目录(当前线程登录的用户)。

同样,对于验证,我首先使用所选的同一个 PKCS12 证书的相应公钥解密签名。

但是,加密和签名中的所有加密数据均以 Base64 格式显示。

如何在 Windows 2000 Professional 或 2000 Server 上运行代码

由于 CryptUIDlgSelectCertificateFromStoreCryptUIDlgCertMgr 都只能在 Windows XP 或 2003 Server 上运行,因此要在 Windows 2000 上使用上述功能,代码需要稍作调整。您需要构建自己的界面,并使用以下 CrypotAPI 函数之一,而不是这两个函数:

  1. CertEnumCertificatesInStore

    CertEnumCertificatesInStore 函数检索证书存储中的第一个或下一个证书。在循环中使用此函数可以按顺序检索证书存储中的所有证书。

  2. CertFindCertificateInStore

    CertFindCertificateInStore 函数在证书存储中查找第一个或下一个与 dwFindType 及其关联的 pvFindPara 建立的搜索条件匹配的证书上下文。此函数可在循环中使用,以查找证书存储中与指定查找条件匹配的所有证书

您可以使用其中任何一个。如果您使用第一个函数,则列出存储中的证书并让用户选择一个 PKCS12 证书;如果您使用第二个函数,则让用户输入存储中证书名称的搜索字符串,其余代码保持不变。两个 API 函数都列在源代码中。源代码还包含一个示例 PKCS12 证书,密码为 **sam**。

结论

我一直乐于助人,如果您对我的文章有任何疑问或建议,请随时通过 Adahmed911@hotmail.com 发送电子邮件给我。您也可以在 MSN Messenger 上通过屏幕名称“Maxima”联系我。

© . All rights reserved.