我正在使用 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
干得好!!
使用顺序签名循环区域,我只能实现 250-280 个签名,但不能达到我的 Crypto OEM 指定的 500 个签名的速度。至少我每秒需要 440~480 个签名。如何使用 Sequential ' for ' 循环来实现这一点?
为什么我的 UNMANAGED Parallel 循环总是抛出异常?即使我处理了这些异常,40% 的签名也会失败(session.Sign() 函数返回 null)。为什么会这样?
使用“MANAGED Parallel Loop”代码,我可以达到 280 的最大速度,就像使用顺序签名循环一样。为什么我的 MANAGED Parallel 循环很慢?是因为'锁'吗?如果我删除了锁,它就变成了 UNMANAGED PARALLEL LOOP。我该如何处理?
如果您觉得我的多线程编码(以及整个 PKCS11 编程和操作)是错误的,请建议我一些方法来达到最大速度。
如果您觉得 PCKS11Interop Wrapper 可能存在问题,无法让我达到速度,请建议其他一些包装器。我使用了 NCryptoki、Pkcs11.Net Wrappers,但我无法达到最大速度。
我 100% 确信我的 PKCS11 兼容设备能够生成 500 个签名。我与我的 OEM 确认了这一点。只有当我通过编程方式(C# 或 Java)操作设备时,我的速度才会下降。
我请本论坛的专家就以上6点给我澄清。
非常感谢。
卡西克