首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程签名生成C#

多线程签名生成C#
EN

Stack Overflow用户
提问于 2017-04-04 09:17:21
回答 1查看 1.3K关注 0票数 3

我正在使用符合PKCS11的密码设备,以保护我的私钥。该密码设备能够产生每秒500个RSA-2048位签名。我用C#.NET编写了一个应用程序,该应用程序与PKCS11Interop包装器接口。这是我的代码:

代码语言:javascript
复制
#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签约,但从来没有速度500个指定的我的密码OEM。至少我需要每秒钟有440~480个签名。如何使用顺序“for”循环来实现这一点?
  2. 为什么我的非托管并行循环总是抛出异常?即使我处理了这些异常,也有40%的签名失败(session.Sign()函数返回null)。为什么会这样呢?
  3. 使用“托管并行循环”代码,我可以达到最高速度280,就像我得到的顺序签名循环。为什么我的托管并行循环速度慢?是因为“锁”?如果我移除锁,它就变成非托管并行循环。我该怎么处理呢?
  4. 如果您觉得,我的多线程编码(以及整个PKCS11编程和操作)是错误的,请建议我一些方法来达到最大的速度。
  5. 如果您觉得,PCKS11Interop包装可能有一个问题,不让我达到这个速度,请建议一些其他包装。我使用了NCryptoki,Pkcs11.Net包装器,但无法达到最大速度。
  6. 我百分之百地相信我的PKCS11兼容设备能够产生500Signings。我用我的OEM确认了这一点。只有当我通过编程( C#或Java)操作设备时,我的速度就会下降。

我请本论坛的专家就上述6点作出澄清。

非常感谢。

卡鲁普

EN

回答 1

Stack Overflow用户

发布于 2017-04-04 14:47:19

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

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

在完成此强制阅读之后,您可以查看Pkcs11Interop.PDF项目中的Pkcs11Interop.PDF类以获得工作代码示例。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43203573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档