我使用模块pkcs11js生成带有智能卡的RSA密钥,如在示例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模块加密/解密,但不知道如何从以前生成的密钥对中创建用于加密/解密的密钥对象(使用new NodeRSA(...))。
它不需要使用NodeRSA,我只需要一种在NodeRSA中使用智能卡中的密钥对加密/解密的方法,以防有人有关于如何使用另一个库进行加密/解密的示例。谢谢!
发布于 2016-12-14 21:51:42
有些属性对于PKCS#11有一个默认值。对于私钥,这意味着设置了CKA_PRIVATE。这意味着私有指数(和CRT参数)的值是不可访问的;其想法是使用智能卡保护它们,对吗?
通常,即使设置正确的属性值,也无法从智能卡检索RSA私钥参数(模数除外)。因此,不能使用软件执行私钥操作,而只能使用实现(如NodeRSA ),因为所需的值不可用。您必须使用智能卡执行这些操作,例如使用示例7 of pkcs11js。
好的,这就是私钥,让我们看一看公钥操作。正如您可能已经猜到的,您通常可以检索公钥的属性。对于公钥操作,您需要模数和公共指数。可以使用C_GetAttributeValue检索这些信息。为此,您需要使用C_FindObjects可以找到的对象句柄(很明显,您也可以使用生成密钥对时检索的句柄)。
在检索属性值之后,可以从它们构造公钥,并在软件实现中使用它们。如果还可以直接在智能卡上执行操作,则取决于智能卡和PKCS#11库的实现。
在打印keys时,您当前看到的是公共密钥和私钥的(会话相关的)对象句柄。它们通常完全独立于公钥和私钥的属性(值)。
https://stackoverflow.com/questions/41149465
复制相似问题