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

时间:2017-11-15 09:43:13

标签: encryption cryptography rsa digital-signature pkcs#11

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

但根据ISO Descrption模式2需要参数(即盐和预告片),这似乎与

冲突
  

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

     

此机制没有参数。

我尝试使用PKCS11Interop C#类和HSM模拟器创建这样的签名(抛出PKCS11异常)并且没有参数(似乎没有效果)。任何帮助将不胜感激。

修改

代码I使用:

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_SignRecoverInit返回CKR_MECHANISM_PARAM_INVALID

感谢。

1 个答案:

答案 0 :(得分:1)

是的,所以我终于弄明白了,或者至少我是这么认为的。事实证明,CKM_RSA_9796机制实现旧的,不是非常安全的RSA_9796签名机制,其要求消息具有长度&lt; 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中所示)和第二个 - 在PKCS#11实现中使用CKM.CKM_RSA_X_509创建签名(使用MessageRepresentative作为输入)。希望这将有助于将来。

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