我使用模块pkcs11js生成智能卡HSM的RSA密钥,如here in the Example #3所示。
var publicKeyTemplate = [
{ type: pkcs11js.CKA_CLASS, value: pkcs11js.CKO_PUBLIC_KEY },
{ type: pkcs11js.CKA_TOKEN, value: false },
{ type: pkcs11js.CKA_LABEL, value: "My RSA Public Key" },
{ type: pkcs11js.CKA_PUBLIC_EXPONENT, value: new Buffer([1, 0, 1]) },
{ type: pkcs11js.CKA_MODULUS_BITS, value: 2048 },
{ type: pkcs11js.CKA_VERIFY, value: true }
];
var privateKeyTemplate = [
{ type: pkcs11js.CKA_CLASS, value: pkcs11js.CKO_PRIVATE_KEY },
{ type: pkcs11js.CKA_TOKEN, value: false },
{ type: pkcs11js.CKA_LABEL, value: "My RSA Private Key" },
{ type: pkcs11js.CKA_SIGN, value: true },
];
var keys = pkcs11.C_GenerateKeyPair(session, { mechanism: pkcs11js.CKM_RSA_PKCS_KEY_PAIR_GEN }, publicKeyTemplate, privateKeyTemplate);
如果我打印keys
,我会得到类似的内容:
{ privateKey: <Buffer 70 97 f7 03 00 00 00 00>,
publicKey: <Buffer b0 ea f2 03 00 00 00 00> }
现在我想用NodeRSA module加密/解密,但不知道如何从此密钥对创建用于加密/解密的密钥对象(使用new NodeRSA(...)
)以前生成的。
它不需要使用NodeRSA,我只需要一种方法来使用智能卡中的密钥对在Node JS中加密/解密,以防某人有一个如何使用另一个库执行此操作的示例。谢谢!
答案 0 :(得分:0)
某些属性具有PKCS#11的默认值。对于私钥,这意味着设置了CKA_PRIVATE
。这意味着私有指数(和CRT参数)的值不可访问;我的想法是用智能卡保护他们,对吗?
如果设置了正确的属性值,通常无法从智能卡甚至中检索RSA私钥参数(模数除外)。因此,无法使用仅限软件的实施(如NodeRSA)执行私钥操作,因为所需的值不可用。你必须使用智能卡执行它们,例如使用示例7 的pkcs11js。
好的,这就是私钥,让我们来看看公钥操作。您可能已经猜到,您通常可以检索公钥的属性。对于公钥操作,您需要模数和公共指数。可以使用C_GetAttributeValue
检索这些内容。为此,您需要使用C_FindObjects
找到的对象句柄(或者您可以使用生成密钥对时检索到的句柄)。
检索属性值后,您可以从中构造公钥并在软件实现中使用它们。如果您也可以直接在智能卡上执行操作,这取决于智能卡和PKCS#11库的实现。
当您打印keys
时,您当前看到的是公钥和私钥的(会话相关的)对象句柄。这些通常完全独立于公钥和私钥的属性(值)。