c - libtomcrypt 的 RSA 签名验证失败

标签 c openssl mbedtls libtomcrypt

我在一个项目中使用 libtomcrypt,特别是使用 RSA 对一些数据进行散列和签名。由于内存需求,我想切换到 mbedtls。但是,我在尝试使用 mbedtls 验证 libtomcrypt 生成的签名时注意到一个问题。存在填充 (PKCS#1 PSS) 解码问题。

因为我不知道这些库中的哪个(可能)有错误,所以我使用 openssl 来验证。

我使用 openssl 成功验证了使用 mbedtls 生成的签名,但在验证一个生成的表单 libtomcrypt 时验证失败,这让我认为 libtomcrypt 有一个错误。

然而,因为这可能是一个配置问题,所以我创建了一个包含最少示例的存储库,希望有人能检测到我的问题,而不是库本身的问题。

测试 repo 是 here

感谢您收到的任何帮助!

最佳答案

缺少一个重要部分,您不应该对数据签名,而应该对数据进行哈希签名。

添加这个可以解决问题:

diff --git a/test-rsa-sign-verify-libtomcrypt-openssl.c b/test-rsa-sign-verify-
libtomcrypt-openssl.c
index 758994a..25e1312 100644
--- a/test-rsa-sign-verify-libtomcrypt-openssl.c
+++ b/test-rsa-sign-verify-libtomcrypt-openssl.c
@@ -9,6 +9,7 @@
 #include "openssl/err.h"
 #include "openssl/rsa.h"

+#define ERRORe(e) printf("%d: \"%s\"\n", __LINE__, error_to_string(e));
 #define ERROR() printf("Error at line : %d\n", __LINE__);

 char *data = "This is the data which will be hashed and then signed by RSA";
@@ -57,10 +58,18 @@ int main(void)
     printf("* Random number generator registered\n");

     size_t data_length = strlen(data);
+
+    uint8_t hash[32];
+    unsigned long hash_length = sizeof(hash);
+    if ((err = hash_memory(hash_idx, data, data_length, hash, &hash_length)) != CRYPT_OK) {
+       ERRORe(err);
+       return -1;
+    }
+
     unsigned long signature_length = 256;
     unsigned char *signature = calloc(signature_length, sizeof(unsigned char));

-    err = rsa_sign_hash((const unsigned char *) data, data_length,
+    err = rsa_sign_hash((const unsigned char *) hash, hash_length,
                         signature, &signature_length,
                         NULL, prng_idx, hash_idx, 12,
                         &private_key);

关于c - libtomcrypt 的 RSA 签名验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55613950/

相关文章:

c - MBED TLS 对称 key 包装

curl - 使用 openssl 和 curl 验证服务器证书

c++ - 宏 ((void(*)())0)() 是什么意思?

c - SSL_set_connect_state 和 SSL_connect 之间的区别

c - C 中使用变量或指针访问结构体成员

c - Blowfish 加密和解密字符缓冲区

c - 如何为 xmlsec 定义加密库

ssl - STM32Cube_FW_F7 SSL 客户端 mbedTLS FATAL_ALERT

objective-c - 指向 Objective-C 函数调用中的数组的指针

c - 将名称添加到多重链接列表中