为什么我的OpenSSL / libcrypto签名不正确
Why is my OpenSSL/libcrypto signature incorrect?
我需要对字符串进行签名,将公钥发布为字符串,然后在其他地方使用公钥来验证签名的消息。这是对消息进行签名的部分:
// RSA keypair generation
EVP_PKEY *keypair = NULL;
EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
if (1 != EVP_PKEY_keygen_init(ctx)) {
initFail = true;
}
if (1 != EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048)) {
initFail = true;
}
if (1 != EVP_PKEY_keygen(ctx, &keypair)) {
initFail = true;
}
EVP_PKEY_CTX_free(ctx);
// Create public key string.
BIO* bo = BIO_new(BIO_s_mem());
PEM_write_bio_PUBKEY(bo, keypair);
char buff[1000];
BIO_read(bo, &buff[0], 1000);
BIO_free(bo);
pubkey = buff;
// Create signature
size_t *slen = new size_t;
unsigned char *sig = NULL;
std::string msg;
msg = stuffThatCreatesMessage();
EVP_MD_CTX *mdctx = EVP_MD_CTX_create();
if (1 != EVP_DigestSignInit(mdctx, NULL, EVP_sha256(),
NULL, keypair)) {
initFail = true;
}
if (1 != EVP_DigestSignUpdate(mdctx, msg.c_str(), msg.length())) {
initFail = true;
}
if (1 != EVP_DigestSignFinal(mdctx, NULL, slen)) {
initFail = true;
}
sig = (unsigned char *) OPENSSL_malloc(
sizeof(unsigned char) * (*slen));
if (1 != EVP_DigestSignFinal(mdctx, sig, slen)) {
initFail = true;
}
signature = *sig;
OPENSSL_free(sig);
bool isSuccess = verifySignature(signature, pubkey, msg);
下面是获取字符串消息和密钥并实际验证签名的代码:
bool verifySignature(std::string sig, std::string key_str, std::string msg) {
BIO* bo = BIO_new(BIO_s_mem());
BIO_write(bo, key_str.c_str(), key_str.length());
EVP_PKEY *key = EVP_PKEY_new();
PEM_read_bio_PUBKEY(bo, &key, 0, 0);
BIO_free(bo);
unsigned char *unsigned_sig = new unsigned char[sig.length()+1];
strcpy((char *) unsigned_sig, sig.c_str());
EVP_MD_CTX *mdctx = EVP_MD_CTX_create();
if (1 != EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, key)) {
return false;
}
if (1 != EVP_DigestVerifyUpdate(mdctx, msg.c_str(), msg.length())) {
return false;
}
bool retval = (1 == EVP_DigestVerifyFinal(mdctx, unsigned_sig,
sig.length()));
delete unsigned_sig;
return retval;
}
每次我这样做时,后一个函数都会告诉我签名无效,isSuccess
变量等于 0。这是因为EVP_DigestSignFinal
返回 0,表示签名不正确。我哪里出错了?
@jww指出的问题是行signature = *sig
。我最终只用第一个字节作为我的签名字符串。正确的方法是:
std::string temp_sig = reinterpret_cast<char*>(sig);
signature = temp_sig.substr(0, *slen);
相关文章:
- wcout不会打印正确的单引号
- 为什么代码不能返回正确的值?
- 为什么我的节点临时节点不能显示正确的数据?
- 派生类继承的 getter,找不到返回正确值的方法
- 将 void* 强制转换为多个继承类的超类不会调用正确的方法
- 带有"operator="和向量的c ++类,我不知道如何正确使用它
- 我不明白如何正确使用set_difference
- C 程序不会返回正确的阶乘值
- 模板<类型名...>与模板不匹配<typename>是缺陷吗?
- 为什么不能删除正确的节点?
- 不能和正确的方法来声明类成员 c++11 中的 int 数组数组
- C 从文件中读取FSTREAM数据不会返回正确的值.inputfile.tellg返回-1
- 如果语句内部循环不读取完全正确的代表显示错误
- vector2d数学不给我正确的结果
- 我正在尝试在字符数组的中间添加一个空格.不确定如何正确移动它
- C++ GetModule文件名不会返回正确的字符串
- 创建 CTime @ 2am 不会返回正确的值(Windows CE,C++)
- C++:将 int 转换为字符不会产生正确的值
- 写入进程内存没有错误,它不会写入正确的地址
- 正则表达式替换文件扩展名前缀放置不起作用 - 替换匹配项