我正在使用符合 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个签名。我怎样才能使用顺序'来实现这一点for' loop?
为什么我的 UNMANAGED Parallel 循环总是抛出异常?即使我处理了这些异常,40% 的签名也会失败(session.Sign() 函数返回 null)。为什么会这样呢?
使用“MANAGED Parallel Loop”代码,我可以达到 280 的最大速度,就像我使用顺序签名循环一样。为什么我的 MANAGED Parallel 循环很慢?难道是因为‘lock'?如果我删除lock,它变成非托管并行循环。我该如何处理这个问题?
如果您觉得我的多线程编码(以及整个 PKCS11 编程和操作)是错误的,请建议我一些方法来实现最大速度。
如果您觉得 PCKS11Interop Wrapper 可能存在问题,导致我无法达到速度,请建议其他一些包装器。我使用了 NCryptoki、Pkcs11.Net Wrappers,但无法达到最大速度。
我 100% 确信我的 PKCS11 兼容设备能够生成 500 个签名。我与我的 OEM 确认了这一点。只是,当我通过编程方式(C# 或 Java)操作设备时,速度会下降。
以上六点,请论坛专家予以澄清。
非常感谢。
Karthick
您需要创建新的Session
对于每个签名操作。
请阅读“第 6 章 - 概述” of PKCS#11 v2.20规格。那里解释了 PKCS#11 API 的所有基本概念(包括会话提供的线程/操作隔离)。
完成本必读内容后,您可以查看Pkcs11RsaSignature班级在Pkcs11Interop.PDF工作代码示例项目。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)