我有两个应用程序,一个计算文档的 SHA-256 哈希,另一个计算 RSA 签名。尝试不同的事情我得出的结论是,制作CKM_SHA256然后制作CKM_RSA_PKCS给出的结果与仅仅制作CKM_SHA256_RSA_PKCS文档本身不同。
所以我的问题是,这两种实现有什么区别?什么信息被添加到哈希CKM_SHA256_RSA_PKCS机制中以产生完全不同的签名?
我买了一个 NitroKey HSM,想用 EC 推导出一个秘密。 以前的问题
为此,我想使用这些CKM_ECDH1_DERIVE机制。此 HSM 支持哪个,请参阅:

参考PKCS#11 规范,必须考虑:
CKM_ECDH1_DERIVE必须与功能一起使用Derive(页 188)CKM_ECDH1_DERIVE需要CK_ECDH1_DERIVE_PARAMS带有以下参数的参数(页 222):
DeriveKey需要以下参数:
因此,根据这些信息,我尝试实现一种方法。
但我收到此错误:
Net.Pkcs11Interop.Common.Pkcs11Exception:方法 C_DeriveKey 返回 CKR_TEMPLATE_INCOMPLETE
在Session.DeriveKey。
说明CKR_TEMPLATE_INCOMPLETE(第 64 页):
如果提供的模板中的属性值,连同任何默认属性值和对象创建函数本身贡献给对象的任何属性值,都不足以完全指定要创建的对象,则尝试应该失败并显示错误代码CKR_TEMPLATE_INCOMPLETE。
和这里(第 98 页)
CKR_TEMPLATE_INCOMPLETE:为创建对象指定的模板不完整,缺少一些必要的属性。有关更多信息,请参阅第 10.1 节。
但我使用了必要的属性:
我使用 PKCS11Interop 生成密钥 API 在 HSM 中生成了一个 RSA 公私密钥对。我想导出密钥对。我使用 Findobject API 来获取密钥,该 API 返回一个 ObjectHandle ,而使用 GetAttributeValue API 读取属性时,我无法读取密钥的值。当我将密钥的属性设置为 CKA_EXTRACTABLE 为 true 时,我无法完全生成密钥。
我还需要在 HSM 中导入外部提供的密钥对。
任何帮助都受到高度赞赏。
与 Gemalto 网络 HSM 斗争了一段时间,是时候寻求一些专家帮助了。我试图从一个已知的公钥和一个存储在 HSM 上的私钥派生出一个 ECDH1 密钥,并不断将 HSM 发送到某种恐慌模式,这需要我在每次调用派生密钥时它再次开始说话之前重置它功能如下。有人有任何指示吗?
static string PKCSLibraryPath = @"C:\Program Files (x86)\SafeNet\Protect Toolkit 5\Protect Toolkit C SDK\bin\hsm\cryptoki.dll";
static Pkcs11 pkc = new Pkcs11(PKCSLibraryPath, AppType.SingleThreaded);
public string HSM_Interaction(int SlotNumber, string KeyLabel, string Pubkey, string GUID)
{
List<Slot> slots = pkc.GetSlotList(SlotsType.WithTokenPresent);
string pass = "1111";
//convert putblic key to byte array
byte[] data = Get_pub_Key(Pubkey);
//convert password to byte array
byte[] password = Encoding.ASCII.GetBytes(pass);
//select correct HSM slot
Slot S = slots[SlotNumber];
using (Session Sesh = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用存储在 HSM 中的证书来实现 XML 签名的一些演示。
我从这个链接中找到了一些有趣的例子: Sign XML Document with X509Certificate2并将其修改为在 HSM 中使用证书和密钥和 PKCS11Interop 包装器。
但是任何人都可以给我一个建议或示例,将 ObjectHandle privateKey 从 HSM 转换为 SignedXML.SigningKey
private static void SignXmlWithCertificate(XmlDocument xmlDoc, X509Certificate2 cert, Session session, String alias)
{
SignedXml signedXml = new SignedXml(xmlDoc);
List<ObjectAttribute> template = new List<ObjectAttribute>();
template.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY));
template.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA));
template.Add(new ObjectAttribute(CKA.CKA_LABEL, alias));
List<ObjectHandle> foundObjects = session.FindAllObjects(template);
ObjectHandle privateKey = foundObjects[0];
signedXml.SigningKey = privateKey; //Here is where I stuck.
Run Code Online (Sandbox Code Playgroud)
在上述外部链接的示例中。他们使用结合了私钥的证书。然后他们就可以这样使用了。
signedXml.SigningKey = cert.PrivateKey;
Run Code Online (Sandbox Code Playgroud)
但是我使用的证书里面没有私钥的内容。请给我一些建议。