多线程签名生成C#

2023-12-13

我正在使用符合 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个签名。我怎样才能使用顺序'来实现这一点for' loop?

  2. 为什么我的 UNMANAGED Parallel 循环总是抛出异常?即使我处理了这些异常,40% 的签名也会失败(session.Sign() 函数返回 null)。为什么会这样呢?

  3. 使用“MANAGED Parallel Loop”代码,我可以达到 280 的最大速度,就像我使用顺序签名循环一样。为什么我的 MANAGED Parallel 循环很慢?难道是因为‘lock'?如果我删除lock,它变成非托管并行循环。我该如何处理这个问题?

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

  5. 如果您觉得 PCKS11Interop Wrapper 可能存在问题,导致我无法达到速度,请建议其他一些包装器。我使用了 NCryptoki、Pkcs11.Net Wrappers,但无法达到最大速度。

  6. 我 100% 确信我的 PKCS11 兼容设备能够生成 500 个签名。我与我的 OEM 确认了这一点。只是,当我通过编程方式(C# 或 Java)操作设备时,速度会下降。

以上六点,请论坛专家予以澄清。

非常感谢。

Karthick


您需要创建新的Session对于每个签名操作。

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

完成本必读内容后,您可以查看Pkcs11RsaSignature班级在Pkcs11Interop.PDF工作代码示例项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程签名生成C# 的相关文章

  • 连接到 SoftHSM java

    Code String pkcs11cfg pkcs11 cfg Provider p new SunPKCS11 pkcs11cfg Security addProvider p KeyStore ks KeyStore getInsta
  • 在 64 位计算机上访问硬件 PKCS11 令牌

    这就是我正在尝试做的事情 我有一个带有一些证书的硬件令牌 我正在编写一个 Java 应用程序来尝试访问这些证书 我在 Windows 32 位机器上使用了 jre6 中的 SunPKCS11 库 这是我如何访问证书的一个小示例 String
  • Java 访问令牌 PKCS11 未找到提供程序

    您好 我正在尝试使用 Java 从我的智能卡访问密钥库 我正在使用以下代码 我正在使用 OpenSc 的 Pkcs11 实现http www opensc project org opensc 文件 windows cnf name dni
  • 如何将 HSM 中存储的私钥转换为 C# 中的 SignedXml.SigningKey

    我正在尝试使用存储在 HSM 中的证书来实现一些 XML 签名演示 我从此链接中找到了一些有趣的示例 使用 X509Certificate2 签署 XML 文档并将其修改为使用带有 PKCS11Interop 包装器的 HSM 内的证书和密
  • Java - PKCS11 和 MSKeyStore

    我正在尝试使用 MS KeyStore 中的不同证书签署一个字符串 但是 我知道有从 MS Keystore 中的令牌导入的密钥 所以 我的问题是 如果我通过密钥库并尝试使用引用 pkcs11 的证书进行签名 我会弹出一个窗口 要求输入 p
  • javafx 上的 sun.security.pkcs11

    我尝试开发一个访问智能卡的 javafx 应用程序 我有一个简单的概念证明 如下所示 package javafxapplication7 import java net URL import java util ResourceBundl
  • HSM解密+加密链接

    我的应用程序充当交换机 在两方之间传输非常敏感的消息 我试图弄清楚如何在不 查看 他们试图发送的消息的情况下做到这一点 我有一个 HSM 并且我已经为发送者生成了一个密钥对 他们将使用我提供给他们的公钥来加密消息 而我可以使用 HSM 中的
  • 如何检查智能卡在Linux上是否正常工作?

    我有支持 PKCS 11 的智能卡吗 我只是想检查我的智能卡是否工作正常 如何在 Ubuntu 上检查它 请指导我 我可以使用什么软件 我应该遵循什么步骤 重要的是要明白PKCS 11标准只是定义了C语言API访问智能卡和其他类型的加密硬件
  • 通过浏览器访问ePass2003 Auto令牌

    我已经加载了带有自签名证书的 ePass2003 Auto 令牌 我将 lib so 文件加载到 Firefox 中 现在 Firefox 可以在令牌中列出证书 我的要求是访问密钥库以进行签名 加密和解密 即用于对其进行加密操作的公钥和私钥
  • 使用来自 Thales nShield HSM 的 PKCS11interop c# 包装器库导出/导入 RSA 密钥对?

    我已使用 PKCS11Interop 生成密钥 API 在 HSM 中生成了 RSA 公私密钥对 我想导出密钥对 我使用 Findobject API 来获取密钥 该 API 返回一个 ObjectHandle 在使用 GetAttribu
  • 将证书从智能卡复制到计算机

    是否可以将证书从智能卡复制到计算机并 用它来登录某个站点 在 Mac 上 这些证书出现在钥匙串中 并且可以保存到磁盘 但我不确定如何强制站点提示对话框屏幕以选择证书 连接智能卡后 会出现提示并要求选择证书 智能卡包含由封装在 X509 证书
  • 升级Java后找不到Sun.security

    我有一个使用 Play 2 0 创建的应用程序 我实现了 scribe java 库来使用一些 OAuth 服务 直到今天一切都很好 但是当我升级 jdk 并重新启动服务器时 我无法使用 scribe java 库 似乎它使用了一些类 例如
  • openSSL 的 PKCS#11 引擎

    我正在尝试在 Windows 7 下设置 openSSL 以使用供应商特定的安全模块 我从供应商那里得到了一个 PKCS 11 API dll 比如说vendor dll PKCS 11 引擎是根据https github com Open
  • Pkcs11Interop 从 HSM 读取密钥值

    我正在尝试使用 Pkcs11Interop 从 HSM 中提取密钥的值 我知道 密钥必须留在 HSM 中 但我需要它 所以 我已经用 NCryptoki 做到了 我也想用 Pkcs11Interop 做到这一点 我尝试了这段代码 Prepa
  • 从 Java 访问 Firefox 的证书信任存储

    我对这个几乎失去希望了 我正在尝试使用 Firefox 安装附带的 NSS 库通过 PKCS 11 从 Java 7 访问 Firefox 信任存储 这是代码 import java security KeyStore import jav
  • PyKCS11 不可哈希列表

    我的 python 脚本旨在获取特定 so 库中插槽 令牌的详细信息 输出如下所示 Library manufacturerID Safenet Inc Available Slots 4 Slot no 0 slotDescription
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • opensc-pkcs 链接错误

    我正在尝试使用在 Redhat linux 5 上构建的 opensc pkcs11 so 但是 当我尝试在示例程序中使用时 它给出了链接错误 main cpp text 0x265 undefined reference to C Ini
  • 直接对文件的哈希值进行数字签名,而不是对文件进行签名

    我的问题是 是否可以直接对文件的哈希值而不是文件进行数字签名 我必须通过电子令牌在 Web 环境中对 xml 文件进行数字签名 所以我必须将文件从服务器下载到客户端 然后从客户端计算机上的电子令牌 USB 获取证书并对文件进行签名并将其上传
  • 如何将 Pkcs11Interop 与 NitroKey HSM 结合使用来派生与 EC 的共享密钥

    我购买了 NitroKey HSM 并设法在其上创建了 EC 现在我想导出一个共享秘密 我发现Pkcs11互操作 https github com Pkcs11Interop 这似乎是完成这项工作的正确工具 但处理方式尚不清楚 代码片段或工

随机推荐

  • 如何通过 jquery POST 单选按钮值

    我有这个示例代码 while row mysql fetch object result1 echo
  • SQL SERVER 2008 在创建表时触发

    在 SQL SERVER 2008 的数据库中创建表时 有没有办法运行一些函数 例如触发器 是的 这就是所谓的 DDL 触发器 的文档CREATE TRIGGER有一个样本DROP SYNONYM 对于一个例子来说 这是一个非常值得怀疑的选
  • 客户端未经授权使用此方法检索访问令牌 Gmail API C#

    当我尝试使用服务帐户授权 gmail api 时 出现以下错误 客户端无权使用此方法检索访问令牌 static async Task MainAsync sstageEntities db new sstageEntities UserCr
  • 使用 PyE 的 Elasticsearch 批量索引

    我有一个简单的 python 脚本 用于索引包含 100 万行的 CSV 文件 import csv from pyes import reader csv reader open data csv rb conn ES 127 0 0 1
  • 经典 ASP - 从本地主机上的网页运行 .exe

    我正在尝试执行 bat 以使用以下代码在我的本地主机 服务器端 上启动 notepad exe 索引 asp file bat notepad exe 当我打开 ASP 页面时 没有任何反应 由于变量 return 返回值 0 所以我尝试设
  • 为什么React在将state设置为相同值后会第二次渲染组件?

    我有一个简单的 React 组件 每次单击按钮时我都会设置相同的值 import React useState from react import style css let data title ABC export default fu
  • 这些角色有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 r 和 n 有什么区别 我真的很想知道两者之间有什么区别 n r t chr 13 它们如何在 Web 应用程序中使用 在哪个操作系统中使用 等等 例如 您能否确认Windows使用 n r对于换行符
  • 您无权调用 openById

    问题 当我运行脚本时 Google 告诉我 您无权调用 openById 我从我的另一个 Google 电子表格中复制了一个脚本 并更改 了目标密钥变量的单元格引用并在源电子表格和目标电子表格中创建适当大小的命名范围 Google Apps
  • 同一 Android 项目中的多个 API 密钥

    是否可以在同一代码库中为 Google Maps Android API 指定多个键 看来每次更改密钥库时我都必须更改清单文件中的密钥 恕我直言 如果您需要测试使用调试和发布密钥库中的密钥签名的应用程序 这不是很方便 I added bot
  • R:具有子集的 T 统计量

    我想要一个表作为输出 其中包含某些变量均值差异之间的 t 统计量并基于数据的两个特定子集 我有以下数据 structure list Name c A A A A B B B B C C C C D D D D Date c 20 10 2
  • 如何在Opencv中访问单通道IplImage的元素

    我怎样才能访问Elements of an IplImage 单通道和 IPL DEPTH 8U 深度 我想更改图像特定 x y 位置的像素值 opencv提供CV IMAGE ELEM方法来访问IplImage的元素 它是一个宏 defi
  • DialogFragment 不关闭

    我已经四处寻找解决方案 但似乎这不是一个常见问题 我希望在我的应用程序连接到服务器时有一个不确定的对话框微调器 然后清除该对话框并在请求完成时显示不同的对话框 我正在使用Fragment兼容包 问题是在显示第二个对话框之前没有删除微调器 这
  • C# RSA 加密 -> PHP RSA 解密

    我正在尝试在 C 中使用 RSA 加密 AES 密钥和 IV 并使用 phpseclib 使用 PHP 解密它们 我花了大约 4 个小时尝试解决这个问题 但总是收到 第 2495 行解密错误 PKCS 似乎有问题 临时私钥
  • Hibernate 映射包

    我正在使用 Hibernate 注释 在我的所有模型类中 我都这样注释 Entity Table public class SomeModelClass 我的 hibernate cfg xml 是
  • SQL CLR 拆分 UDF 中的标识列

    如何使用标准 SQL CLR Split UDF 返回标识列 例如下面的代码将返回一个表 其中字符串值按分隔符分隔 我还需要以某种方式返回标识列
  • 禁用传单绘制“删除”按钮

    如何禁用 删除删除按钮传单抽奖编辑工具栏 编辑 按钮应保持启用状态 关于章节中的文档禁用工具栏项您可以执行以下操作 map addControl new L Control Draw edit featureGroup drawnItems
  • HTML5 将画布保存为 PNG

    我按照这个示例将画布保存到 PNG 文件 http greenethumb com article 1429 user friend image saving from the canvas 我的问题 下载的文件已损坏 当我在记事本中打开它
  • 为什么调试器不会将 win32 计时器回调中引发的未处理异常视为未处理异常?

    我一直在追踪工作中一个非常阴险的错误 似乎导致我一直在追踪的非常奇怪的行为的事件似乎是在处理计时器回调时引发的异常 我的任何代码都没有处理该异常 因此我希望调试器能够收到未处理异常的通知 并通过一个令人讨厌的弹出窗口提醒我 不 相反 第一次
  • 有没有办法访问向量中的索引

    我需要访问向量内的索引 单个值 我认为它会类似于 v1 lt c a b c d e v1 3 h 但这似乎根本不起作用 其他人知道该怎么做吗 编辑 好吧 回答你的一些问题 这是我想要实现的总体目标的大图 MyDataR1 lt scan
  • 多线程签名生成C#

    我正在使用符合 PKCS11 标准的加密设备来保护我的私钥 加密设备每秒能够生成 500 个 RSA 2048 位签名 我用 C NET 编写了一个与 PKCS11Interop Wrapper 交互的应用程序 这是我的代码 region