PKCS11 中带有 ISO/IEC 9796-2 方案 2 的 RSA
RSA with ISO/IEC 9796-2 scheme 2 in PKCS11
有没有办法使用 PKCS11 接口使用 ISO-9796 方案 2 创建 RSA 签名?我知道定义中列出了适当的机制(或者至少我是这么认为的):
CKM_RSA_97960x00000002
但根据 ISO Descrption 模式 2 需要参数(即 salt 和 trailer),这似乎与
冲突
6.1.11 ISO/IEC 9796 RSA The ISO/IEC 9796 RSA mechanism, denoted CKM_RSA_9796, is a mechanism for single-part signatures and
verification with and without message recovery based on the RSA
public-key cryptosystem and the block formats defined in ISO/IEC 9796
and its annex A.
This mechanism does not have a parameter.
我尝试使用 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();
}
我收到异常:
Method C_SignRecoverInit returned CKR_MECHANISM_PARAM_INVALID
谢谢。
是的,所以我终于弄明白了,或者至少我是这么认为的。事实证明,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 中所示),第二个 - 在 PKCS#11 实现中使用 CKM.CKM_RSA_X_509 创建签名(使用 MessageRepresentative 作为输入)。希望这对以后的人有所帮助。
感谢所有对我的问题发表评论的人。
有没有办法使用 PKCS11 接口使用 ISO-9796 方案 2 创建 RSA 签名?我知道定义中列出了适当的机制(或者至少我是这么认为的): CKM_RSA_97960x00000002
但根据 ISO Descrption 模式 2 需要参数(即 salt 和 trailer),这似乎与
冲突6.1.11 ISO/IEC 9796 RSA The ISO/IEC 9796 RSA mechanism, denoted CKM_RSA_9796, is a mechanism for single-part signatures and verification with and without message recovery based on the RSA public-key cryptosystem and the block formats defined in ISO/IEC 9796 and its annex A.
This mechanism does not have a parameter.
我尝试使用 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();
}
我收到异常:
Method C_SignRecoverInit returned CKR_MECHANISM_PARAM_INVALID
谢谢。
是的,所以我终于弄明白了,或者至少我是这么认为的。事实证明,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 中所示),第二个 - 在 PKCS#11 实现中使用 CKM.CKM_RSA_X_509 创建签名(使用 MessageRepresentative 作为输入)。希望这对以后的人有所帮助。
感谢所有对我的问题发表评论的人。