TPM2上使用TSS.NET进行公钥加密

3
在.Net应用程序中,使用TPM2和Microsoft的TSS.NET库实现公钥加密是否可能?具体来说,应该在TPM中完成使用私钥进行解密的部分,因此公钥应该能够导出到其他计算机。另外,密钥应该存储在TPM2模块中。
我研究/通过了Microsoft的示例并阅读了文档,但是没有找到关于这个主题的信息,或者我不知道错过了什么。
为了将数据存储在TPM2中,我找到了nv内存,但据我所知,这是用于将外部数据存储在TPM2模块中的,但我不知道是否/如何可以将某种类型的密钥从TPM2模块内部存储在其nv内存中以便在下一次启动时再次使用。
1个回答

1

目前似乎还没有C#的示例代码,但是有一些示例C++代码可以演示您想要的内容:

void Samples::RsaEncryptDecrypt()
{
    Announce("RsaEncryptDecrypt");

    // This sample demostrates the use of the TPM for RSA operations.

    // We will make a key in the "null hierarchy".
    TPMT_PUBLIC primTempl(TPM_ALG_ID::SHA1,
                          TPMA_OBJECT::decrypt | TPMA_OBJECT::userWithAuth | TPMA_OBJECT::sensitiveDataOrigin,
                          null,  // No policy
                          TPMS_RSA_PARMS(null, TPMS_SCHEME_OAEP(TPM_ALG_ID::SHA1), 2048, 65537),
                          TPM2B_PUBLIC_KEY_RSA());

    // Create the key
    auto storagePrimary = tpm.CreatePrimary(TPM_RH_NULL, null, primTempl, null, null);

    TPM_HANDLE& keyHandle = storagePrimary.handle;

    ByteVec dataToEncrypt = TPM_HASH::FromHashOfString(TPM_ALG_ID::SHA1, "secret");
    cout << "Data to encrypt: " << dataToEncrypt << endl;

    auto enc = tpm.RSA_Encrypt(keyHandle, dataToEncrypt, TPMS_NULL_ASYM_SCHEME(), null);
    cout << "RSA-encrypted data: " << enc << endl;

    auto dec = tpm.RSA_Decrypt(keyHandle, enc, TPMS_NULL_ASYM_SCHEME(), null);
    cout << "decrypted data: " << dec << endl;
    if (dec == dataToEncrypt)
        cout << "Decryption worked" << endl;
    _ASSERT(dataToEncrypt == dec);

    // Now encrypt using TSS.C++ library functions
    ByteVec mySecret = tpm._GetRandLocal(20);
    enc = storagePrimary.outPublic.Encrypt(mySecret, null);
    dec = tpm.RSA_Decrypt(keyHandle, enc, TPMS_NULL_ASYM_SCHEME(), null);
    cout << "My           secret: " << mySecret << endl;
    cout << "My decrypted secret: " << dec << endl;
    _ASSERT(mySecret == dec);

    // Now with padding
    ByteVec pad { 1, 2, 3, 4, 5, 6, 0 };
    enc = storagePrimary.outPublic.Encrypt(mySecret, pad);
    dec = tpm.RSA_Decrypt(keyHandle, enc, TPMS_NULL_ASYM_SCHEME(), pad);
    cout << "My           secret: " << mySecret << endl;
    cout << "My decrypted secret: " << dec << endl;
    _ASSERT(mySecret == dec);

    tpm.FlushContext(keyHandle);
} // RsaEncryptDecrypt()

当然,您可能希望使用SRK或子键,而不是创建新的主键。

谢谢,这似乎是我想要的,但是我遇到了一个异常,尽管我已经将代码适配到了c#/.Net,并且使用了正确的常量和构造函数,而不是预处理宏(例如使用TpmRh.Null代替TPM_RH_NULL)。异常信息为:Tpm2Lib.TpmException: 命令CreatePrimary返回错误{Symmetric}。 详细信息: [Code=TpmRc.Symmetric],[RawCode=0x2D6,726] [ErrorEntity=Parameter], [ParmNum=2] [ParmName=inPublic] - undefined
非常感谢您的帮助。我将其上传到pastebin。这是我的当前代码。基本上只是将C++代码“翻译”成了C#,并且我使用了Authorization-Sample作为代码的“框架”。 被注释掉的参数是我在同一行中尝试过的替代当前参数的参数。 我尝试了我认为合乎逻辑的方法。 我想我可能使用了一些错误的参数,但是我无法弄清楚需要更改什么。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接