我在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);
答案 0 :(得分:2)
verified = RSA_verify(NID_sha256, (unsigned char*) message,
strlen(message), sign, file_len, public_key);
签名可以嵌入NULL。不要将其视为字符串数据,也不要在其上使用strlen
。
您必须管理指针和显式长度。
答案 1 :(得分:0)
RSA_verify的说明如下:
RSA_verify()验证大小为siglen的签名sigbuf是否匹配 大小为m_len的给定消息摘要m。类型表示消息 用于生成签名的摘要算法。 rsa是 签名者的公钥。
因此,对原始消息使用RSA_verify是不正确的:应该使用消息摘要。