使用 openssl 将代码转换为使用 mbedtls

标签 c encryption mbedtls

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

我尝试移植的代码有点奇怪。它具有所谓的公钥,并且实际上是在不带任何填充的情况下调用 RSA_public_encrypt() 来解密数据。作为测试,我更改了 Mac 代码以调用 RSA_public_decrypt() 并且它有效,因此我假设 key 是对称的。它使用的 key 如下所示:

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

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

所以我的问题是:1)到底什么样的“公共(public)” key 仅包含 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 2010。我切换到 VS 2015,导入原始 key 数据并调用 mbedtls_rsa_public() 的第二种方法效果非常好。我猜 VS 2010 编译器还不够好。然后,我将代码移植到我的嵌入式设备的开发系统中,它也起作用了。

最佳答案

相当于 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来解析 key ,然后使用 mbedtls_pk_rsa 获取指向 RSA key 对象的指针,并使用此 RSA key 对象调用 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);

我认为这应该可以根据您的描述进行,但显然如果没有示例数据我无法测试它。

关于使用 openssl 将代码转换为使用 mbedtls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58054474/

相关文章:

c - int 数组在末尾显示一个奇数

c - 如何将多维 C 数组传递给函数?

c - 如何用C从字符串中删除前三个字符?

bash - 使用 bash 将文件存储在 RAM 中 - 可能吗?

encryption - 就速度和安全性而言,iPhone 的最佳加密算法是什么?

ssl - wolfSSL vs. MBEDTLS vs. OpenSSL - 有什么区别?

将小数点后的值转换为较小的精度

java - 使用签名不匹配解密 hyperlocal (Google RTB)

ssl - 指定 Arduino WiFiClientSecure 证书

go - 如何在golang中使用N=和E=解析公钥?