3

我正在使用 PKCS11 Compliant Crypto Device 来保护我的私钥。加密设备每秒能够生成 500 个 RSA-2048 位签名。我在 C#.NET 中编写了一个与 PKCS11Interop Wrapper 接口的应用程序。这是我的代码:

#region Initialization 
Pkcs11 pkcs11 = new Pkcs11(pkcsLibraryPath, true);

Slot slot = pkcs11.GetSlotList(true)[slotIndex]; 

Session session = slot.OpenSession(false); 

session.Login(CKU.CKU_USER, hsmPIN); 

List<ObjectAttribute> searchObject = new List<ObjectAttribute>(2);

searchObject.Add(new ObjectAttribute(CKA.CKA_CLASS,(uint)CKO.CKO_PRIVATE_KEY));

searchObject.Add(new ObjectAttribute(CKA.CKA_LABEL, keyLabelName));

ObjectHandle privateKeyHandle = session.FindAllObjects(searchObject)[0];

byte[] dataToBeSigned = new byte[500];

byte[] signature = new byte[dataToBeSigned.Length];
#endregion Initialization 

#region SEQUENTIAL Signing Loop 
for(int i = 0; i<500;i++)
{

signature[i] = session.Sign(new Mechanism(CKM.CKM_SHA256_RSA_PKCS_PSS) , privateKeyHandle , dataToBeSigned[i]);

}
#endregion SEQUENTIAL Signing Loop 

#region UNMANAGED Parallel Loop 
Parallel.For(0, dataToBeSigned.Length, index =>
{

signature[index] = session.Sign(new Mechanism(CKM.CKM_SHA256_RSA_PKCS_PSS) , privateKeyHandle , dataToBeSigned[index]);

});
#endregion UNMANAGED Parallel Loop 

#region MANAGED Parallel Loop  
Parallel.For(0, dataToBeSigned.Length, index =>
{

lock(session)
{

signature[index] = session.Sign(new Mechanism(CKM.CKM_SHA256_RSA_PKCS_PSS) , privateKeyHandle , dataToBeSigned[index]);
}

});
#endregion MANAGED Parallel Loop  

干得好!!

  1. 使用顺序签名循环区域,我只能实现 250-280 个签名,但不能达到我的 Crypto OEM 指定的 500 个签名的速度。至少我每秒需要 440~480 个签名。如何使用 Sequential ' for ' 循环来实现这一点?

  2. 为什么我的 UNMANAGED Parallel 循环总是抛出异常?即使我处理了这些异常,40% 的签名也会失败(session.Sign() 函数返回 null)。为什么会这样?

  3. 使用“MANAGED Parallel Loop”代码,我可以达到 280 的最大速度,就像使用顺序签名循环一样。为什么我的 MANAGED Parallel 循环很慢?是因为''吗?如果我删除了,它就变成了 UNMANAGED PARALLEL LOOP。我该如何处理?

  4. 如果您觉得我的多线程编码(以及整个 PKCS11 编程和操作)是错误的,请建议我一些方法来达到最大速度。

  5. 如果您觉得 PCKS11Interop Wrapper 可能存在问题,无法让我达到速度,请建议其他一些包装器。我使用了 NCryptoki、Pkcs11.Net Wrappers,但我无法达到最大速度。

  6. 我 100% 确信我的 PKCS11 兼容设备能够生成 500 个签名。我与我的 OEM 确认了这一点。只有当我通过编程方式(C# 或 Java)操作设备时,我的速度才会下降。

我请本论坛的专家就以上6点给我澄清。

非常感谢。

卡西克

4

1 回答 1

3

您需要Session为每个签名操作创建新的。

请阅读PKCS#11 v2.20规范的“第 6 章 - 概述” 。那里解释了 PKCS#11 API 的所有基本概念(包括会话提供的线程/操作隔离)。

完成此必读后,您可以查看Pkcs11Interop.PDFPkcs11RsaSignature项目中的类以获取工作代码示例。

于 2017-04-04T14:47:19.563 回答