Encryption PKCS11中带有ISO/IEC 9796-2方案2的RSA

Encryption PKCS11中带有ISO/IEC 9796-2方案2的RSA,encryption,cryptography,rsa,digital-signature,pkcs#11,Encryption,Cryptography,Rsa,Digital Signature,Pkcs#11,有没有办法使用PKCS11接口使用ISO-9796方案2创建RSA签名?我知道定义中列出了适当的机制(至少我认为是这样): CKM_RSA_9796 0x00000002 但根据模式2,需要参数(即salt和trail),这似乎与 6.1.11 ISO/IEC 9796 RSA ISO/IEC 9796 RSA机制,表示为CKM_RSA_9796,是一种用于单部分签名和 基于RSA的带消息恢复和不带消息恢复的验证 公开密钥密码系统和ISO/IEC 9796中定义的块格式 及其附件A 此机制没有参

有没有办法使用PKCS11接口使用ISO-9796方案2创建RSA签名?我知道定义中列出了适当的机制(至少我认为是这样): CKM_RSA_9796 0x00000002

但根据模式2,需要参数(即salt和trail),这似乎与

6.1.11 ISO/IEC 9796 RSA ISO/IEC 9796 RSA机制,表示为CKM_RSA_9796,是一种用于单部分签名和 基于RSA的带消息恢复和不带消息恢复的验证 公开密钥密码系统和ISO/IEC 9796中定义的块格式 及其附件A

此机制没有参数。

我尝试使用PKCS11Interop C#类和HSM模拟器创建这样的签名(引发PKCS11异常),而不使用参数(似乎无效)。任何帮助都将不胜感激

编辑

我正在使用的代码:

using (Session session = slot[slotIndex].OpenSession(SessionType.ReadOnly))
                    {
                        session.Login(CKU.CKU_USER, callback.GetPassword());

                        List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
                        objectAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY));

                        var prm = new Net.Pkcs11Interop.HighLevelAPI.MechanismParams.CkRsaPkcsPssParams(Convert.ToUInt32(CKM.CKM_SHA256), Convert.ToUInt32(CKG.CKG_MGF1_SHA256),Convert.ToUInt32(20));   
                        Mechanism mchanism = new Mechanism(CKM.CKM_RSA_9796,prm);
                        List<ObjectHandle> foundObjects = session.FindAllObjects(objectAttributes);
                        if (foundObjects != null && foundObjects.Count > 0)
                        {
                            signature = session.SignRecover(mchanism, foundObjects[0], result);
                        }
                        else
                        {
                            throw new DSException("There was a problem with reading private key from token");
                        }
                        session.Logout();
                    }
使用(Session Session=slot[slotIndex].OpenSession(SessionType.ReadOnly))
{
登录(CKU.CKU_用户,callback.GetPassword());
List objectAttributes=new List();
Add(新的ObjectAttribute(CKA.CKA_类,CKO.CKO_私钥));
var prm=new Net.Pkcs11Interop.HighLevelAPI.mechanismparms.ckrsapkcspsparams(Convert.ToUInt32(CKM.CKM_SHA256)、Convert.ToUInt32(CKG.CKG_MGF1_SHA256)、Convert.ToUInt32(20));
机制mchanism=新机制(CKM.CKM_RSA_9796,prm);
List foundObjects=session.FindAllObjects(objectAttributes);
if(foundObjects!=null&&foundObjects.Count>0)
{
signature=session.SignRecover(mchanism,foundObjects[0],result);
}
其他的
{
抛出新的DSException(“从令牌读取私钥时出现问题”);
}
session.Logout();
}
我收到的例外情况:

方法C_SignRecoverInit返回的CKR_机制参数无效


谢谢。

是的,所以我终于明白了,或者至少我这么认为。事实证明,CKM_RSA_9796机制实现了旧的、不太安全的RSA_9796签名机制,该机制要求消息长度小于k/2,其中k是私钥长度。所以这是我一直在寻找的不同的东西。根据fgrieu用户对StackExchange的评论:

PKCS11中根本没有实施ISO/IEC 9796-2方案2。我能够通过将这个过程分成两个子过程来创建签名。第一个创建MessageRepresentative(如中所示),第二个-在PKCS#11实现中使用CKM.CKM_RSA_X_509创建签名(使用MessageRepresentative作为输入)。希望这将有助于未来的人


感谢所有评论我的问题的人。

请发布异常。嗨,为了更清楚,我将编辑带有异常和部分代码的帖子。规范说,该机制没有参数。您的代码为机制提供参数。通过返回
CKR_MECHANISM_PARAM_INVALID
您的PKCS#11库告诉您不应提供参数。请在没有参数的情况下重试。是什么让您认为
CKM_RSA_9796
机制代表“数字签名方案2”而不是无参数的“数字签名方案1”,因此可能会使用任何一种编码方案。但是我不确定如何正确准备这三种方案中的任何一种的输入数据。嘿,很抱歉挖掘了这个线程,但是您是否碰巧有任何链接指向您使用PKCS11创建签名时所做的操作?