我正在尝试将编写用于在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编译器还不够好。然后,我将代码移植到我的嵌入式设备的开发系统中,并且也可以正常工作。
答案 0 :(得分:3)
相当于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);
我认为这应该符合您的描述,但是显然如果没有示例数据,我将无法对此进行测试。