【问题标题】:RSA_sign and RSA_verify varied behaviorRSA_sign 和 RSA_verify 不同的行为
【发布时间】:2016-07-26 09:21:28
【问题描述】:

我有一个 C 语言示例签名生成器,它将创建一个哈希消息 <count:mac-addr> 并生成一个签名。

当我使用char *message = "120:08:00:27:7c:b6:18"; 并签名,签名验证成功。

但是当我使用

char * generate_hash()
{
    xmlDoc         *document;
    xmlNode        *root, *first_child, *node;
    char           *filename;
    char            *ap_count;
    char            *ap_mac_address;
    char            *message;

    filename = "/license.xml";

    document = xmlReadFile(filename, NULL, 0);
    root = xmlDocGetRootElement(document);
    first_child = root->children;
    for (node = first_child; node; node = node->next) {
        if ( strcmp((char*)node->name, "ap_count") == 0 ) {
            ap_count = (char*)xmlNodeGetContent(node);
        }
        if ( strcmp((char*)node->name, "ap_mac_address") == 0 ){
            ap_mac_address = (char*)xmlNodeGetContent(node);
        }
    }
    message = (char *) malloc(strlen(ap_count)+ strlen(ap_mac_address) +1 );
    memset(message,0x0,(1 + strlen(ap_count)+ strlen(ap_mac_address)));
    strcpy(message,ap_count);
    strcat(message,":");
    strcat(message,ap_mac_address);
    printf(" %d \n", (1 + strlen(ap_count)+ strlen(ap_mac_address)));
    return message;
}

--- 验证时,

char* message;
message = generate_hash();

我在这两种情况下都使用下面的函数调用来生成签名。

if(RSA_sign(NID_sha256, (unsigned char*) message, strlen(message),
signature, &slen, private_key) != 1) {
    ERR_print_errors_fp(stdout);
    return 1;
}

上述过程导致签名验证失败。不知道我在这里做错了什么。

下面是我用来验证的电话。

verified = RSA_verify(NID_sha256, (unsigned char*) message,
        strlen(message), sign, file_len, public_key);

【问题讨论】:

    标签: c++ openssl rsa digital-signature


    【解决方案1】:
    verified = RSA_verify(NID_sha256, (unsigned char*) message,
            strlen(message), sign, file_len, public_key);
    

    签名可以有一个嵌入的 NULL。不要把它当作字符串数据,不要在上面使用strlen

    你必须管理一个指针和一个明确的长度。

    【讨论】:

      【解决方案2】:

      RSA_verify 的描述如下:

      RSA_verify() 验证大小为 siglen 的签名 sigbuf 匹配 给定的消息摘要 m,大小为 m_len。 type 表示消息 用于生成签名的摘要算法。 rsa 是 签名者的公钥。

      因此,对原始消息使用 RSA_verify 是不正确的:应该改用消息摘要。

      【讨论】:

        猜你喜欢
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 2021-03-09
        • 2016-05-19
        • 2011-10-18
        • 2012-02-04
        • 2018-03-12
        相关资源
        最近更新 更多