多线程签名生成C#

时间:2017-04-04 09:17:21

标签: pkcs#11 pkcs11interop

我正在使用保护私钥的PKCS11兼容加密设备。加密设备每秒能够生成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个签名,但不会达到我的加密OEM指定的500签名速度。至少我需要每秒440~480次引援。如何使用Sequential&#39; for &#39;来实现这一目标?环?

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

  3. 使用&#34; MANAGED Parallel Loop&#34;代码,我可以达到280的最大速度,因为我得到了顺序签名循环。为什么我的MANAGED并行循环很慢?是因为&#39; &#39;?如果我删除 lock ,它将变为UNMANAGED PARALLEL LOOP。我怎么处理这个?

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

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

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

  7. 我请这个论坛的专家在6点以上澄清我。

    非常感谢。

    Karthick

1 个答案:

答案 0 :(得分:3)

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

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

完成此强制性阅读后,您可以查看Pkcs11RsaSignature项目中的Pkcs11Interop.PDF课程,了解有效的代码示例。