我正在使用保护私钥的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
你走了!!
使用顺序签名循环区域,我可以实现250-280个签名,但不会达到我的加密OEM指定的500签名速度。至少我需要每秒440~480次引援。如何使用Sequential&#39; for &#39;来实现这一目标?环?
为什么我的UNMANAGED并行循环始终抛出异常?即使我处理这些异常,40%的签名都会失败(session.Sign()函数返回null)。为什么会这样?
使用&#34; MANAGED Parallel Loop&#34;代码,我可以达到280的最大速度,因为我得到了顺序签名循环。为什么我的MANAGED并行循环很慢?是因为&#39; 锁&#39;?如果我删除 lock ,它将变为UNMANAGED PARALLEL LOOP。我怎么处理这个?
如果你觉得我的多线程编码(以及整个PKCS11编程和操作)都是错误的,请建议我一些方法来实现最大速度。
如果您觉得,PCKS11Interop Wrapper可能存在问题,这不能让我达到速度,请建议一些其他包装。我使用过NCryptoki,Pkcs11.Net Wrappers,但我无法达到最高速度。
我完全相信我的PKCS11兼容设备能够生成500个签名。我和我的OEM证实了这一点。只有当我通过编程方式(C#或Java)操作设备时,我的速度才会下降。
我请这个论坛的专家在6点以上澄清我。
非常感谢。
Karthick
答案 0 :(得分:3)
您需要为每个签名操作创建新的Session
。
请阅读{em>&#34;第6章 - PKCS#11 v2.20规范的概述&#34; 。这里解释了PKCS#11 API的所有基本概念(包括会话提供的线程/操作隔离)。
完成此强制性阅读后,您可以查看Pkcs11RsaSignature
项目中的Pkcs11Interop.PDF课程,了解有效的代码示例。