智能卡 CMS 解密

Raz*_*o3p 3 c# bouncycastle smartcard

我正在使用Bouncycastle来管理我的项目的加密功能。我设法使用CMS进行加密和解密,其中两个密钥都存储在我的文件系统(a.cert和 a .p12)中。

这是我实际使用的两个函数:

private static byte[] CmsEncrypt(byte[] message)
{
    var envelopGenerator = new CmsEnvelopedDataGenerator();
    var certificateStream = new FileStream("Test.cer", FileMode.Open, FileAccess.Read);
    var cert = new X509CertificateParser().ReadCertificate(certificateStream);
    envelopGenerator.AddKeyTransRecipient(cert);
    return
        envelopGenerator.Generate(new CmsProcessableByteArray(message), CmsEnvelopedGenerator.DesEde3Cbc)
            .GetEncoded();
}

private static byte[] CmsDecrypt(byte[] encrypted, AsymmetricKeyParameter key, X509Certificate cert)
{
    return new CmsEnvelopedData(encrypted).GetRecipientInfos().GetFirstRecipient(new RecipientID()
    {
        SerialNumber = cert.SerialNumber,
        Issuer = cert.IssuerDN
    }).GetContent(key);
}
Run Code Online (Sandbox Code Playgroud)

现在我必须向前迈出一步,私钥必须在智能卡上,但我真的不知道在这种情况下使用CMS

我可以初始化卡并解密一条简单的消息(使用标准pkcs11,我找到了一个很好的 c# 包装器),但我找不到任何关于如何使用智能卡进行CMS解密的线索。

jar*_*riq 5

AFAIK BouncyCastleSharp 仅使用可以暴露在主机内存中的加密密钥开箱即用。但是,一定不要忘记 Bouncy Castle C# 是一个通用加密库,如果您愿意在较低级别的 API上做一些额外的工作,您也可以将它与无法在主机内存中公开的密钥一起使用。此类密钥通常存储在专用加密硬件中,即智能卡、HSM、TPM,并且通常只能通过专用加密 API 访问和使用,例如 MS CryptoAPI(仅限 Windows)和/或 PKCS#11 API(多平台)。

我创建了一个示例应用程序 - Pkcs7SignatureGenerator - 用于使用Pkcs11Interop(我是其作者)和Bouncy Castle库创建 CMS 签名。在此应用程序中,Pkcs11Interop 库通过 PKCS#11 API 使用存储在硬件设备中的私钥执行签名操作,Bouncy Castle 库负责构建 CMS (PKCS#7) 签名结构。

在您的情况下,您需要使用 BouncyCastle 库(低级 API)来解析 CMS 结构,然后使用 PKCS#11 库进行低级解密。这种方法要求您进行更多编码并对 CMS 有更深入的了解,但这当然是可以做到的。

顺便说一句,几个月前我正在评估更紧密集成 Pkcs11Interop 和 BouncyCastle 库的可用选项,但我发现 BouncyCastle 关键材料处理 API 不提供所需的抽象级别,因此这种集成需要对库进行重大重写。这将破坏其向后兼容性,并且上游开发人员不会轻易接受 IMO。所以我决定不再继续。

希望这可以帮助。

  • @jariq 实际上,我们(BC)有兴趣为 PKCS#11 或其他外部管理的加密操作添加对 C# API 的支持,尤其是对 CMS、OpenPGP、TLS API 的支持。Java 版本针对这些采用了更新的 API,可以更轻松地以更模块化的方式替换特定步骤,我们希望在 C# 中做类似的事情。这不是关键材料处理的核心级别,但往往涵盖最常见的用例。有什么地方可以让我读到你所追求的那种想法吗? (2认同)