【问题标题】:Convert code using openssl to use mbedtls使用 openssl 将代码转换为使用 mbedtls
【发布时间】:2020-01-23 01:17:05
【问题描述】:

我正在尝试将一些编写为在 Mac 上运行的 C 代码转换为没有任何加密库的嵌入式设备。 Mac 的代码使用 libcrypto。我尝试从嵌入式设备的 openssl 源构建 libcrypto,但由于函数指针原型不匹配,我收到数百个错误。 openssl 充满了巨大的宏。作为替代方案,我现在正在尝试使用 mbedtls,但我无法让解密功能正常工作。

我尝试移植的代码有点奇怪。它有所谓的公钥,实际上是调用RSA_public_encrypt(),没有填充来解密数据。作为测试,我将 Mac 代码更改为调用 RSA_public_decrypt() 并且它有效,所以我假设密钥是对称的。它使用的密钥如下所示:

"-----BEGIN PUBLIC KEY-----\n"
5 lines of Base64 strings
"-----END PUBLIC KEY-----\n"

对于 mbedtls,我使用 mbedtls_pk_parse_public_key() 来解析密钥。如果我在解析密钥后检查低级 RSA 密钥结构,则有一个 128 字节的 N 组件和一个 16 字节的 E 组件。我使用 openssl 和 mbedtls 获得了相同的密钥数据,因此看来密钥已正确解析。在 Mac 上使用RSA_public_decrypt() 解密时,输入和输出都是 128 字节。对于 mbedtls,我调用 mbedtls_pk_decrypt() 进行解密,但是当我跟踪代码时,它调用 mbedtls_rsa_rsaes_pkcs1_v15_decrypt(),这会强制填充为 11 个字节。

所以我的问题是:1)究竟什么样的“公钥”只包含 N 和 E 组件并且不使用填充; 2) 我是否调用了正确的 mbedtls 解密函数?

编辑:尝试了另一种方法,我的输出缓冲区只是被零填充。

mbedtls_rsa_context rsa;
mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0);
mbedtls_rsa_import_raw(&rsa, modulus, sizeof(modulus), NULL, 0, NULL, 0, NULL, 0, exp, sizeof(exp));
mbedtls_rsa_complete(&rsa);
mbedtls_rsa_public(&rsa, inBfr, outBfr);
mbedtls_rsa_free(&rsa);

编辑 2:我的最终目标是带有 ARM 处理器的嵌入式设备,但我正在 Windows 上进行测试以查看 mbedtls 是否可以工作。我从 VS 2010 开始,因为这是我正在从事的项目所使用的。我切换到 VS 2015,导入原始密钥数据和调用 mbedtls_rsa_public() 的第二种方法效果很好。我猜 VS 2010 编译器还不够好。然后我将代码移植到我的嵌入式设备的开发系统中,它也可以工作。

【问题讨论】:

    标签: c encryption mbedtls


    【解决方案1】:

    OpenSSL 的RSA_public_encrypt(…, RSA_NO_PADDING) 等效于mbedtls_rsa_public。函数 mbedtls_pk_encrypt 仅允许您访问基于 RSA(RSAES-PKCS1-v1_5 和 RSAES-OAEP)的加密机制,而不是原始 RSA 原语(“教科书 RSA”,又名“没有填充的 RSA”)。

    您需要调用mbedtls_pk_parse_public_key 来解析密钥,然后使用mbedtls_pk_rsa 获取指向RSA 密钥对象的指针,并使用此RSA 密钥对象调用mbedtls_rsa_public

    mbedtls_pk_context pk;
    mbedtls_pk_init(&pk);
    mbedtls_rsa_context *rsa = mbedtls_pk_rsa(&pk);
    mbedtls_rsa_public(&rsa, inBfr, outBfr);
    mbedtls_pk_free(&pk);
    

    我认为这应该可以根据您的描述进行,但显然我无法在没有样本数据的情况下对此进行测试。

    【讨论】:

    • 给你一个赞成票,因为mbedtls_rsa_public 是要使用的函数,但我能够通过更改编译器来解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2014-11-26
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多