代码之家  ›  专栏  ›  技术社区  ›  lasjan

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

  •  2
  • lasjan  · 技术社区  · 7 年前

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

    但是根据 ISO Descrption 模式2需要参数(即salt和拖车),这似乎与

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

    我试图使用PKCS11Interop C#class和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();
                        }
    

    我收到的例外情况:

    方法C\u SignRecoverInit返回CKR\u MECHANISM\u PARAM\u INVALID

    谢谢

    1 回复  |  直到 7 年前
        1
  •  3
  •   lasjan    7 年前

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

    https://crypto.stackexchange.com/questions/24294/how-do-signrecover-and-verifyrecover-work

    PKCS11中未实施ISO/IEC 9796-2方案2 完全我能够通过将这个过程分解为2个子过程来创建签名。第一个创建MessageRepresentative(如中所示) http://www.sarm.am/docs/ISO_IEC_9796-2_2002(E)-Character_PDF_document.pdf )第二个是使用CKM创建签名。PKCS#11实现中的CKM_RSA_X_509(使用MessageRepresentative作为输入)。希望这能对将来的人有所帮助。

    谢谢大家评论我的问题。

    推荐文章