2

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

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

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

对于我mbedtls_pk_parse_public_key()用来解析密钥的 mbedtls。如果我在解析密钥后检查低级 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 编译器还不够好。然后我将代码移植到我的嵌入式设备的开发系统中,它也可以工作。

4

1 回答 1

4

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以解析密钥,然后使用 获取指向 RSA 密钥对象的指针mbedtls_pk_rsa,并mbedtls_rsa_public使用此 RSA 密钥对象进行调用。

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);

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

于 2019-09-24T21:12:43.917 回答