Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用openssl将代码转换为使用mbedtls_C_Encryption_Mbedtls - Fatal编程技术网

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

C 使用openssl将代码转换为使用mbedtls,c,encryption,mbedtls,C,Encryption,Mbedtls,我正在尝试将一些写在Mac上运行的C代码转换为没有任何加密库的嵌入式设备。Mac的代码使用libcrypto。我尝试从openssl源代码为嵌入式设备构建libcrypto,但由于函数指针原型不匹配,我收到了数百个错误。openssl充满了巨大的宏。作为一种替代方案,我现在尝试使用mbedtls,但我无法使解密函数工作 我尝试移植的代码有点奇怪。它有一个所谓的公钥,实际上是调用RSA_public_encrypt,不使用填充来解密数据。作为测试,我将Mac代码改为调用RSA_public_dec

我正在尝试将一些写在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\u pk\u parse\u public\u密钥来解析密钥。如果我在解析密钥后检查低级别RSA密钥结构,则有一个128字节的N组件和一个16字节的E组件。我使用openssl和mbedtls获得相同的密钥数据,因此看起来密钥解析正确。使用RSA_public_decrypt在Mac上解密时,输入和输出均为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是否可以工作。我从VS2010开始,因为这正是我正在从事的项目所使用的。我切换到VS 2015,导入原始密钥数据并调用mbedtls_rsa_public的第二种方法非常有效。我想VS2010编译器还不够好。然后,我将代码移植到我的嵌入式设备的开发系统中,它也起了作用。

与OpenSSL的功能相当。函数mbedtls_pk_encrypt仅允许您访问基于RSA RSAES-PKCS1-v1_5和RSAES-OAEP的加密机制,而不是原始RSA原语“教科书RSA”a.k.a.“无填充的RSA”

您需要调用mbedtls_pk_parse_public_key来解析密钥,然后使用获取指向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);
我认为根据您的描述应该可以做到这一点,但显然,如果没有样本数据,我无法对其进行测试。

给了您一个投票权,因为mbedtls\u rsa\u public是要使用的函数,但我可以通过更改编译器来解决我的问题。