MbedTLS:mbedtls_rsa_rsaes_oaep_encrypt/decrypt 支持就地加密/解密吗? (应该可以,但是好像没用?)

问题描述 投票:0回答:1

在 C 程序中使用 RSA 进行加密/解密的 MbedTls 在使用单独的缓冲区时有效(对于纯文本、密文和解密文本,即纯文本和解密文本的内容相同),但在仅使用一个缓冲区执行 in- 时则不起作用。当我得到乱码/未正确加密的数据时进行加密/解密。
这只是一般限制还是我的代码错误?

背景:
我正在尝试在 C 程序的 MbedTls 中使用 RSA 就地加密和解密。 Here 它说“Mbed TLS 中允许使用就地密码,除非另有说明。”,尽管我不确定他们是否也在谈论 AES。根据我的理解,我没有在 Mbed TLS API 文档中看到任何针对 mbedtls_rsa_rsaes_oaep_decrypt 的规范(应该有效)。

代码:

size_t sizeDecrypted;
unsigned char plainText[15000] = "yxcvbnm";
unsigned char cipherText[15000];
unsigned char decryptedText[15000];

rtn = mbedtls_rsa_rsaes_oaep_encrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, NULL, 0, sizeof("yxcvbnm"), &plainText,  &cipherText);
rtn = mbedtls_rsa_rsaes_oaep_decrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, NULL, 0, &sizeDecrypted, &cipherText,  &decryptedText, 15000);
//decryptedText afterwards contains the correctly decrypted text just like plainText
//sizeDecrypted is 8 (because of the binary zero at the end of the string)

unsigned char text[15000] = "yxcvbnm";
rtn = mbedtls_rsa_rsaes_oaep_encrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, NULL, 0, sizeof("yxcvbnm"), &text,  &text);
rtn = mbedtls_rsa_rsaes_oaep_decrypt(&rsa, mbedtls_ctr_drbg_random, &ctr_drbg, NULL, 0, &sizeDecrypted, &text,  &text, 15000);
//someText afterwards doesn't contain the correctly decrypted text/has a different content than plainText
//rtn is always 0, i.e. no error is returned
//sizeDecrypted is 8
c cryptography embedded rsa mbedtls
1个回答
0
投票

不,这不会起作用。

从存储库

https://github.com/Mbed-TLS/mbedtls 我们查看 library/rsa.c

 来获取 
mbedtls_rsa_rsaes_oaep_encrypt
 的正文:

int mbedtls_rsa_rsaes_oaep_encrypt(mbedtls_rsa_context *ctx, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng, const unsigned char *label, size_t label_len, size_t ilen, const unsigned char *input, unsigned char *output) { size_t olen; int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; unsigned char *p = output; unsigned int hlen; if (f_rng == NULL) { return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; } hlen = mbedtls_md_get_size_from_type((mbedtls_md_type_t) ctx->hash_id); if (hlen == 0) { return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; } olen = ctx->len; /* first comparison checks for overflow */ if (ilen + 2 * hlen + 2 < ilen || olen < ilen + 2 * hlen + 2) { return MBEDTLS_ERR_RSA_BAD_INPUT_DATA; } memset(output, 0, olen); *p++ = 0; /* Generate a random octet string seed */ if ((ret = f_rng(p_rng, p, hlen)) != 0) { return MBEDTLS_ERROR_ADD(MBEDTLS_ERR_RSA_RNG_FAILED, ret); } p += hlen; /* Construct DB */ ret = compute_hash((mbedtls_md_type_t) ctx->hash_id, label, label_len, p); if (ret != 0) { return ret; } p += hlen; p += olen - 2 * hlen - 2 - ilen; *p++ = 1; if (ilen != 0) { memcpy(p, input, ilen); } /* maskedDB: Apply dbMask to DB */ if ((ret = mgf_mask(output + hlen + 1, olen - hlen - 1, output + 1, hlen, (mbedtls_md_type_t) ctx->hash_id)) != 0) { return ret; } /* maskedSeed: Apply seedMask to seed */ if ((ret = mgf_mask(output + 1, hlen, output + hlen + 1, olen - hlen - 1, (mbedtls_md_type_t) ctx->hash_id)) != 0) { return ret; } return mbedtls_rsa_public(ctx, output, output); }
注意以下事项:

经过一些初步的完整性检查后,我们:

memset(output, 0, olen);
如果

output == input

,这会在
检查输入缓冲区之前破坏输入缓冲区(或其一部分)。 因此,缓冲区

必须

是不同的且不重叠。

© www.soinside.com 2019 - 2024. All rights reserved.