PKCS11将私有RSA密钥解包到eToken HSM

弗拉基米尔·K

我试图通过PKCS#11互操作将RSA私钥传输到我的HSM(SafeNet eToken),然后在HSM上将其解包。

这是我的代码(已更新):

            session.Login(CKU.CKU_USER, pin);
            var x509Certificate = new X509Certificate2(File.ReadAllBytes(path), "", X509KeyStorageFlags.Exportable);
            var privateKey = x509Certificate.PrivateKey as RSACryptoServiceProvider;
            var keyPair = DotNetUtilities.GetRsaKeyPair(privateKey);
            byte[] privateKeyBytes;
            using (var memoryStream = new MemoryStream())
            {
                using (TextWriter streamWriter = new StreamWriter(memoryStream))
                {
                    var pemWriter = new PemWriter(streamWriter);
                    pemWriter.WriteObject(keyPair.Private);
                    streamWriter.Flush();
                }
                privateKeyBytes = memoryStream.GetBuffer();
            }

            // Create temporary DES3 key for wrapping/unwrapping
            var tempKeyAttributes = new List<ObjectAttribute>
            {
                new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY),
                new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES3),
                new ObjectAttribute(CKA.CKA_ENCRYPT, true),
                new ObjectAttribute(CKA.CKA_UNWRAP, true)
            };
            var tempKey = session.GenerateKey(new Mechanism(CKM.CKM_DES3_KEY_GEN), tempKeyAttributes);

            var encrypted =
                session.Encrypt(new Mechanism(CKM.CKM_DES3_ECB), tempKey, privateKeyBytes);

            string label = "private1";

            // Define how the new RSA private key should look like on the HSM
            var privateKeyAttributes = new List<ObjectAttribute>
            {
                new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY),
                new ObjectAttribute(CKA.CKA_TOKEN, true),
                new ObjectAttribute(CKA.CKA_PRIVATE, true),
                new ObjectAttribute(CKA.CKA_MODIFIABLE, true),
                new ObjectAttribute(CKA.CKA_SENSITIVE, false),
                new ObjectAttribute(CKA.CKA_LABEL, label),
                new ObjectAttribute(CKA.CKA_ID, Encoding.ASCII.GetBytes(label)),
                new ObjectAttribute(CKA.CKA_ALWAYS_AUTHENTICATE, false),
                new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA),

            };
            var privateKeyHandle = session.UnwrapKey(new Mechanism(CKM.CKM_DES3_ECB), tempKey,
                encrypted, privateKeyAttributes);


//results in: Method C_UnwrapKey returned CKR_WRAPPED_KEY_INVALID

但它不起作用-失败Net.Pkcs11Interop.Common.Pkcs11Exception: Method C_UnwrapKey returned CKR_TEMPLATE_INCONSISTENT

(更新)现在它产生CKR_WRAPPED_KEY_INVALID。但是,如果我使用SafeNet手动导入相同的PFX文件,则不会发生错误-一切似乎都很好。

有任何想法吗?也许有些参数我用错了吗?

弗拉基米尔·K

最后,执行该操作的代码:

   var x509Certificate = new X509Certificate2(File.ReadAllBytes(path), "",
                X509KeyStorageFlags.Exportable);
            var privateKey = x509Certificate.PrivateKey as RSACryptoServiceProvider;
            if (privateKey == null) throw new Exception($"Private key is null for {x509Certificate.SerialNumber}");
            var privateKeyParams = privateKey.ExportParameters(true);
            session.Login(CKU.CKU_USER, pin);
            // Create temporary DES3 key for wrapping/unwrapping
            var tempKeyAttributes = new List<ObjectAttribute>
            {
                new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY),
                new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES3),
                new ObjectAttribute(CKA.CKA_ENCRYPT, true),
                new ObjectAttribute(CKA.CKA_DECRYPT, true),
                new ObjectAttribute(CKA.CKA_UNWRAP, true),
                new ObjectAttribute(CKA.CKA_WRAP, true)
            };
            // Preparing unencrypted private key
            var unencryptedPrivateKey = PrivateKeyInfoFactory.CreatePrivateKeyInfo(
                new RsaPrivateCrtKeyParameters(
                    new BigInteger(1, privateKeyParams.Modulus),
                    new BigInteger(1, privateKeyParams.Exponent),
                    new BigInteger(1, privateKeyParams.D),
                    new BigInteger(1, privateKeyParams.P),
                    new BigInteger(1, privateKeyParams.Q),
                    new BigInteger(1, privateKeyParams.DP),
                    new BigInteger(1, privateKeyParams.DQ),
                    new BigInteger(1, privateKeyParams.InverseQ))).GetEncoded();
            var tempKey = session.GenerateKey(new Mechanism(CKM.CKM_DES3_KEY_GEN), tempKeyAttributes);
            var result = new MemoryStream();
            var stream = new MemoryStream(unencryptedPrivateKey);
            //Encrypting
            session.Encrypt(new Mechanism(CKM.CKM_DES3_ECB), tempKey, stream,
                result);
            var encrypted = result.ToArray();
            string label = x509Certificate.SerialNumber;
            // Define how the new RSA private key should look like on the HSM
            var privateKeyAttributes = new List<ObjectAttribute>
            {
                new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY),
                new ObjectAttribute(CKA.CKA_TOKEN, true),
                new ObjectAttribute(CKA.CKA_PRIVATE, true),
                new ObjectAttribute(CKA.CKA_MODIFIABLE, true),
                new ObjectAttribute(CKA.CKA_SENSITIVE, false),
                new ObjectAttribute(CKA.CKA_LABEL, label),
                new ObjectAttribute(CKA.CKA_ID, Encoding.ASCII.GetBytes(label)),
                new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA)
            };
            var privateKeyHandle = session.UnwrapKey(new Mechanism(CKM.CKM_DES3_ECB), tempKey,
                encrypted, privateKeyAttributes);
            return privateKeyHandle;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Thales Payshield HSM RSA私钥

来自分类Dev

如何将Pkcs11Interop与NitroKey HSM结合使用以与EC导出共享机密

来自分类Dev

Thales HSM生成密钥“来自透明组件的表单密钥”(“ FK”命令)

来自分类Dev

从tr31密钥块中提取密钥(从HSM Thales 9000导出)

来自分类Dev

从tr31密钥块中提取密钥(从HSM Thales 9000导出)

来自分类Dev

使用BouncyCastle和外部Azure KeyVault(HSM)密钥创建证书时,签名无效

来自分类Dev

使用HSM和SUNPKCS11进行文件签名时发生异常

来自分类Dev

如何将我的软件应用程序替换为 HSM 以与 PKCS 一起使用?

来自分类Dev

HSM KW命令以验证ARQC

来自分类Dev

Safenet Luna HSM 是否具有接收一种类型的密码并返回另一种类型的密码的功能或方法?

来自分类Dev

使用Java远程连接SafeNet HSM

来自分类Dev

在Luna HSM上使用iTextSharp进行签名

来自分类Dev

是否可以通过HSM保护Android KeyChain?

来自分类Dev

哪个平台支持HSM的EV证书

来自分类Dev

向HSM发送命令时发出

来自分类Dev

使用openssl的PKCS11密钥包装

来自分类Dev

使用openssl的PKCS11密钥包装

来自分类Dev

Thales HSM 8000 A2命令发送(生成清除组件)

来自分类Dev

分层状态机(HSM)动作的执行顺序

来自分类Dev

分层状态机(HSM)当前状态

来自分类Dev

使用nShield HSM的.Net加密服务提供程序错误

来自分类Dev

hsm 如何干预使用终端的交易加密?

来自分类Dev

PKCS11:导出不敏感的可提取密钥

来自分类Dev

智能卡PKCS11 AES密钥生成失败

来自分类Dev

PKCS11:导出不敏感且可提取的密钥

来自分类Dev

使用Java keytool的PKCS11格式密钥

来自分类Dev

从PKCS11读取C ++结构有什么问题?

来自分类Dev

使用位于HSM上的私钥对数据进行签名和解密

来自分类Dev

Linux私有RSA密钥安全存储

Related 相关文章

  1. 1

    Thales Payshield HSM RSA私钥

  2. 2

    如何将Pkcs11Interop与NitroKey HSM结合使用以与EC导出共享机密

  3. 3

    Thales HSM生成密钥“来自透明组件的表单密钥”(“ FK”命令)

  4. 4

    从tr31密钥块中提取密钥(从HSM Thales 9000导出)

  5. 5

    从tr31密钥块中提取密钥(从HSM Thales 9000导出)

  6. 6

    使用BouncyCastle和外部Azure KeyVault(HSM)密钥创建证书时,签名无效

  7. 7

    使用HSM和SUNPKCS11进行文件签名时发生异常

  8. 8

    如何将我的软件应用程序替换为 HSM 以与 PKCS 一起使用?

  9. 9

    HSM KW命令以验证ARQC

  10. 10

    Safenet Luna HSM 是否具有接收一种类型的密码并返回另一种类型的密码的功能或方法?

  11. 11

    使用Java远程连接SafeNet HSM

  12. 12

    在Luna HSM上使用iTextSharp进行签名

  13. 13

    是否可以通过HSM保护Android KeyChain?

  14. 14

    哪个平台支持HSM的EV证书

  15. 15

    向HSM发送命令时发出

  16. 16

    使用openssl的PKCS11密钥包装

  17. 17

    使用openssl的PKCS11密钥包装

  18. 18

    Thales HSM 8000 A2命令发送(生成清除组件)

  19. 19

    分层状态机(HSM)动作的执行顺序

  20. 20

    分层状态机(HSM)当前状态

  21. 21

    使用nShield HSM的.Net加密服务提供程序错误

  22. 22

    hsm 如何干预使用终端的交易加密?

  23. 23

    PKCS11:导出不敏感的可提取密钥

  24. 24

    智能卡PKCS11 AES密钥生成失败

  25. 25

    PKCS11:导出不敏感且可提取的密钥

  26. 26

    使用Java keytool的PKCS11格式密钥

  27. 27

    从PKCS11读取C ++结构有什么问题?

  28. 28

    使用位于HSM上的私钥对数据进行签名和解密

  29. 29

    Linux私有RSA密钥安全存储

热门标签

归档