首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有PKCS#11的AWS cloudhsm无法导出RSA公钥。

带有PKCS#11的AWS cloudhsm无法导出RSA公钥。
EN

Stack Overflow用户
提问于 2020-04-29 19:35:18
回答 2查看 287关注 0票数 0

我正在使用AWS cloud HSM和PKCS11Interop c#库在AWS供应商PKCS库上生成一个RSA密钥对。我想用PKCS11 getAttributeValue方法从HSM导出一个公钥。

响应指出属性无法读取,我已经正确地标记了所有属性值,以便能够导出键,有人能指出我做错了什么吗?

我的示例代码

代码语言:javascript
复制
private static void GenerateRSAKeyPair(ISession session, out IObjectHandle publicKeyHandle, out IObjectHandle privateKeyHandle, string keyAlias = null)
    {

        byte[] ckaId = null;
        if (string.IsNullOrEmpty(keyAlias))
            ckaId = session.GenerateRandom(20);
        else
            ckaId = Encoding.UTF8.GetBytes(keyAlias);

        // Prepare attribute template of new public key
        List<IObjectAttribute> publicKeyAttributes = new List<IObjectAttribute>();
        publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_TOKEN, true));
        publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_CLASS, CKO.CKO_PUBLIC_KEY));
        //publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_PRIVATE, false)); // Throws InvalidAttribute Value
        publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_ID, ckaId));
        publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_WRAP, true));
        //publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_SENSITIVE, true));
        publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_MODULUS_BITS, 2048));
        publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_PUBLIC_EXPONENT, new byte[] { 0x01, 0x00, 0x01 }));

        // Prepare attribute template of new private key
        List<IObjectAttribute> privateKeyAttributes = new List<IObjectAttribute>();
        privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_TOKEN, true));
        //privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_PRIVATE, true)); 
        //publicKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_SENSITIVE, true));
        privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_ID, ckaId));
        privateKeyAttributes.Add(session.Factories.ObjectAttributeFactory.Create(CKA.CKA_UNWRAP, true));

        // Specify key generation mechanism
        IMechanism mechanism = session.Factories.MechanismFactory.Create(CKM.CKM_RSA_X9_31_KEY_PAIR_GEN);

        // Generate key pair
        session.GenerateKeyPair(mechanism, publicKeyAttributes, privateKeyAttributes, out publicKeyHandle, out privateKeyHandle);
    }  


private static byte[] GetKeyAttributeValue(ISession session, IObjectHandle keyHandle)
    {
        var readAttrs = session.GetAttributeValue(keyHandle, new List<CKA>() { CKA.CKA_VALUE });
        if (readAttrs[0].CannotBeRead)
            throw new Exception("Key cannot be exported");
        else
            return readAttrs[0].GetValueAsByteArray();
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-02 16:12:10

RSA公钥对象没有CKA_VALUE属性。相反,有两个名为CKA_MODULUSCKA_PUBLIC_EXPONENT的属性构成了键值。

票数 2
EN

Stack Overflow用户

发布于 2020-05-12 16:20:28

根据@Homaei.的建议

我已经创建了下面的代码来从c#代码中导出公钥。

代码语言:javascript
复制
                var modulus = GetKeyAttributeValue(session, publicKey, CKA.CKA_MODULUS);
                var exponent = GetKeyAttributeValue(session, publicKey, CKA.CKA_PUBLIC_EXPONENT);

                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(dwKeySize: 2048);
                RSAParameters rsaParam = rsa.ExportParameters(false);
                rsaParam.Modulus = modulus;
                rsaParam.Exponent = exponent;
                rsa.ImportParameters(rsaParam);

                var writer = System.IO.File.CreateText("exportedFromCode.txt");

                //https://stackoverflow.com/questions/28406888/c-sharp-rsa-public-key-output-not-correct/28407693#28407693
                ExportPublicKey(rsa, writer);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61500862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档